溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

redis中的常用基礎(chǔ)對象有哪些

發(fā)布時間:2021-02-20 09:58:59 來源:億速云 閱讀:158 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要介紹redis中的常用基礎(chǔ)對象有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

一:前言

redis中有幾種常用的基礎(chǔ)對象,如string、hash、list、set、zset等,下面我們就來介紹下他們的底層實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)與常見應(yīng)用場景和特點(diǎn)。

二: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中實(shí)際的對象類型,分為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會用到的八種編碼格式,每一種編碼都對應(yīng)一個數(shù)據(jù)結(jié)構(gòu)

#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中內(nèi)存的回收采用了比較簡單的引用計(jì)數(shù)法進(jìn)行,每個對象引用就refcount + 1,當(dāng)這個引用計(jì)數(shù)減少為0時內(nèi)存就會被回收

三:string

3.1 常用場景

分布式鎖:分布式鎖的實(shí)現(xiàn)基礎(chǔ)就是采用string的命令setnx用戶信息:很多時候用戶信息都會序列化后存到redis中緩存,但是這里可以考慮下hash。如果僅僅使用用戶數(shù)據(jù)部分信息,畢竟序列化與反序列化也是一筆開銷

3.2 編碼格式

int:當(dāng)字符串中全是數(shù)字時會采用int編碼,這是真正的二進(jìn)制數(shù)據(jù)存儲embstr:內(nèi)存地址連續(xù),內(nèi)存一次申請。字符串長度小于44raw:底層采用sds實(shí)現(xiàn),相對于embstr差別在于sds的創(chuàng)建與redisobject的創(chuàng)建分兩次實(shí)現(xiàn)

3.3 常用命令

# 存儲
set key value

# 互斥存儲
# 已存在的key再次存入數(shù)據(jù)不會更改緩存
setnx key value

# 過期存儲,單位秒
# 設(shè)定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編碼的字符串
# 這個可以減到負(fù)數(shù),秒殺扣減庫存啥的想想能不能用這個命令
decr key

# 自定義步長自減
decrby key increment

四:list

4.1 常用場景

消息隊(duì)列:一般不怎么用,畢竟各種MQ、Kafka都已經(jīng)很成熟了。而且redis實(shí)現(xiàn)消息隊(duì)列并不保證數(shù)據(jù)的安全排行榜計(jì)算:這種僅僅適用于定時計(jì)算更新,不能用于實(shí)時更新排行。比如美團(tuán)每天計(jì)算區(qū)域入駐商家排行點(diǎn)贊列表:比如微信中的點(diǎn)贊(不知道咋做的,猜一下)

4.2 編碼格式

quicklist:快速列表,之前版本有使用linkedlist和ziplist。目前使用的quicklist為兩者結(jié)合體,詳情可以查看Redis(一) -- 淺談Redis中的數(shù)據(jù)結(jié)構(gòu)

4.3 相關(guān)參數(shù)配置

配置參數(shù)位置位于redis.con文件中1083行和1099行

list-max-ziplist-size:配置單個ziplist大小list-compress-depth:配置LZF壓縮算法開始節(jié)點(diǎn)

4.4 常用命令

# 創(chuàng)建list并壓入節(jié)點(diǎn)
# 壓入節(jié)點(diǎn)位于鏈表頭
lpush key value

# 壓入節(jié)點(diǎn)位于鏈表尾
rpush key value

# 彈出list頭節(jié)點(diǎn)
lpop key

# 彈出list尾節(jié)點(diǎn)
rpop key

# 刪除節(jié)點(diǎn)
# count > 0 從左開始搜索刪除count數(shù)量的value
# count < 0 從右開始搜索刪除|count|數(shù)量的value
# count = 0 刪除list中所有value
lrem key count value

# 范圍保留
# -1 表示列表最后一個元素
# -2 表示倒數(shù)第二個,以此類推
ltrim key start stop

# 計(jì)算長度
llen key

# 索引查詢節(jié)點(diǎn)
# index < 0 從右開始搜索
# index > 0 從左開始搜索
lindex key index

# 范圍查詢
# stop = -1 表示所有
lrange key start stop

# 阻塞彈出
# 隊(duì)列中沒有節(jié)點(diǎn)時會一直等待
# 多個key時表示挨著順序依次檢查,知道找到非空列表為止
# timeout可以設(shè)置等待時間,0表示一直等待
blpop key [key...] timeout
brpop key [key...] timeout

五:Hash

5.1 常用場景

商品對象、用戶對象。這個場景需要驗(yàn)證性對待,如果商品對象、用戶對象信息每次都需要全量的話不妨存string,但是僅僅部分使用就可以考慮使用hash結(jié)構(gòu)SKU等信息,這個場景下hash就比較合適了。一個hash結(jié)構(gòu)中存儲某個商品所有sku

5.2 編碼格式

ziplist:使用ziplist存儲hash結(jié)構(gòu)時一個數(shù)據(jù)會使用相鄰兩個ziplistEntry存儲field和valuehashtable:當(dāng)數(shù)據(jù)存儲超過參數(shù)限制后就會將其底層結(jié)構(gòu)由ziplist轉(zhuǎn)換為dict進(jìn)行存儲

5.3 相關(guān)參數(shù)配置

hash-max-ziplist-entries:默認(rèn)512,即ziplist節(jié)點(diǎn)為1024。當(dāng)節(jié)點(diǎn)數(shù)量超過該值限制后底層數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為dicthash-max-ziplist-value:默認(rèn)64,當(dāng)hash中插入任意一個長度超過該限制的value后底層數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為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 ...]

# 計(jì)算鍵值對數(shù)量
hlen key
# field存在判斷
hexists key field

# 增量式迭代
# cursor表示迭代開始的游標(biāo)
# count 表示迭代返回?cái)?shù)據(jù)數(shù)量
# pattern 表示正則匹配結(jié)果限制
hscan key cursor [Count count] [Match pattern]

六:Set

6.1 常用場景

推薦:通過sinter命令計(jì)算交集,比如美團(tuán)給你推薦附近外賣時就可以根據(jù)你的外賣記錄與附近商家計(jì)算交集推送安全提示:微信群成員保存在一個set中,用戶好友也保存在set中。當(dāng)用戶加入群聊時可以提醒非好友用戶注意安全

6.2 編碼格式

intset:整數(shù)集合,用于存儲set集合中所有value都是整數(shù)的數(shù)據(jù)hashtable:field用于存儲set集合值

6.3 相關(guān)參數(shù)配置

set-max-inset-entries:默認(rèn)512,表示當(dāng)元素?cái)?shù)量超過限定以后轉(zhuǎn)換為hashtable編碼

6.4 常用命令

# 存儲
sadd member [member ...]

# 彈出元素并返回
spop key count

# 查詢所有元素
smembers key [count]

# 計(jì)算元素?cái)?shù)量
scard key 

# 刪除指定元素
srem key member [member ...]

# 判斷元素存在
sismember key member

# 計(jì)算給定集合與后續(xù)集合差集
# 返回計(jì)算結(jié)果
sdiff key [key ...]

# 計(jì)算給定集合與后續(xù)集合差集
# 存儲結(jié)果到destination并返回
sdiffstore destination key [key ...]

# 計(jì)算給定集合與后續(xù)集合交集
# 返回計(jì)算結(jié)果
sinter key [key ...]

# 計(jì)算給定集合與后續(xù)集合差集
# 存儲結(jié)果到destination并返回
sinterstore destination key [key ...]

# 計(jì)算給定集合與后續(xù)集合差集
# 返回計(jì)算結(jié)果
sunion key [key ...]

# 計(jì)算給定集合與后續(xù)集合差集
# 存儲結(jié)果到destination并返回
sunionstore destination key [key ...]

七:Zset

7.1 常用場景

排行榜:美團(tuán)要做一個銷量排行榜,就可以使用店家的訂單做score,這個查詢出來的結(jié)果就是有序的權(quán)重隊(duì)列:score作為優(yōu)先級,這樣取出來的數(shù)據(jù)權(quán)重都是最大優(yōu)先執(zhí)行的延時任務(wù):score作為任務(wù)啟動執(zhí)行時間,取值時判斷該值執(zhí)行即可

7.2 編碼格式

ziplist:與hash有異曲同工之妙,都是使用相鄰兩個節(jié)點(diǎn)存儲score和memberskiplist:跳躍表結(jié)構(gòu),可以查看Redis(一) -- 淺談Redis中的數(shù)據(jù)結(jié)構(gòu)

7.3 相關(guān)參數(shù)配置

zset-max-ziplist-entries:默認(rèn)值128,指定ziplist存儲元素最多128個。超過轉(zhuǎn)換為skiplistzset-max-ziplist-value:默認(rèn)值64,存儲數(shù)據(jù)值最大64字節(jié),超過轉(zhuǎn)換為skiplist

7.4 常用命令

# 存儲
# xx 表示當(dāng)zset中存在本次插入的member時才存儲
# nx 表示當(dāng)zset中不存在本次插入的member時才存儲
zadd key [nx|xx] score member [score member ...]

# 查詢排序指定[start,stop]范圍內(nèi)元素
# withscores 查詢結(jié)果順帶返回元素分?jǐn)?shù)
zrange key start stop [withscores]

# 查詢指定元素分?jǐn)?shù)
zscore key member

# 元素?cái)?shù)量統(tǒng)計(jì)
zcard key

# 返回score位于[min,max]區(qū)間的元素?cái)?shù)量
zcount key min max 

# 對指定元素分?jǐn)?shù)增加incrment值
zincrby key incrment member

# 返回指定分?jǐn)?shù)區(qū)間范圍內(nèi)元素
# withscores 返回時攜帶分?jǐn)?shù)一起返回
# limit offset count表示跳過offset數(shù)量結(jié)果再返回count數(shù)量結(jié)果
zrangebyscore key min max [withscores] [limit offset count]

# 倒序返回指定分?jǐn)?shù)區(qū)間范圍內(nèi)元素
# withscores 返回時攜帶分?jǐn)?shù)一起返回
# limit offset count表示跳過offset數(shù)量結(jié)果再返回count數(shù)量結(jié)果
zrevrangebyscore key max min [withrescores] [limit offset count]

# 刪除指定分?jǐn)?shù)范圍[min,max]內(nèi)元素
zremrangebyscore key min max

# 移除指定元素
zrem key member

以上是“redis中的常用基礎(chǔ)對象有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI