Redis 五種數據結構詳解(string,hash,list,set,zset)


一、五種數據結構:

1. String——字符串

      String 數據結構是簡單的 key-value 類型,value 不僅可以是 String,也可以是數字(當數字類型用 Long 可以表示的時候encoding 就是整型,其他都存儲在 sdshdr 當做字符串)。使用 Strings 類型,可以完全實現目前 Memcached 的功能,並且效率更高。還可以享受 Redis 的定時持久化(可以選擇 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。

字符串常用的語法:

    ① 賦值:set  string1  hello

    ② 取值:get  string1

    ③ 刪除:del  string1 (這個命令可以用於所有的類型)

    ④ 數值加一:incr   num1            如果值為空,則默認從0加一,如果值無法轉為數字,則報異常。

    ⑤ 數值減一:decr   num1           如果值為空,則默認從0減一,如果值無法轉為數字,則報異常。

    ⑥ 數值增加指定的數值:incrby  num1  2

    ⑦ 數值減少指定的數值:decrby  num1  2

    ⑧ 拼接:append  num1  123       如果值存在就拼接,如果不存在就新增 

2. Hash——哈希

       在 Memcached 中,我們經常將一些結構化的信息打包成 hashmap,在客戶端序列化后存儲為一個字符串的值(一般是 JSON 格式),比如用戶的昵稱、年齡、性別、積分等。這時候在需要修改其中某一項時,通常需要將字符串(JSON)取出來,然后進行反序列化,修改某一項的值,再序列化成字符串(JSON)存儲回去。簡單修改一個屬性就干這么多事情,消耗必定是很大的,也不適用於一些可能並發操作的場合(比如兩個並發的操作都需要修改積分)。而 Redis 的 Hash 結構可以使你像在數據庫中 Update 一個屬性一樣只修改某一項屬性值。

哈希表常用的語法:

    ① 賦值:hset myhash age 18

    ② 取值:hget myhash age

    ③ 賦多個值:hmset myhash name zhangsan age 21

    ④ 取多個值:hmget myhash name age

    ⑤ 獲得所有鍵值對:hgetall myhash

    ⑥ 移除:hdel myhash name age

3. List——列表

       List 說白了就是鏈表,插入刪除數據非常快。可以用於消息中間件的補救措施,比如消息隊列中的消息發送成功存入一個鏈表,發送失敗存入一個鏈表,一段時間后將發送成功的鏈表清空,發送失敗的鏈表中的消息繼續發送,直到成功后存入成功的鏈表,目的是為了保證數據的一致性。

(1) ArrayList使用數組方式:根據索引去查詢速度非常快,但是新增與刪除元素時需要涉及到位移操作,效率比較低

(2)LinkedList使用雙向鏈接方式:每個元素都記錄了前后元素的指針,插入和刪除數據時,只是改變了前后元素指針所指向的元素,速度快。

     ① lpush: 左側插入 如:lpush  mylist  a b c  返回3,表示是數量。  lpush  mylist  1 2 3  返回6

     ② rpush: 右側插入 如:rpush  mylist  a b c  返回3,表示是數量。  rpush  mylist  1 2 3  返回6

     ③ lrange: 查看列表,從哪開始到哪結束,0:表示從鏈表的頭部開始,-1表示從鏈表的尾部第一個元素開始,-2表示從鏈表的尾部第二個元素開始

      如:lrange mylist 0 5,返回:3,2,1,c,b,a.

             lrange mylist 0 -1,返回:a,b,c,1,2,3.

             lrange mylist 0 -2,返回:a,b,c,1,2

      ④ lpop: 左彈出,它會返回並彈出指定key所關聯的那個鏈表中的第一個元素,不存在返回nil

           如:lpop mylist,返回3,彈出之后,里面就沒有這個元素了,

                  lrange mylist 0 -1,返回的結果中,不在有這個元素。

      ⑤ rpop: 右彈出,如rpop mylist2,彈出3,

                  lrange mylist2 0 -1,查看,這個元素已經不存在了。

      ⑥ llen: 獲取列表中的元素個數,如果這個列表不存在,則返回0,

          如: llen mylist,返回5.

      ⑦ lpushx: 僅當我們參數中指定的key存在時,可以向關聯的list的頭部去插入一個值,如果不存在,就不會進行插入,返回0。

            如:lpushx mylisy x,表示將x插入到鏈表的頭部,

                   lrange mylist 0 -1,可以看到新插入的元素。

      ⑧ rpushx:僅當我們參數中指定的key存在時,可以向關聯的list的尾部去插入一個值,如果不存在,就不會進行插入,返回0。

           如:rpushx mylist2 y ,表示向mylist2列表的尾部插入一個元素y,

                 lrange mylist2 0 -1,查看,可以看到y元素在最后面。

      ⑨ lrem:寫上具體的一個key,后面會跟上一個count,value。它會刪除count個為value的元素,如果count大於0,它就會從頭向尾遍歷,並刪除count個為value的元素,如果count小於0,它會從后面向前面遍歷。如果count等於0,則刪除鏈表中所有等於value的元素。

          如:lrem mylist3 2 3, 表示從頭到尾刪除2個3.

                  lrem mylist3 -2 1,表示從后面向前刪除2個1.

                  lrem mylist3 0 2,表示刪除mylist3中的所有2.

     ⑩ lset: 來設置列表中的某個index的角標的元素的值。0表示第一個元素,-1表示最尾的元素。我們可以操作鏈表的角標,如果不存在,就拋出異常。

           如:lset mylist 3 mm,表示將鏈表mylist的第三個值設置為mm.

     11. linsert: 在某個元素的前或后插入某個元素,如linsert mylist4 before b 11,表示在mylist4鏈表中的b之前插入11。

           linsert mylist4 after b 22,表示在mylist4鏈表中的b后面插入22 rpoplpush: 將鏈表中的尾部元素彈出,並添加到頭部。

     12. rpoplpush mylist5 mylist5,表示將鏈表mylist5中的一個元素彈出,壓入到鏈表mylist6中,返回1,表示成功。

 

rpoplpush使用場景:

4. Set——集合

       Set 是一個無重復數據的無序集合,集合的概念就是一堆不重復值的組合。利用 Redis 提供的 Set 數據結構,可以存儲一些集合性的數據。比如在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。因為 Redis 非常人性化的為集合提供了求交集、並集、差集等操作,那么就可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。

     ① sadd myset 1 2 3   向set中增加元素,不允許重復 

     ② srem myset 1 2      刪除數據 

     ③ smember myset     所有的值 

     ④ sismember myset a   0不存在 1存在 

     ⑤ sdiff myset1 myset2       差集運算 

     ⑥ sinter myset1 myset2     交集運算 

     ⑦ sunion myset1 myset2   並集運算

     ⑧ scard myset set   長度

     ⑨ srandmenber myset   隨機獲取 value 

     ⑩ sdiffstore my1 mya1 myb1       將 mya1/b1的差集存入 my1

     11.sinterstore my1 mya1 myb1     將 mya1/b1的交集存入 my1

     12.sunionstore my1 mya1 myb1   將 mya1/b1的並集存入 my1

5. Sorted Set——有序集合

      和Sets相比,Sorted Sets是將 Set 中的元素增加了一個權重參數 score,使得集合中的元素能夠按 score 進行有序排列,比如一個存儲全班同學成績的 Sorted Sets,其集合 value 可以是同學的學號,而 score 就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。另外還可以用 Sorted Sets 來做帶權重的隊列,比如普通消息的 score 為1,重要消息的 score 為2,然后工作線程可以選擇按 score 的倒序來獲取工作任務。讓重要的任務優先執行。

     ① zadd mysort 70 zhangsan 80 lisi

     ② zadd mysort 100 zhangsan:如果元素存在,會覆蓋掉之前的分數

     ③ zcard mysort:獲取成員的數量

     ④ zscore mysort zhangsan:獲取成員的分數

     ⑥ zrem mysort zhangsan:刪除某個成員

     ⑦ 范圍查找:zrange mysort  0  -1

     zrange mysort 0 -1 withscores(顯示分數)

     ⑧ 排序(降序):zrevrange mysort 0 -1 withscores

     ⑨ 按照排名的范圍進行刪除:zremrangebyrank mysort 0 4

     ⑩ 按照分數的范圍進行刪除:zremrangebyscore mysort 80 100

擴展:

      返回分數在某個區間的成員,並按照分數降序排列:

      zrangebyscore mysort 0 100 withscore limit 0 2

      限制返回2條數據

      設置指定成員增加的分數(給zhangsan加3分):zincrby mysort 3 zhangsan

      分數在某個區間的成員個數:zcount mysort 80 90

 

二、key的常用操作:

查看所有的key:keys *

查看包含指定字符的key:keys my?

刪除key:del key1 key2

判斷key是否存在:exists my1

重命名key:rename myname mynewname

設置key的超時時間(單位是秒):expire mynewname 1000

查看key剩余時間:ttl mynewname(沒有設置時間則返回-1)

查看key的類型:type mysort

 

 

深入學習門戶:
Redis命令API:http://redisdoc.com/

Redis命令參考:http://www.runoob.com/redis/redis-commands.html

Redis數據結構使用場景:http://www.runoob.com/w3cnote/redis-use-scene.html

---------------------------------------------------------------------------------------------------------------------------

轉載請注明出處:https://www.cnblogs.com/HelloXTF/p/10683485.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM