一:前言
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
#(學習影片分享:redis影片教學)
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資料庫教學
以上是redis中的幾種常用基礎物件介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!