<ruby id="xh9j9"></ruby>

<th id="xh9j9"></th>

    1. <rp id="xh9j9"><object id="xh9j9"></object></rp>
      <rp id="xh9j9"></rp>

        首頁 > 編程學習 > Redis---set集合

        Redis---set集合

        發布時間:8/16/2022 6:35:34 PM

        1. 前言

        Redis set (集合)遵循無序排列的規則,集合中的每一個成員(也就是元素,叫法不同而已)都是字符串類型,并且不可重復。Redis set 是通過哈希映射表實現的,所以它的添加、刪除、查找操作的時間復雜度為 O(1)。集合中最多可容納 2^32 - 1 個成員(40 多億個)。
        Redis set 使用以下方式向集合中添加一個成員,語法格式如下:

        127.0.0.1:6379> SADD key member [member ...]  
        • key:指定一個鍵
        • member:集合中要存儲的成員。


        和其他數據類型一樣,當集合中最后一個成員被刪除時,存儲成員所用的數據結構也會被自動刪除。

        集合有一個非常重要的特性就是“自動去重”,這使得它可以適用于許多場景,比如過濾掉已中獎用戶的 id,保證該用戶不會被第二次抽中。

        2. 認識set集合

        1) intset 

        Redis set 采用了兩種方式相結合的
        底層存儲結構,分別是 intset(整型數組)與 hash table(哈希表),當 set 存儲的數據滿足以下要求時,使用 intset 結構:

        • 集合內保存的所有成員都是整數值;
        • 集合內保存的成員數量不超過 512 個。


        當不滿足上述要求時,則使用 hash table 結構。

        Redis 中 intset 的結構體定義如下:

        typedf struct inset{
            uint32_t encoding;//指定編碼方式,默認為INSET_ENC_INT16
            uint32_t length;//集合內成員的總個數
            int8_t contents[];//實際存儲成員的數組,并且數組中的數值從小到大依次排列
        }inset;
        • encoding:用來指定編碼格式,共有三種,分別是 INTSET_ENC_INT16、INSET_ENC_INT32 和 INSET_ENC_INT64,它們對應不同的數值范圍。Redis 為了盡可能地節省內存,它會根據插入數據的大小來選擇不同的編碼格式。
        • length:集合內成員的數量,記錄 contents 數組中共有多少個成員。
        • contents:存儲成員的數組,數組中的成員從小到大依次排列,且不允許重復。


        intset 結構示意圖如下所示:

        集合intset數據結構

         

        在《Redis hash哈希散列(圖解)》

        一節,我們已經對哈希表原理做了講解, set 的哈希表與其相似,這里不再贅述。

         

        3. 命令匯總

        set類型常用命令
        命令說明
        SADD key member1 [member2] 向集合中添加一個或者多個元素,并且自動去重。
        SCARD key 返回集合中元素的個數。
        SDIFF key1 [key2] 求兩個或多個集合的差集。
        SDIFFSTORE destination key1 [key2] 求兩個集合或多個集合的差集,并將結果保存到指定的集合中。
        SINTER key1 [key2] 求兩個或多個集合的交集。
        SINTERSTORE destination key1 [key2] 求兩個或多個集合的交集,并將結果保存到指定的集合中。
        SISMEMBER key member 查看指定元素是否存在于集合中。
        SMEMBERS key 查看集合中所有元素。
        SMOVE source destination member 將集合中的元素移動到指定的集合中。
        SPOP key [count] 彈出指定數量的元素。
        SRANDMEMBER key [count] 隨機從集合中返回指定數量的元素,默認返回 1個。
        SREM key member1 [member2] 刪除一個或者多個元素,若元素不存在則自動忽略。
        SUNION key1 [key2] 求兩個或者多個集合的并集。
        SUNIONSTORE destination key1 [key2] 求兩個或者多個集合的并集,并將結果保存到指定的集合中。
        SSCAN key cursor [match pattern] [count count] 該命令用來迭代的集合中的元素。

        4. 命令演示

        Redis 集合有特定的應用場景,比如用戶的共同關注場景就可以使用 set 來實現。下面看一組示例,其中 user:1 與 user:2 代表兩個用戶,他們都關注了一些編程課程:

        #創建集合并添加多個成員
        127.0.0.1:6379> SADD user:1 python java mysql
        (integer) 3
        127.0.0.1:6379> SADD user:2 python c redis
        (integer) 3
        #對兩個集合求交集,求出他們共同關注的編程技術
        127.0.0.1:6379> SINTER user:1 user:2
        1) "python"
        #兩個集合求并集
        127.0.0.1:6379> SUNION user:1 user:2
        1) "java"
        2) "python"
        3) "mysql"
        4) "redis"
        5) "c"
        #查看集合所有成員
        127.0.0.1:6379> SMEMBERS user:1
        1) "mysql"
        2) "java"
        3) "python"
        #兩個集合求并集,并把結果保存到另外一個user:3集合中
        127.0.0.1:6379> SUNIONSTORE user:3 user:1 user:2
        (integer) 5
        #查看集合所有成員
        127.0.0.1:6379> SMEMBERS user:3
        1) "java"
        2) "python"
        3) "mysql"
        4) "redis"
        5) "c"
        #從集合中彈出一個元素
        127.0.0.1:6379> SPOP user:1 1
        1) "python"
        #從集合中彈出兩個元素
        127.0.0.1:6379> SPOP user:1 2
        1) "mysql"
        2) "java"
        #查看集合元素個數
        127.0.0.1:6379> SCARD user:2
        (integer) 3
        #迭代集合中元素
        127.0.0.1:6379> SSCAN user:3 0
        1) "0"
        2) 1) "mysql"
           2) "redis"
           3) "java"
           4) "python"
           5) "c"

        在線練習工具:https://try.redis.io/
        查看更多命令:https://redis.io/commands

        Copyright ? 2010-2022 wtld.cn 版權所有 |關于我們| 聯系方式
        日本精品人妻

        <ruby id="xh9j9"></ruby>

        <th id="xh9j9"></th>

        1. <rp id="xh9j9"><object id="xh9j9"></object></rp>
          <rp id="xh9j9"></rp>