236_Redis_數據類型_String_hash_List

      網友投稿 687 2022-05-29

      Redis數據類型

      String 字符類型

      Hash?字典類型

      List?列表

      Set?集合

      Zsort有序集合

      1 String類型 類似ArrayList 動態字符串

      內部結構為字符數組, 常見用途就是緩存用戶信息, 將用戶信息結構體使用JSON序列化成字符串,再存入Redis充當緩存, 獲取用戶信息有一次反序列化過程

      String的數據結構為簡單動態字符串(Simple Dynamic String,縮寫SDS)。是可以修改的字符串

      內部結構實現上類似于Java的ArrayList,采用預分配冗余空間的方式來減少內存的頻繁分配

      內部為當前字符串實際分配的空間capacity一般要高于實際字符串長度len。當字符串長度小于1M時,擴容都是加倍現有的空間,

      如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度為512M

      1.1? 應用場景

      session 共享

      常規計數:微博數,粉絲數,訂閱、禮物, 傳統對象緩存等

      1.2 常用功能1 ?鍵值對 set、get、del、append、strlen

      127.0.0.1:6379> set name1 alex # 設置值 OK 127.0.0.1:6379> get name1 # 獲得key "value1" 127.0.0.1:6379> del name1 # 刪除key (integer) 1 127.0.0.1:6379> exists name1 # 確保 key1 不存在 (integer) 0 127.0.0.1:6379> append name3 "hello" # 對不存在的 key 進行 APPEND ,等同于 SET key1 "hello" (integer) 5 # 字符長度 127.0.0.1:6379> get name2 "sully" 127.0.0.1:6379> APPEND name2 -003 # 對已存在的字符串進行 APPEND (integer) 9 127.0.0.1:6379> get name2 "sully-003" 127.0.0.1:6379> STRLEN name2 # 獲取字符串的長度 (integer) 9

      1.3 常用功能2 批量設置

      # mset mget # msetnx 當所有 key 都成功設置,返回 1 127.0.0.1:6379> mset k1 v2 k2 v2 k3 v3 OK 127.0.0.1:6379> mget k1 k2 k3 1) "v2" 2) "v2" 3) "v3" 127.0.0.1:6379> MSETNX k1 v11 k10 v10 (integer) 0 127.0.0.1:6379> get v10 (nil)

      1.4 常用功能3 計數

      # incr、decr 一定要是數字才能進行加減,+1 和 -1。 # incrby、decrby 命令將 key 中儲存的數字加上指定的增量值 127.0.0.1:6379> set views 0 # 設置瀏覽量為0 OK 127.0.0.1:6379> incr views # 瀏覽 + 1 (integer) 1 127.0.0.1:6379> incr views # 瀏覽 + 1 (integer) 2 127.0.0.1:6379> decr views # 瀏覽 - 1 (integer) 1 127.0.0.1:6379> incrby views 10 # +10 (integer) 11 127.0.0.1:6379> decrby views 10 # -10 (integer) 1

      1.5常用功能4 設定過期時間&判斷是否存在

      # setex(set with expire)鍵秒值 # setnx(set if not exist) 127.0.0.1:6379> setex key3 60 expire # 設置過期時間 OK 127.0.0.1:6379> ttl key3 # 查看剩余的時間 (integer) 55 127.0.0.1:6379> setnx mykey "redis" # 如果不存在就設置,成功返回1 (integer) 1 127.0.0.1:6379> setnx mykey "mongodb" # 如果存在就設置,失敗返回0 (integer) 0 127.0.0.1:6379> get mykey "redis"

      1.6 ?常用功能5 range范圍

      # getrange 獲取指定區間范圍內的值,類似between...and的關系,從零到負一表示全部 # setrange 設置指定區間范圍內的值,格式是setrange key值具體值 127.0.0.1:6379> GETRANGE name2 0 -1 "sully&003" 127.0.0.1:6379> SETRANGE name2 5 & (integer) 9 127.0.0.1:6379> get name2 "sully&003"

      1.7 ?常用6 ?傳統對象緩存

      set user:1 value(json數據) # 可以用來緩存對象 127.0.0.1:6379> MSET user1:name alex user1:age 35 OK 127.0.0.1:6379> mget user1:name user1:age 1) "alex" 2) "35"

      2??hash類型(字典類型) kv模式不變,但V是一個鍵值對(MAP)

      Hash類型對應的數據結構是兩種:ziplist(壓縮列表),hashtable(哈希表)。當field-value長度較短且個數較少時,使用ziplist,否則使用hashtable

      Hash 類型相當于 java的hashmap? (數組 + 鏈表的二維結構)

      Redis hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象

      通過 key(用戶ID) + field(屬性標簽) 就可以操作對應屬性數據了,既不需要重復存儲數據,也不會帶來序列化和并發修改控制的問題

      236_Redis_數據類型_String_hash_List

      應用場景:

      存儲部分變更的數據,如用戶信息等。最接近mysql表結構的一種類型,可以做數據庫緩存

      2.1?常用操作1 增刪改

      # hset、hget 命令用于為哈希表中的字段賦值 。 # hmset、hmget 同時將多個field-value對設置到哈希表中,會覆蓋哈希表中已存在的字段。 # hgetall 用于返回哈希表中,所有的字段和值。 # hdel 用于刪除哈希表 key 中的一個或多個指定字段 # hincrby 為哈希表中的字段值加上指定增量值。 # hsetnx 為哈希表中不存在的的字段賦值,不存在則成功寫入,存在返回false 0 # hmset、hmget 同時將多個field-value對設置到哈希表中 127.0.0.1:6379> HMSET user2 name bob age 40 children 3 cars 2 OK 127.0.0.1:6379> HMGET user2 name age 1) "bob" 2) "40" # hdel 用于刪除哈希表 key 中的一個或多個指定字段 127.0.0.1:6379> HDEL user2 cars (integer) 1 127.0.0.1:6379> HKEYS user2 1) "name" 2) "age" 3) "childrens" 4) "children" # hincrby 為哈希表中的字段值加上指定增量值。 127.0.0.1:6379> HINCRBY user2 age 5 (integer) 45 127.0.0.1:6379> HGET user2 age "45" # hsetnx 為哈希表中不存在的的字段賦值,不存在則成功寫入,存在返回false 0 127.0.0.1:6379> HSETNX user2 cars 20 (integer) 1 127.0.0.1:6379> HSETNX user2 age 39 (integer) 0

      2.2?常用操作2 查

      # hlen 獲取哈希表中字段的數量 # hexists 查看哈希表的指定字段是否存在 # hkeys 獲取哈希表中的所有域(field)。 # hvals 返回哈希表所有域(field)的值。 127.0.0.1:6379> hset user1 name alex age 35 (integer) 2 127.0.0.1:6379> HGET user1 name "alex" 127.0.0.1:6379> HLEN user1 (integer) 2 127.0.0.1:6379> HKEYS user1 1) "name" 2) "age" 127.0.0.1:6379> HVALS user1 1) "alex" 2) "35" 127.0.0.1:6379> HEXISTS user1 high #查詢某個key/字段 0 代表false (integer) 0 127.0.0.1:6379> HEXISTS user1 name (integer) 1

      2.3 常用操作3 # hash特別適合用于存儲對象。存儲部分變更的數據,如用戶信息等, String更適合字符串

      select concat("hmset city_",id," id ",id," name ",name) from world.city limit 10 into outfile '/data/backup/hmset.txt' mysql ---> cannal ---> redis

      3? 列表List 所有命令都是l開頭 不區分大小寫

      List 相當于 Java里的 LinkedList ,底層其實是 quicklist結構, 改結構是ziplist 壓縮列表,所有的元素壓縮在一起,分配連續內存存儲,當數據量變大時候才會變成 quicklist,

      Redis將鏈表和ziplist結合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用, 這樣既滿足了快速的插入刪除性能,又不會出現太大的空間冗余

      應用場景

      消息隊列(左進右出), 棧結構(右進右出)

      比如sina微博 微信朋友圈 最新的微博和朋友圈在Redis且一直更新 在一定范圍內都是訪問Redis,超出范圍(start/count)后 才訪問數據庫, SQL數據庫(或是硬盤上的其他類型數據庫)只是在用戶需要獲取“很遠”的數據時才會被觸發

      3.1 常用命令1 增刪

      # Lpush:將一個或多個值插入到列表頭部。(左) # rpush:將一個或多個值插入到列表尾部。(右) # lrange:返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 # 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 # 也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。 # lpop 命令用于移除并返回列表的第一個元素。當列表 key 不存在時,返回 nil # rpop 移除列表的最后一個元素,返回值為移除的元素 # 右進左出 –模擬隊列(先進先出) 127.0.0.1:6379> rpush list2 k1 k2 k3 k4 k5 #新加入的值在隊列的尾部/ 往右邊加入 (integer) 5 127.0.0.1:6379> LLEN list2 (integer) 5 127.0.0.1:6379> LPOP list2 # 左邊彈出, 彈出的是K1 "k1" # 右進右出 –模擬棧(先進后出) 127.0.0.1:6379> RPUSH list3 k1 k2 k3 k4 (integer) 4 127.0.0.1:6379> LLEN list3 (integer) 4 127.0.0.1:6379> RPOP list3 "k4"

      3.2常規操作2 查 lindex相當于 鏈表的 get(int index) 方法, 需要遍歷鏈表, 性能隨著index增大而增大

      # Lindex,按照索引下標獲得元素(-1代表最后一個,0代表是第一個) # llen 用于返回列表的長度 127.0.0.1:6379> LRANGE list3 0 -1 1) "k1" 2) "k2" 3) "k3" 127.0.0.1:6379> LINDEX list3 1 "k2" 127.0.0.1:6379>

      3.3 常規操作3改

      # ltrim 類似截取保留, 參數 start_index , end_index 區間內保留,其余都砍掉 # lrem key 根據參數 COUNT 的值,移除列表中與參數 VALUE 相等的元素 # lset key index value 將列表 key 下標為 index 的元素的值設置為 value # linsert key before/after pivot value 用于在列表的元素前或者后插入元素 # rpoplpush 列表右邊吐出一個值,插到列表左邊。 127.0.0.1:6379> LTRIM list3 1 -1 OK 127.0.0.1:6379> LRANGE list3 0 -1 1) "k2" 2) "k3" lrem key 根據參數 COUNT 的值,移除列表中與參數 VALUE 相等的元素 127.0.0.1:6379> LPUSH list2 k2 k2 k2 (integer) 6 127.0.0.1:6379> LRANGE list2 0 -1 1) "k2" 2) "k2" 3) "k2" 4) "k2" 5) "k3" 6) "k5" 127.0.0.1:6379> LREM list2 2 k2 (integer) 2 127.0.0.1:6379> LRANGE list2 0 -1 1) "k2" 2) "k2" 3) "k3" 4) "k5" # lset key index value 將列表 key 下標為 index 的元素的值設置為 value 127.0.0.1:6379> LSET list2 1 k22 127.0.0.1:6379> LRANGE list2 0 1 1) "k2" 2) "k22" # linsert key before/after pivot value 用于在列表的元素前或者后插入元素 127.0.0.1:6379> LINSERT list2 before k22 k21 (integer) 5 127.0.0.1:6379> LRANGE list2 0 2 1) "k2" 2) "k21" 3) "k22"

      Redis 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:SVN 客戶端基本用法
      下一篇:華為宣布啟動數據基礎設施戰略并開源數據虛擬化引擎HetuEngine
      相關文章
      国产成人综合久久精品亚洲| 亚洲熟女乱色一区二区三区| 亚洲Aⅴ在线无码播放毛片一线天| 亚洲日韩中文字幕天堂不卡| 亚洲AV乱码久久精品蜜桃| 亚洲精品无码久久毛片| 丰满亚洲大尺度无码无码专线 | 国产AV无码专区亚洲精品| 久久亚洲精品无码播放| 伊人久久大香线蕉亚洲| 亚洲综合日韩久久成人AV| 亚洲小说区图片区另类春色| 久久久久亚洲?V成人无码| 夜夜春亚洲嫩草影院| 亚洲人成人无码网www电影首页| 亚洲精品无码不卡在线播放HE| 伊人久久亚洲综合| 国产aⅴ无码专区亚洲av麻豆| 亚洲日韩v无码中文字幕| 亚洲日韩精品一区二区三区无码| 亚洲深深色噜噜狠狠爱网站| 国产亚洲精AA在线观看SEE| 亚洲国产精品无码久久一线| 久久亚洲精品中文字幕无码 | 国产精品亚洲五月天高清| 亚洲国产精品自在拍在线播放| 亚洲一区二区精品视频| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲国产精品一区二区久久hs| 午夜亚洲国产理论秋霞| 亚洲精品亚洲人成在线观看麻豆| 亚洲国产视频网站| 亚洲最大的成人网| 国产精品自拍亚洲| 亚洲午夜福利精品久久 | 国产成人综合亚洲亚洲国产第一页 | 亚洲最新黄色网址| 亚洲一线产品二线产品| 春暖花开亚洲性无区一区二区| 亚洲国产成人久久一区WWW| 亚洲五月综合缴情在线观看|