Set數據類型及操做mysql
Set集合是經過hash table實現的,因此添加、刪除和查找的複雜度都是O(1),hash table會隨着添加或者刪除自動的調整大小,須要注意的是 hash table大小時候須要同步(獲取寫鎖)會阻塞其餘讀寫操做,可能不久後就會改用跳錶(skip list)來實現,跳錶已經在sorted set中使用了,關於set集合類型除了基本的添加刪除操做,其餘有用的操做還包含集合的取並集(union),交集(intersetion),差集(difference),經過這些操做能夠很容易的實現sns中的好友推薦和blog的tag功能,下面詳細介紹set相關命令:redis
1.sadd
向名稱爲key的set中添加元素:
命令:
sadd myset "hello"
1
sadd myset "world"
1
sadd myset "world"
0
smembers myset
1)"world"
2)"hello"
本例中,咱們向myset中添加了三個元素,但因爲第三個元素跟第二個元素是相同的,因此第三個元素沒有添加成功,最後咱們用smembers來查看myset中的全部元素。
2.srem
刪除名稱爲key的set中的元素member:
命令:
sadd myset2 "one"
1
sadd myset2 "two"
1
sadd myset2 "three"
1
srem myset2 "one"
1
srem myset2 "four"
0
smembers myset2
1)"three"
2)"two"
本例中,咱們向myset2中添加了三個元素後,再調用srem 來刪除one和four,但因爲元素
中沒有four因此,此條srem命令執行失敗sql
3.spop
隨機返回並刪除名稱爲key的set中一個元素
命令:
sadd myset2 "one"
1
sadd myset2 "two"
1
sadd myset2 "three"
1
spop myset2
1
smembers myset2
1)"one"
2)"two"
本例中,咱們向myset3中添加了三個元素後,再調用spop來隨機刪除一個元素,能夠看到three元素被刪除了。
4.sdiff
返回全部給定key與第一個key的差集學習
命令:
sadd myset2 "one"
1
sadd myset2 "two"
1
sadd myset3 "one"
1
sadd myset3 "three"
1
sdiff myset2 myset3
1)"one"
5.sdiffstore
返回全部給定key與第一個key的差集,並將結果存入另外一個key:測試
命令:
smembers myset2
1)"three"
2)"two"
smembers myset3
1)"two"
2)"one"
sdiffstore myset4 myset2 myset3
1
smembers myset4
1)"three"
6.sinter
返回全部給定key的交集spa
命令:
smembers myset2
1)"three"
2)"two"
smembers myset3
1)"two"
2)"one"
sinter myset2 myset3
1)"two"
本例的結果能夠看出 myset2和myset3的交集two被查出來了
7.sinterstore
返回全部給定key的交集,並將結果存爲另外一個key視頻
命令:
smembers myset2
1)"three"
2)"two"
smembers myset3
1)"two"
2)"one"
sinterstore myset5 myset2 myset3
1
smembers myset5
1)"two"
8.sunion
返回全部給定的key的並集對象
命令:
smember myset2
1)"three"
2)"two"
smembers myset3
1)"two"
2)"one"
sunion myset2 myset3
1)"three"
2)"one"
3)"two"blog
9.sunionstore
返回全部給定key的並集,並將結果存爲另外一個key排序
命令:
smembers myset2
1)"three"
2)"two"
smembers myset3
1)"two"
2)"one"
sunionstore myset6 myset2 myset3
3
smembers myset6
1)"three"
2)"one"
3)"two"
經過本例的結果能夠看出,myset2和myset3的並集被保存到myset6中
10.smove
從第一個key對應的set中移除member並添加到第二個對應set中
命令:
smembers myset2
1)"three"
2)"two"
smembers myset3
1)"two"
2)"one"
smove myset2 myset7 three
1
smembers myset7
1)"three"
經過本例能夠看到,myset2的three被移到myset7中了
11.scard
返回名稱爲key的set的元素個數
命令:
scard myset2
1
經過本例能夠看到,myset2的成員數量爲1
12.sismember
測試member是不是名稱爲key的set的元素
命令:
smember myset2
1)"two"
sismember myset2 two
1
sismember myset2 one
0
經過本例能夠看到,two是myset2的成員,而one不是
13.srandmember
隨機返回名稱爲key的set的一個元素,可是不刪除元素
命令:
smembers myset3
1)"two"
2)"one"
srandmember myset3
"two"
srandmember myset3
"one"
sorted sets數據類型及操做
sorted set是set的一個升級版本,它在set的基礎上增長了一個順序屬性,這一屬性在添加修改元素的時候能夠指定,每次指定後,zset會自動從新按新的值調整順序。能夠理解爲有兩列的mysql表,一列存value,一列存順序。操做中key理解爲zset的名字。和set同樣sorted set也是string類型元素的集合,不一樣的是每一個元素都會關聯一個double類型的score。sorted set的實現是skip list和hash table的混合體.當元素被添加到集合中時,一個元素到score的映射被添加到hash table中,因此給定一個元素獲取score的開銷是O(1),另外一個score到元素的映射被添加到skip list,並按照score排序,因此就能夠有序的獲取集合中的元素。添加,刪除操做開銷都是O(log(N))和skip list的開銷一致,redis的skip list實現用的是雙向鏈表,這樣就能夠逆序從尾部取元素。sorted set最常常的使用方式應該是做爲索引來使用.咱們能夠把要排序的字段做爲score存儲,對象的id當元素存儲。下面是sorted set相關命令
1.zadd
向名稱爲key的zset中添加元素member,score用於排序,若是該元素已經存在,則根據score更新該元素的順序
命令:
zadd myzset 1 "one"
1
zadd myzset 2 "two"
1
zadd myzset 3 "two"
0
zrange myzset 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"3"
本例中咱們向myzset中添加了one和two,而且two被設置了2次,那麼將以最後一次的設置爲準,最後咱們將全部元素都顯示出來並顯示出了元素的score。
2.zrem
刪除名稱爲key的zset中的元素member
命令:
zrange myzset 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"3"
zrem myzset two
1
zrange myzset 0 -1 withcscores
1)"one"
2)"1"
能夠看到two被刪除了
3.zincrby
若是在名稱爲key的zset中已經存在元素member,則該元素的score增長increment;不然向集合中添加該元素,其score的值爲increment
命令:
zadd myzset2 1 "one"
1
zadd myzset2 2 "two"
1
zincrby myzset2 2 "one"
"3"
zrange myzset2 0 -1 withscores
1)"two"
2)"2"
3)"one"
4)"3"
本例中將one的score從1增長了2,增長到了3
4.zrank
返回名稱爲key的zset中member元素的排名(按score從小到大排序)即下標
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
7)"five"
8)"5"
zrank myzset3 two
1
本例中將two下標是1,我這裏取的是下標,而不是score
5.zrevrank
返回名稱爲key的zset中member元素的排名(按score從大到小排序)
即下標
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
7)"five"
8)"5"
zrank myzset3 two
按從大到小排序的話two是第三個元素,下標是2
6.zrevrange
返回名稱爲key的zset(按score從大到小排序)
中的index從start到end的全部元素
命令:
zrevrange myzset3 0 -1 withscores
1)"five"
2)"5"
3)"three"
4)"3"
5)"two"
6)"2"
7)"one"
8)"1"
首先按score從大到小排序,再取出所有元素
7.zrangebyscore
返回集合中score在給定區間的元素
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
7)"five"
8)"5"
zrangebyscore myzset3 2 3 withscores
1)"two"
2)"2"
3)"three"
4)"3"
本例中,返回了score在2-3區間的元素
8.zcount
返回集合中score在給定區間的數量
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
7)"five"
8)"5"
zcount myzset3 2 3
2
本例中,計算了score在2~3之間的元素數目
9.zcard
返回集合元素個數
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
7)"five"
8)"5"
zcard myzset3
4
從本例看出myzset3這個集合的元素數量是4
10.zscore
返回給定元素對應的score
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
7)"five"
8)"5"
zscore myzset3 two
"2"
此例中咱們成功的將two的score取出來了。
11.zremrangebyrank
刪除集合中排名在給定區間的元素
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
7)"five"
8)"5"
zremrangebyrank myzset3 3 3
1
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
在本例中咱們將myzset3中按從小到大排序結果的下標爲3的元素刪除了。
12.zremrangebyscore
刪除集合中score在給定區間的元素
命令:
zrange myzset3 0 -1 withscores
1)"one"
2)"1"
3)"two"
4)"2"
5)"three"
6)"3"
zremrangebyscore myzset3 1 2
2
zrange myzset3 0 -1 withscores
1)"three"
2)"3"
在本例中咱們將myzset3中按從小到大排序結果的score在1~2之間的元素刪除了
注:Redis系列博客均是結合兄弟連Redis學習視頻的筆記!