(一)五大基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
A. string
- 概述:字符串是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),redis所有的key都是string類型,且其他的數(shù)據(jù)結(jié)構(gòu)都是基于string構(gòu)建的。redis中string的value可以是string、數(shù)字(int float)甚至是二進(jìn)制(圖片、音頻 & 視頻),其value最大值不超過512MB。
- 主要操作
- 設(shè)置 & 獲取value
- 基礎(chǔ)設(shè)置:直接使用
set key value。 - 過期設(shè)置:原子操作使用
setex key seconds value。 - 條件設(shè)置:設(shè)置key不存在時(shí)才能被新建,使用
setnx key value。 - 注意:若多個(gè)clients同時(shí)執(zhí)行setnx,僅有一個(gè)client可設(shè)置成功(setnx即為redis中分布式鎖的實(shí)現(xiàn)方案,具體實(shí)現(xiàn)請參考redis官方文檔)。
- 獲取value:
get key獲取對應(yīng)value,若不存在則會返回nil。
- 基礎(chǔ)設(shè)置:直接使用
- 批量操作
- 概述:提高業(yè)務(wù)處理效率,降低網(wǎng)絡(luò)壓力,但是單次批量操作不宜發(fā)送過多命令,容易導(dǎo)致redis阻塞和網(wǎng)絡(luò)擁塞。
- 批量設(shè)置
mset key1 value1 key2 value2 key3 value3。 - 批量獲取
mget key1 key2 key3。
- 計(jì)數(shù)操作
- 概述:incr命令對value進(jìn)行自增操作,若value不是整數(shù)則返回錯(cuò)誤,若key不存在則從0開始增加(第一次執(zhí)行完就為1)。
- 基礎(chǔ)命令為
incr key&decr key - 指定增加數(shù)目:
incrby key increment
- 低頻使用命令
- 追加值:
append key value,比如原始的key對應(yīng)的value是redis,使用了append key world后,value變成了redisworld。 - value的長度:
strlen key,單個(gè)中文被認(rèn)為長度為3。
- 追加值:
- 設(shè)置 & 獲取value
- 主要功能
- 緩存功能,免于直接調(diào)用database;
- 計(jì)數(shù)功能,基于incr實(shí)現(xiàn);
- 共享session,因?yàn)閣eb服務(wù)存在負(fù)載均衡的問題,一個(gè)用戶多次訪問可能會被分配至不同server。redis會存儲所有server的session,統(tǒng)一獲?。?/li>
- 限速,基于計(jì)數(shù)器的本質(zhì),確保一定時(shí)間內(nèi)只能發(fā)送數(shù)次請求
// 60s內(nèi)只能嘗試1次(比如短信驗(yàn)證場景) phoneNum = "1886*12***9"; key = "msgLimitation:" + phoneNum; // setex 設(shè)置參數(shù)NX確保是全新的key才設(shè)置value為0 isExists = redis.set(key, 0, "EX 60", "NX"); if(isExists != null & redis.incr(key) <= 1) { //通過,第2次進(jìn)入的時(shí)候進(jìn)行語法判斷,發(fā)現(xiàn)key的value變成了2,會進(jìn)入下方限速區(qū)域 } else { // 限速不通過 }
B. hash
概述:redis內(nèi)的hash類型的value包含多個(gè)fileds。比如key是user:10086,value里面有2個(gè)fields分別是name & age,具體對應(yīng)的value是dave & 18。
-
主要操作
- 設(shè)置 & 獲取value
- 基礎(chǔ)設(shè)置:
hset key field value,設(shè)置成功會返回1,否則返回0。 - 條件設(shè)置:當(dāng)這個(gè)field不存在時(shí)才可被新建,使用
hsetnx key field value實(shí)現(xiàn)。 - 獲取value:
heget key field
- 基礎(chǔ)設(shè)置:
- 刪除fields:
hdel key field1 [field2],刪除全部fields則該hash key就消失了。 - 計(jì)算長度
-
hlen key,可獲得該key下的fields總數(shù),便于粗略判斷key的大小。 -
hstrlen key field,計(jì)算key的具體某個(gè)field的value的長度。
-
- 批量操作
- 批量獲取即
hmget key field1 [field2]。 - 批量設(shè)置即
hmset key field1 value1 [field2 value2]。
- 批量獲取即
- 判斷field存在與否:
hexists key field,根據(jù)存在與否返回1或0。 - 全量獲取
- 全部fields:使用
hkeys key可看到key對應(yīng)的所有fields,hlen key只能看到field的總數(shù),不能看到具體內(nèi)容。 - 全部values:
hvals key獲得key對應(yīng)的所有values。 - 全量內(nèi)容:
hgetall key可以看到key下所有的fields和對應(yīng)的values。
- 全部fields:使用
- 計(jì)數(shù)器:作用域也是對于key下具體的某個(gè)field,語法為
hincrby key field。
- 設(shè)置 & 獲取value
優(yōu)點(diǎn):占用鍵少,合理使用可以減少內(nèi)存消耗
C. list
- 概述:列表數(shù)據(jù)結(jié)構(gòu)中的元素是有序的,且元素可以重復(fù)。
- 主要操作
- 基礎(chǔ)操作
- 頭部添加:即左側(cè)插入,
lpush key value1 [value2] - 尾部添加:即右側(cè)插入,
rpush key value1 [value2] - 某元素位置添加:
insert key before pivot value或者insert key after pivot value,在list元素為pivot前或后插入value元素。 - 頭部彈出:即取出最左側(cè)元素,
lpop key - 尾部彈出:即取出最右側(cè)元素,
rpop key - 刪除指定元素:
lrem key count value,刪除count個(gè)key中等于value的元素。count > 0,從左往右刪,count < 0則從右往左刪,count=0全刪。 - 范圍刪除:
ltrim key start end,僅保留start到end的部分,其他都刪掉。 - 修改:
lset key index newValue對具體某個(gè)下標(biāo)的元素做修改。 - 列表的長度:
llen key
- 頭部添加:即左側(cè)插入,
- 查找
- 獲取全部元素:
lrange key start end,例如lrange test 0 -1即把名為test的list的全部元素羅列出來。 - 獲取指定元素:
lindex key index
- 獲取全部元素:
- 阻塞操作
- 彈出:
blpop key1 key2 timeout或者brpop key1 key2 timeout,可對多個(gè)列表同時(shí)彈出,timeout設(shè)置為0代表會一直保持阻塞,一有新元素進(jìn)入就彈出。若多個(gè)client都是用命令,則先觸發(fā)命令的獲得彈出內(nèi)容。
- 彈出:
- 基礎(chǔ)操作
- 主要功能:
- 消息隊(duì)列:lpush + brpop的組合可實(shí)現(xiàn)阻塞隊(duì)列(FIFO),生產(chǎn)者使用lpush,消費(fèi)者使用brpop搶元素。若組合改為lpush + blpop即為棧。
- 文章列表:每個(gè)用戶有自己閱讀的文章列表。
- 文章本身是用hash存儲的,比如
hmset article:1 title xx time 12321 content yyyy,hmset article:2 title zz time 12298 content nhs - 設(shè)置用戶1號選手所閱讀的文章列表,
lpush user:1:articles article:1 article:2
- 文章本身是用hash存儲的,比如
D. set
- 概述:集合中無重復(fù)元素,且內(nèi)部是無序的,無法通過index獲取元素內(nèi)容。
- 主要操作
- 基礎(chǔ)操作
- 添加元素:
sadd key element1 [element2],無需和hash一樣必須使用hmset才能設(shè)置多個(gè)field-value。 - 刪除元素:
srem key element1 [element2]。 - 隨機(jī)彈出元素:
spop key - 計(jì)算元素個(gè)數(shù):
scard key,類似hlen的效果。 - 獲取全量元素:
smembers key
- 添加元素:
- 查找
- 判斷是否存在某元素:
sismember key element - 隨機(jī)返回:
srandmember key [count],count若不填寫,則返回一個(gè)元素,填了就根據(jù)數(shù)字返回。
- 判斷是否存在某元素:
- 集合間操作
- 交集:
sinter key1 key2 [key3] - 并集:
sunion key1 key2 [key3] - 差集:
sdiff key1 key2 [key3],差集的含義是key1集合中有,但其他集合中沒有的。 - 存下結(jié)果:
sinterstore newkey key1 key2 [key3],把結(jié)果存到newkey這個(gè)set中。
- 交集:
- 基礎(chǔ)操作
- 主要功能:給用戶添加標(biāo)簽,或給某類標(biāo)簽添加用戶
- 注意:smembers,lrange,hgetall都是時(shí)間復(fù)雜度高的命令,建議用sscan
E. sorted_set
- 概述:保留了set的元素不重復(fù)這一特性,但是有序集合內(nèi)的元素可進(jìn)行排序,依據(jù)每個(gè)元素的score(多用于排行榜的場景)
- 主要操作
- 基礎(chǔ)操作
- 添加成員:
zadd key score1 member1 [score2 member2]可添加其余參數(shù),例如nx xx(類似setnx) - 刪除成員:
zrem key member1 [member2] - 刪除排名內(nèi)成員:
zremrangebyrank key start end,刪除升序排名start-end內(nèi)的成員。 - 刪除分?jǐn)?shù)內(nèi)成員:
zremrangebyscore key min max - 計(jì)算成員個(gè)數(shù):
zcard key - 某分?jǐn)?shù)段內(nèi)成員個(gè)數(shù):
zcount key min max - 增加成員分?jǐn)?shù):
zincrby key increment member
- 添加成員:
- 查找 & 排名
- 獲取某個(gè)成員的分?jǐn)?shù):
zscore key member - 返回排名范圍的成員:
zrange key start end [withscores]&zrevrange key start end [withscores],帶上參數(shù)后返回結(jié)果會有score顯示。 - 返回分?jǐn)?shù)范圍的成員:
zrangebyscore key min max [withscores] [limit offset count],同樣也有zrevrangebyscore。 - 計(jì)算成員排名:
zrank key member&zrevrank key member,前者是從低到高排名,后者反之。
- 獲取某個(gè)成員的分?jǐn)?shù):
- 集合間操作
- 交集:
zinterstore newkey numkeys key1 [key2],newkey即結(jié)果保存到這個(gè)新集合中,numkeys意味著需要做交集計(jì)算的個(gè)數(shù)。 - 并集:
zunionstore newkey numkeys key1 [key2]
- 交集:
- 基礎(chǔ)操作
- 主要功能:一般用于排行榜系統(tǒng),下方以點(diǎn)贊為場景進(jìn)行展示
- 添加用戶贊數(shù):
zadd user:ranking:2022_07_03 3 mike,每天有一個(gè)rank的有序集合,在2022.07.03的排行榜上,用戶mike有3個(gè)贊。 - 后續(xù)點(diǎn)贊設(shè)計(jì):
zincrby user:ranking:2022_07_03 1 mike,后續(xù)每點(diǎn)一個(gè)贊就score+1。 - 取消贊設(shè)計(jì):若用戶注銷,需刪除時(shí)使用
zrem user:ranking:2022_07_03 mike,此時(shí)mike被刪除。 - 展示點(diǎn)贊排行榜:展示top10的點(diǎn)贊用戶和他們的具體點(diǎn)贊數(shù),則使用
zrevrange user:ranking:2022_07_03 0 9 withscores。 - 展示某個(gè)用戶的排名和點(diǎn)贊數(shù):排名為
zrank user:ranking:2022_07_03 mike,點(diǎn)贊數(shù)為zscore user:ranking:2022_07_03 mike。
- 添加用戶贊數(shù):