Redis SDS字符串與集合的底層實(shí)現(xiàn)原理解析
Set型Value操作命令
Set集合中的每一個(gè)元素都是String類型。
Set和List非常相似,但是Set是無序且不可重復(fù),而List則是有序可重復(fù)的。
Set集合的底層是value為null的hash表。正是如此,才保證了無序性和不可重復(fù)性。
- sadd:將一個(gè)或多個(gè)元素加入到Set中,已經(jīng)存在的元素將被忽略
格式:sadd key member 【member...】
說明:如果key不存在,就創(chuàng)建一個(gè)只包含member元素作成員的集合。
- smembers:返回集合key中的所有成員。
- scard:返回Set的長度
- sismember:判斷member元素是否是集合key的成員
格式:sismember key member
說明:如果是集合的成員返回1,不過不是,或者key不存在,就返回0
- smove:將member元素從集合source 移動(dòng)到destination
格式:smove source destination member
說明:如果source 集合不存在,或者不包含指定的member元素,則不執(zhí)行任何操作,返回0
? 否則會(huì)從source中刪除member,并添加到destination,返回1。
? 如果destination已經(jīng)包含了member,那只是簡單的從source中刪除member。
- srem:刪除指定集合的一個(gè)或多個(gè)元素
- srandomember:隨機(jī)獲取集合中指定數(shù)量的元素,默認(rèn)1.
格式:srandomember key count
注意:如果count的數(shù)量大于集合中元素的個(gè)數(shù),就返回整個(gè)集合。
? 如果count為正數(shù),且小于集合長度,那么返回一個(gè)包含count個(gè)元素的數(shù)組,數(shù)組中的元素不重復(fù)。
? 如果count為負(fù)數(shù),那么返回一個(gè)包含count絕對(duì)值個(gè)元素的數(shù)組,數(shù)組中的元素可能會(huì)重復(fù)。
- spop:移除并返回集合中的count個(gè)隨機(jī)元素。count必須是正數(shù),且默認(rèn)為1。如果count大于集合的長度,那么移除并返回整個(gè)集合。
- sdiff/sdiffstore:返回集合差集。sdiff執(zhí)行的結(jié)果不會(huì)保存,只是臨時(shí)計(jì)算差集。sdiffstore 會(huì)保存這個(gè)差集到指定的集合中。
格式:sdiff key1 key2 (取集合key1和key2的差集)
格式:sdiffstore keyRes key1 key2 (取集合key1和key2的差集,并保存到keyRes)
- sinter/sinterstore:返回集合交集
- sunion/sunionstore:返回集合并集
應(yīng)用場(chǎng)景
動(dòng)態(tài)黑白名單
在服務(wù)器中設(shè)置用于控制訪問的黑名單。
將黑名單寫入Redis,只要客戶端來訪問,先在Redis中的黑名單查看客戶端IP是否存在,存在就拒絕訪問,否則訪問通過。
有限隨機(jī)數(shù)
有限隨機(jī)數(shù)是指返回的隨機(jī)數(shù)是基于某一集合范圍內(nèi)的隨機(jī)數(shù),例如抽獎(jiǎng)、隨機(jī)選人等。
通過spop或srandomember 實(shí)現(xiàn)從指定集合中隨機(jī)選出元素。
用戶畫像
用戶畫像就是為每個(gè)用戶自定義多個(gè)反應(yīng)該用戶特征的白哦去,這些標(biāo)簽可以使用sadd添加該用戶對(duì)應(yīng)的集合中。這些標(biāo)簽具有無序、不重復(fù)特征。
還可以使用sinter/sinterstore 根據(jù)用戶畫像的交集進(jìn)行好友推薦、商品推薦、客戶推薦等。
有序Set型value操作命令
有序Set中的每個(gè)元素都是String類型。
有序Set和Set的不同之處在于,有序Set中的每個(gè)元素都有一個(gè)分值score,Redis會(huì)根據(jù)score的值對(duì)集合進(jìn)行由小到大排序。
有序Set的元素不重復(fù),但元素的score可以重復(fù)。
由于該類型的命令都是z開頭,所以也稱作ZSet。
- zadd:將一個(gè)或多個(gè)member元素及其score 值添加到ZSet中。
格式:zadd key score member [score member ...]
注意:score可以是整數(shù)或雙精度浮點(diǎn)數(shù)。
? 如果集合key不存在,就創(chuàng)建一個(gè)空的ZSet,并執(zhí)行Zadd操作。
? 如果寫入的member值存在,但score不同,新的score會(huì)覆蓋舊的score。
- zrange和zrevrange:返回ZSet中,指定區(qū)間內(nèi)的成員。
格式:zrange key start stop [withscores] 或zrevrangekey start stop [withscores]
說明:zrange命令會(huì)按score值遞增排序。
? zrevrange命令會(huì)按score值遞減排序。
? 具有相同score值得成員按字典序/逆字典序排序。
? 可以通過使用withscores 選項(xiàng),來讓成員和它的score值一并返回。
? 當(dāng)start大于ZSet的最大下標(biāo),或者start>stop時(shí)(兩者同為正數(shù)或負(fù)數(shù)時(shí)),zrange命令會(huì)返回一個(gè)空列表。
? 當(dāng)stop大于ZSet的最大下標(biāo),那么Redis將stop當(dāng)作最大下標(biāo)處理。
? 如果集合中包含大量元素,該命令會(huì)阻塞Redis服務(wù),所以生產(chǎn)環(huán)境一般不使用該命令,而使用zscan代替。
- zrangebyscore和zrevrangebyscore:返回ZSet中,指定score區(qū)間內(nèi)的成員。
格式:zrangebyscore key min max [withscores] [limit offset count]
? zrevrangebyscore key min max [withscores] [limit offset count]
說明:Zset按score遞增/遞減排序。
? 相同score按字典序/逆字典序排列。
? limit參數(shù)指定返回結(jié)果的數(shù)量及區(qū)間。
? offset 表示從結(jié)果的某個(gè)下標(biāo)開始
? count表示截取元素的個(gè)數(shù)。
? 當(dāng)offset很大時(shí),定位offset的操作可能需要遍歷整個(gè)有序集,此過程效率可能會(huì)較低。
? min和max的取值是正負(fù)無窮大。區(qū)間的取值用閉區(qū)間,也可以給參數(shù)前加左括號(hào)“(”來使用開區(qū)間。
注意:如果使用zrevrangebyscore ,那么start必須大于stop。
# 按score 截取大于20 小于等于60,再從其結(jié)果的下標(biāo)3開始截取7個(gè)元素并返回。 zrangebyscore city (20 60 withscores limit 3 7
- zcard:返回集合的長度。
- zcount:返回Zset中,score值在min和max之間(包含min和max)的成員的數(shù)量。
格式:zcount key min max
- zscore:返回ZSet中,指定元素的score值
格式:zscore key member
- zincrby:在ZSet中,給指定元素的score加上具體的值
格式:zincrby key increment member
- zrank和zrevrank:返回ZSet中,指定元素的排名名次(名次從0開始計(jì)算)
格式:zrank key member // 正序名次
? zrevrankkey member // 倒序名次
- zrem:移除ZSet中,指定的一個(gè)或多個(gè)元素
格式:zrem key member [member...]
- zremrangebyrank:移除ZSet中,名次在start和stop之間的元素(包含start和stop),0表示第一名,以此類推。
格式:zremrangebyrank key start stop
- zremrangebyscore:移除ZSet中,score在min和max之間的元素(包含min和max)
格式:zremrangebyscore key min max
- zrangebylex:該命令僅適用于集合中所有成員都具有相同score的情況。這時(shí)集合的元素會(huì)根據(jù)成員的字典序排序。如果集合里的成員有不同的score,那么和zrange 效果相同。
格式:zrangebylex key min max [limit offset count]
# 按字典序排序(因?yàn)閟core全部一樣),返回區(qū)間在[b,e)之間的成員。 zrangebylex ch [b (e
- zlexcount:該命令僅適用于集合中所有成員都具有相同score的情況。返回集合中元素值本身(非score值)介于min和max范圍內(nèi)的元素?cái)?shù)量。
格式:zlexcount key min max
- zremrangebylex:該命令僅適用于集合中所有成員都具有相同score的情況。移除集合中元素值本身(非score值)介于min和max范圍內(nèi)的元素?cái)?shù)量。
格式:zremrangebylex key min max
應(yīng)用場(chǎng)景
各種排行榜。例如音樂、視頻平臺(tái)的排行榜。將播放量作為score,進(jìn)行排序。
benchmark測(cè)試工具
Redis安裝完畢后會(huì)自動(dòng)安裝一個(gè)redis-benchmark測(cè)試工具,它是一個(gè)壓力測(cè)試工具,用于測(cè)試redis性能。
通過redis-benchmark -help 查看其用法。
redis-benchmark -c <clients> # 并行連接的客戶端數(shù)量,默認(rèn)50 redis-benchmark -n <requests> # 接收請(qǐng)求總數(shù),默認(rèn)100000 # 案例:測(cè)試并發(fā)100個(gè),2萬請(qǐng)求 redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 20000 # 案例:測(cè)試并發(fā)100個(gè),2萬請(qǐng)求,指定測(cè)試命令set,lpush,sadd redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush,sadd -c 100 -n 20000 # 案例:只查看測(cè)試報(bào)告結(jié)果,不看詳細(xì)內(nèi)容:-q redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush,sadd -c 100 -n 20000 -q
到此這篇關(guān)于Redis--SDS字符串與集合的底層實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)Redis--SDS字符串與集合的底層實(shí)現(xiàn)原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis簡單動(dòng)態(tài)字符串SDS的實(shí)現(xiàn)示例
- Redis源碼解析sds字符串實(shí)現(xiàn)示例
- Redis中SDS簡單動(dòng)態(tài)字符串詳解
- Redis中String字符串和sdshdr結(jié)構(gòu)體超詳細(xì)講解
- 幾分鐘教你掌握Redis簡單動(dòng)態(tài)字符串SDS
- 解析Redis 數(shù)據(jù)結(jié)構(gòu)之簡單動(dòng)態(tài)字符串sds
- Redis源碼閱讀:Redis字符串SDS詳解
- redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動(dòng)態(tài)字符串詳解
相關(guān)文章
Redis數(shù)據(jù)庫的應(yīng)用場(chǎng)景介紹
這篇文章主要介紹了Redis數(shù)據(jù)庫的應(yīng)用場(chǎng)景介紹,本文講解了MySql+Memcached架構(gòu)的問題、Redis常用數(shù)據(jù)類型、Redis數(shù)據(jù)類型應(yīng)用和實(shí)現(xiàn)方式、Redis實(shí)際應(yīng)用場(chǎng)景等內(nèi)容,需要的朋友可以參考下2015-06-06
監(jiān)聽Redis實(shí)時(shí)數(shù)據(jù)變化實(shí)現(xiàn)過程
本文介紹了通過定時(shí)遍歷Redis并對(duì)比緩存Map,實(shí)現(xiàn)監(jiān)聽指定前綴鍵的value變化的方法,并簡要提及了可用Keyspace通知等更高效的手段2025-10-10
Redis 的查詢很快的原因解析及Redis 如何保證查詢的高效
由于redis是內(nèi)存數(shù)據(jù)庫,歸功于它的數(shù)據(jù)結(jié)構(gòu)所以查詢效率非常高,今天通過本文給大家介紹下Redis 的查詢很快的原因解析及Redis 如何保證查詢的高效,感興趣的朋友一起看看吧2022-03-03

