1. 程式人生 > >Set,Sorted Set相關命令操作,批量插入及管道,事務

Set,Sorted Set相關命令操作,批量插入及管道,事務

Set

SADD key member [member ...]

向key指定的set集合新增成員,次集合是排重的,從2.4版本後才支援新增多個
如果key不存在則建立key以及set集合
返回當前操作成功新增的成員數量,不是所有的成員數量
SMOVE source destination member
把key為source的set中值為member的成員移動到key為destination的set集合中
該操作是原子操作
如果source不存在或者member不存在source中,則返回0ͺ否則返回1
SPOP key
從key指定的set集合中移除一個值
如果有值可以移除就返回被移除的值,沒有或者key不存在則返回nil
SREM

key member [member ...]
從key指定的set中移除member的成員,如果某個member不存在,則會被忽略,成功後返回被移除的數量
SCARD key
返回key對應的集合成員數量
SMEMBERS key
返回key對應的set的所有成員
SDIFF key [key ...]
返回第一個key與後面其它可以對應的set中不存在的值
127.0.0.1:6379> smembers settest
(empty list or set)
127.0.0.1:6379> sadd settest 11 22 33
(integer) 3
127.0.0.1:6379> smembers settest
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> srem settest 11
(integer) 1
127.0.0.1:6379> smembers settest
1) "22"
2) "33"
127.0.0.1:6379> scard settest
(integer) 2
127.0.0.1:6379> sadd set2 88 99 10
(integer) 3
127.0.0.1:6379> sadd set2 33
(integer) 1
127.0.0.1:6379> sdiff settest set2
1) "22
SDIFFSTORE
destination key [key ...]
與SDIFF一樣,但是會把差異存在的值放在destination的set中
如果destination已經存在,將會覆蓋,即原來的set中的值都沒有了
返回destination中值的個數
SINTER key [key ...]
返回key對應的set中值的交集,如果key不存在,就被當作是空集合,返回值交集的元素
127.0.0.1:6379> sinter settest set2
1) "33"
SINTERSTORE destination key [key ...]
與SINTER一樣,但是把交集的資料儲存在desttination中
SISMEMBER key member
判斷member是不是key對應set的成員,如果是返回1,如果key不存在或者不是返回0

SRANDMEMBER key [count]
不帶引數count,則從key指定的set中隨機返回一個成員
從2.6版本後,增加count,如果count>0,則隨機返回count個不同的值ͺ如果count<0,返回多個值,但可能會有相同的值,數量就是count的絕對值
SUNION key [key ...]
返回所有key中的所有值,如果值有相同的,則會去重
127.0.0.1:6379> srandmember settest
"22"
127.0.0.1:6379> smembers settest
1) "22"
2) "33"
127.0.0.1:6379> srandmember settest
"33"
127.0.0.1:6379> srandmember settest 3
1) "22"
2) "33"
127.0.0.1:6379> srandmember settest -3
1) "22"
2) "22"
3) "33"
127.0.0.1:6379> sadd set1 100
(integer) 1
127.0.0.1:6379> sunion set1 settest
1) "22"
2) "33"
3) "100"
127.0.0.1:6379> sadd set1 33
(integer) 1
127.0.0.1:6379> sunion set1 settest
1) "22"
2) "33"
3) "100"
SUNIONSTORE destination key [key ...]
與sunion功能一致,不過把合併後的資料放在destination這個set集合,返回集合的長度
SSCAN key cursor [MATCH pattern] [COUNT count]

Sorted Set

ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
把後面的成員,按照一定的排序分數放入key指定的sorted set
如果member已經存在,則會更新score,同時把該元素插入新的順序位置
XX表示只有member存在才能操作,也就是隻能更新score
NX,表示不更新,只做插入,即如果有成員存在,該操作會失敗,不存在就插入
Ch表示返回的值不是新增元素的數量而是發生變化的元素的數量,包括:新增元素和已經存在的但是score被修改的元素
Incr,當指定該屬性時,後面只能有一對score-member,表示給member成員的score增加對應的值
當不同的成員具有相同的score時,redis會按照成員的字典序進行排序
如果不加ch選項,則返回被新增的新成員的數量ͺ如果採用incr選項則返回的是增加後的元素的score
127.0.0.1:6379> zadd sett1 1 11 2 22 3 33
(integer) 3
127.0.0.1:6379> zrange sett1 0 10
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> zadd sett1 xx 20 22
(integer) 0
127.0.0.1:6379> zrange sett1 0 10
1) "11"
2) "33"
3) "22"
127.0.0.1:6379> zadd sett1 xx ch 21 22
(integer) 1
127.0.0.1:6379> zrange sett1 0 10
1) "11"
2) "33"
3) "22"
127.0.0.1:6379> zadd sett1 incr 100 11
"101"
127.0.0.1:6379> zrange sett1 0 10
1) "33"
2) "22"
3) "11"
ZRANGE key start stop [WITHSCORES]
返回key指定的set的某個區間值
Set的第一個值下標是0,如果start或者stop為負數,則表示倒數第幾個
當帶上屬性withscores時,返回的值會帶上score
ZSCORE key member
獲取key對應的set集合中member成員的score值
ZSCAN key cursor [MATCH pattern] [COUNT count]
與scan類似,以遊標的方式遍歷key對應的set集合的值
127.0.0.1:6379> zrange sett1 0 10 withscores
1) "33"
2) "3"
3) "22"
4) "21"
5) "11"
6) "101"
127.0.0.1:6379> zscore sett1 33
"3"
127.0.0.1:6379> zscan sett1 0
1) "0"
2) 1) "33"
2) "3"
3) "22"
4) "21"
5) "11"
6) "101"
ZCARD key
返回key指定的set的所有成員數量
ZCOUNT key min max
返回key指定的set集合中,min<=score<=max的元素的數量
ZINCRBY key increment member
把key中的member元素的score增加increment數
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE
SUM|MIN|MAX]
求指定的key對應的集合中的交集,numkeys表示被求交集的key的數量,必須完全一致
預設交集元素的score是所有集合中score的和,可以通過AGGREGATE的引數SUM MIN MAX來指定其它演算法
還可以通過WEIGHTS指定不同key的權重,參與score計算的權重
127.0.0.1:6379> zcard sett1
(integer) 3
127.0.0.1:6379> type sett1
zset
127.0.0.1:6379> zrange sett1 0 10
1) "33"
2) "22"
3) "11"
127.0.0.1:6379> zrange sett1 0 10 withscores
1) "33"
2) "3"
3) "22"
4) "21"
5) "11"
6) "101"
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE
SUM|MIN|MAX]

求指定的key對的集合中的並集,numkeys表示被求交集的key的數量,必須完全一致
如果有交集的元素,則幾個元素的score是所有集合中score的和,可以通過AGGREGATE的引數SUM MIN MAX來指定其它演算法
還可以通過WEIGHTS指定不同key的權重,參與score計算的權重
ZRANGEBYLEX key min max [LIMIT offset count]
當集合的所有元素的score都一樣時,通過該命令取出key的集合中符合字典序min max區間的值
Min和max必須以[開頭,代表不等於和等於,比如min為[5,則帶表大於等於5
用-號代表無窮小,+號帶表無窮大,如果min為-,max為+則代表返回所有的值
Limit用於分頁返回,類似於mysql的limit,offset是第幾條
ZLEXCOUNT key min max
當集合的所有元素的score都一樣時,通過該命令取出key的集合中符合字典序min max區間的值的個數
Min和max必須以或者[開頭,代表不等於和等於,比如min為[5,則代表大於等於5
用-號代表無窮小,+號代表無窮大,如果min為-,max為+則帶表返回所有的值
ZREVRANGEBYLEX key max min [LIMIT offset count]
與zrangebylex功能類似,不過它是從大到小的返回值列表
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
取出分數(score)位於min和max之間的元素,預設是包含最小和最大兩個邊界,也可以採用(或者[來明確表示邊界
• Withscores可以把符合要求的元素的score值一起查詢出來
• Limit類似mysql的limit,offset帶表起始值,count帶表查詢數量
• 可以通過-inf和+infї表無窮小和無窮大
ZRANK key member
• 返回key集合中,元素member對應的排序ѹ置
• 如果key不存在或者member不存在,返回nil
ZREM key member [member ...]
• 刪除key指定的set集合中對應的元素
• 返回被刪除的元素的數量,不包括不存在的元素
ZREMRANGEBYLEX key min max
• 當集合所有元素的score相同時,刪除該集合中字典序範圍為min和max的元素
• Min和max的定義參考ZRANGEBYLEX命令
• 返回被刪除的元素個數
ZREMRANGEBYRANK key start stop
• 刪除key對應集合中排序順序為start和stop中間的元素
• Start和stop可以為負數表示從最大排序的倒數,正序的下標從0開始
• 返回被刪除的元素個數
ZREMRANGEBYSCORE key min max
• 刪除key指定的set集合中對應的元素,score滿足min和max大小
• 返回被刪除的元素的數量,不包括不存在的元素
ZREVRANGE key start stop [WITHSCORES]
• 與zrange類似,但是љ倒序方式查詢
• 返回符合條件的元素
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
以倒序的方式返回key對ځ集合中,score在max和min中間的元素
• Withscores表示返回元素時顯示元素的score值
• Limit類似mysql的limit,offset表示起始值,count表示數量
ZREMRANGEBYSCORE key min max
刪除key指定的set集合中對ځ的元素,score滿足min和max大小
• 返回被刪除的元素的數量,不包括不存在的元素
ZREVRANK key member
返回key集合中member元素的排序ѹ置,key對ځ的集合倒排後member所處的位置
• 返回倒序序號,如果key不存在或者member不存在則返回nil

 

管道(pipelining)

為了提升客戶端伺服器器端的通訊效率,從而可以提升客戶端的吞吐率,redis提供了pipelining來一次
可以發起多個命令,並且要等多個命令執行完成才能返回最終結果
注意事項
由於中間執行結果會先緩衝到記憶體,所以如果命令執行結果資料比較多的話會導致伺服器記憶體暴增
當已經把網路包填充滿後,再增加多的命令,並不會提升效能,主要涉及到最大報文段長度的值

事務操作命令


- MULTI,開啟一個事務
– EXEC,執行事務中所有的命令,即MULTI後所有的命令
– DISCARD,類似回滾,即不執行MULTI後的所有命令
– WATCH,類似於樂觀鎖的實,࣫當事務執行期間(實就是事務開始時,因為redis是單執行緒,一旦開
始執行,資料不會被其它執行緒的命令修改),被觀察的key的值發生變化,則事務不會執行
– UNWATCH,取消觀察,即取消樂觀鎖
事務的本質理解
類似於命令佇列,保證命令的順序性,並會檢查入佇列的每個命令的語法合法性
所有命令執行過程不會被打斷,即使中間某個命令執行失敗,也會把剩下的所有命令都執行完成
當事務通過exec或者discard後,watch樂觀鎖會失效

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 111
QUEUED
127.0.0.1:6379> set t2 222
QUEUED
127.0.0.1:6379> set tkey 333
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> get tkey
"333"
127.0.0.1:6379> get t2
"222"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 555
QUEUED
127.0.0.1:6379> set t2 333
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get tkey
"333"
127.0.0.1:6379> get t2
"222"
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI

Redis原子性有一定的侷限性,它只能檢查語句的合法性(入隊檢查),如果進入佇列的語句不合法,則整個事務不會提交ͺ
如果採用樂觀鎖(watch),則,當對應的key的值發生變化,則事務部會提交

因為redis是單執行緒執行,即同時刻只有一個命令在執行,因此不會出࣫在執行過程中資料被其他命令修改的情況
執行過程中宕機不會導致資料不一致,因為通過持久化機制可以按照執行成功的標準檢測
有一定的侷限性:沒有事務回滾機制,一旦某個命令執行失敗(剩下的命令依然會繼續執行),會導致整個事務的資料不能完整

單執行緒執行,具備很好的隔離性

依賴redis的持久化機制,如果採用aof,則需要設定appendfsync為always時,每個命令的執行都會寫入磁碟

關於事務
1.並不能像關係型資料庫那樣嚴謹
2.一般的語句執行錯誤都是由於命令錯誤等bug導致,某些命令執行總會成功,比如mset命令ͺ因此為了獲取比較高的效能,
在不是很嚴格的業務場景還是可以大膽使用的,如果在非常嚴謹的場景使用,建議增加類似對賬機制進行資料的驗證和糾錯處理