共計 5185 個字符,預計需要花費 13 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章主要介紹 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 中的常用基礎對象有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!
向 AI 問一下細節