這篇文章主要介紹redis中的常用基礎對象有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
一:前言
redis中有幾種常用的基礎對象,如string、hash、list、set、zset等,下面我們就來介紹下他們的底層實現數據結構與常見應用場景和特點。
二:redisobject
源碼位置位于server.h文件中605行開始
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj;
2.1 type
redis中實際的對象類型,分為5種0-4聲明。位于文件server.h中466行
#define OBJ_STRING 0 /* String object. */ #define OBJ_LIST 1 /* List object. */ #define OBJ_SET 2 /* Set object. */ #define OBJ_ZSET 3 /* Sorted set object. */ #define OBJ_HASH 4 /* Hash object. */
2.2 encoding
redis五種對象string、list、hash、set、zset會用到的八種編碼格式,每一種編碼都對應一個數據結構
#define OBJ_ENCODING_RAW 0 #define OBJ_ENCODING_INT 1 #define OBJ_ENCODING_HT 2 #define OBJ_ENCODING_ZIPLIST 5 #define OBJ_ENCODING_INTSET 6 #define OBJ_ENCODING_SKIPLIST 7 #define OBJ_ENCODING_EMBSTR 8 #define OBJ_ENCODING_QUICKLIST 9
2.3 refcount
redis中內存的回收采用了比較簡單的引用計數法進行,每個對象引用就refcount + 1,當這個引用計數減少為0時內存就會被回收
三:string
3.1 常用場景
分布式鎖:分布式鎖的實現基礎就是采用string的命令setnx用戶信息:很多時候用戶信息都會序列化后存到redis中緩存,但是這里可以考慮下hash。如果僅僅使用用戶數據部分信息,畢竟序列化與反序列化也是一筆開銷
3.2 編碼格式
int:當字符串中全是數字時會采用int編碼,這是真正的二進制數據存儲embstr:內存地址連續,內存一次申請。字符串長度小于44raw:底層采用sds實現,相對于embstr差別在于sds的創建與redisobject的創建分兩次實現
3.3 常用命令
# 存儲 set key value # 互斥存儲 # 已存在的key再次存入數據不會更改緩存 setnx key value # 過期存儲,單位秒 # 設定key過期時間,到期自動刪除 setex key seconds value # 過期存儲,單位毫秒 psetex key milliseconds value # 批量存儲 mset key value [key value ...] # 取值 get key # 批量取值 mget key [key ...] # 追加 append key value # 長度 strlen key # 自增,只能是int編碼的字符串 incr key # 自定義步長自增 incrby key increment # 自減,只能是int編碼的字符串 # 這個可以減到負數,秒殺扣減庫存啥的想想能不能用這個命令 decr key # 自定義步長自減 decrby key increment
四:list
4.1 常用場景
消息隊列:一般不怎么用,畢竟各種MQ、Kafka都已經很成熟了。而且redis實現消息隊列并不保證數據的安全排行榜計算:這種僅僅適用于定時計算更新,不能用于實時更新排行。比如美團每天計算區域入駐商家排行點贊列表:比如微信中的點贊(不知道咋做的,猜一下)
4.2 編碼格式
quicklist:快速列表,之前版本有使用linkedlist和ziplist。目前使用的quicklist為兩者結合體,詳情可以查看Redis(一) -- 淺談Redis中的數據結構
4.3 相關參數配置
配置參數位置位于redis.con文件中1083行和1099行
list-max-ziplist-size:配置單個ziplist大小list-compress-depth:配置LZF壓縮算法開始節點
4.4 常用命令
# 創建list并壓入節點 # 壓入節點位于鏈表頭 lpush key value # 壓入節點位于鏈表尾 rpush key value # 彈出list頭節點 lpop key # 彈出list尾節點 rpop key # 刪除節點 # count > 0 從左開始搜索刪除count數量的value # count < 0 從右開始搜索刪除|count|數量的value # count = 0 刪除list中所有value lrem key count value # 范圍保留 # -1 表示列表最后一個元素 # -2 表示倒數第二個,以此類推 ltrim key start stop # 計算長度 llen key # 索引查詢節點 # index < 0 從右開始搜索 # index > 0 從左開始搜索 lindex key index # 范圍查詢 # stop = -1 表示所有 lrange key start stop # 阻塞彈出 # 隊列中沒有節點時會一直等待 # 多個key時表示挨著順序依次檢查,知道找到非空列表為止 # timeout可以設置等待時間,0表示一直等待 blpop key [key...] timeout brpop key [key...] timeout
五:Hash
5.1 常用場景
商品對象、用戶對象。這個場景需要驗證性對待,如果商品對象、用戶對象信息每次都需要全量的話不妨存string,但是僅僅部分使用就可以考慮使用hash結構SKU等信息,這個場景下hash就比較合適了。一個hash結構中存儲某個商品所有sku
5.2 編碼格式
ziplist:使用ziplist存儲hash結構時一個數據會使用相鄰兩個ziplistEntry存儲field和valuehashtable:當數據存儲超過參數限制后就會將其底層結構由ziplist轉換為dict進行存儲
5.3 相關參數配置
hash-max-ziplist-entries:默認512,即ziplist節點為1024。當節點數量超過該值限制后底層數據結構轉為dicthash-max-ziplist-value:默認64,當hash中插入任意一個長度超過該限制的value后底層數據結構轉換為dict
5.4 常用命令
# 存儲 hset key field value # 不允許更改存儲 # 若field值存在則本次存儲不會覆蓋原有value值 hsetnx key field value # 批量存儲 hmset key field value [field value ...] # 查詢 hget key field # 批量查詢 hmget key field [field ...] # 全量查詢 hgetall key # 全量查詢field值 hkeys key # 全量查詢value值 hvals key # 刪除field hdel key field [field ...] # 計算鍵值對數量 hlen key # field存在判斷 hexists key field # 增量式迭代 # cursor表示迭代開始的游標 # count 表示迭代返回數據數量 # pattern 表示正則匹配結果限制 hscan key cursor [Count count] [Match pattern]
六:Set
6.1 常用場景
推薦:通過sinter命令計算交集,比如美團給你推薦附近外賣時就可以根據你的外賣記錄與附近商家計算交集推送安全提示:微信群成員保存在一個set中,用戶好友也保存在set中。當用戶加入群聊時可以提醒非好友用戶注意安全
6.2 編碼格式
intset:整數集合,用于存儲set集合中所有value都是整數的數據hashtable:field用于存儲set集合值
6.3 相關參數配置
set-max-inset-entries:默認512,表示當元素數量超過限定以后轉換為hashtable編碼
6.4 常用命令
# 存儲 sadd member [member ...] # 彈出元素并返回 spop key count # 查詢所有元素 smembers key [count] # 計算元素數量 scard key # 刪除指定元素 srem key member [member ...] # 判斷元素存在 sismember key member # 計算給定集合與后續集合差集 # 返回計算結果 sdiff key [key ...] # 計算給定集合與后續集合差集 # 存儲結果到destination并返回 sdiffstore destination key [key ...] # 計算給定集合與后續集合交集 # 返回計算結果 sinter key [key ...] # 計算給定集合與后續集合差集 # 存儲結果到destination并返回 sinterstore destination key [key ...] # 計算給定集合與后續集合差集 # 返回計算結果 sunion key [key ...] # 計算給定集合與后續集合差集 # 存儲結果到destination并返回 sunionstore destination key [key ...]
七:Zset
7.1 常用場景
排行榜:美團要做一個銷量排行榜,就可以使用店家的訂單做score,這個查詢出來的結果就是有序的權重隊列:score作為優先級,這樣取出來的數據權重都是最大優先執行的延時任務:score作為任務啟動執行時間,取值時判斷該值執行即可
7.2 編碼格式
ziplist:與hash有異曲同工之妙,都是使用相鄰兩個節點存儲score和memberskiplist:跳躍表結構,可以查看Redis(一) -- 淺談Redis中的數據結構
7.3 相關參數配置
zset-max-ziplist-entries:默認值128,指定ziplist存儲元素最多128個。超過轉換為skiplistzset-max-ziplist-value:默認值64,存儲數據值最大64字節,超過轉換為skiplist
7.4 常用命令
# 存儲 # xx 表示當zset中存在本次插入的member時才存儲 # nx 表示當zset中不存在本次插入的member時才存儲 zadd key [nx|xx] score member [score member ...] # 查詢排序指定[start,stop]范圍內元素 # withscores 查詢結果順帶返回元素分數 zrange key start stop [withscores] # 查詢指定元素分數 zscore key member # 元素數量統計 zcard key # 返回score位于[min,max]區間的元素數量 zcount key min max # 對指定元素分數增加incrment值 zincrby key incrment member # 返回指定分數區間范圍內元素 # withscores 返回時攜帶分數一起返回 # limit offset count表示跳過offset數量結果再返回count數量結果 zrangebyscore key min max [withscores] [limit offset count] # 倒序返回指定分數區間范圍內元素 # withscores 返回時攜帶分數一起返回 # limit offset count表示跳過offset數量結果再返回count數量結果 zrevrangebyscore key max min [withrescores] [limit offset count] # 刪除指定分數范圍[min,max]內元素 zremrangebyscore key min max # 移除指定元素 zrem key member
以上是“redis中的常用基礎對象有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。