Redis學習(4)-數據類型set和zset

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學習視頻的筆記!

相關文章
相關標籤/搜索