redis支援的資料結構

爬蜥發表於2018-10-07
  • Binary-safe string:字串,Binary-safe的意思是它本身不會應為某些特殊字元而導致字串結束了,他可以包含任何字元。比如在C中,字串的結尾是’\0′,意味著這個字元之後的不能被當做當前字元的

  • Lists:儲存string的連結串列,儲存順序即插入順序 (不是通過陣列實現)

  • Sets:每個字串唯一的儲存集合

  • Sorted Sets:儲存的每一個字串都是唯一的,同時每個字串會具備一個score的屬性

  • Hashes:儲存key和value的對映關係,key和value都是string

  • Bit Array:像bit陣列一樣處理String值,每一個bit都可以set和clear,計算1的數量等等

  • HyperLogLogs:用來估計set中唯一值的個數

redis的key

key可以包含任意得字元,比如將一張JPEG檔案內容作為key。空字串也是一個有效的key。redis的key使用時,有一些建議:

  • key最好不要太長。超過1024bytes的key一個是佔用記憶體,再者每次去找key做匹配也是需要一些時間的

    可用通過hash來解決,比如使用SHA1

  • key太短也不好。比如”user:1000:followers”顯然比”u1000flw”擁有更好的可讀性,key本身的這點增長所需要的空間比起key物件和object物件來說可以忽略

    自己掌握好這裡頭的平衡

  • 嘗試遵循一定的模式。比如以”object-type:id”這種方式來作為key的規則

  • key最大512M

設定key過期

EXPIRE 命令用來設定過期

  • 過期的精度可以是秒或者毫秒

  • 過期時間的解析度一直是毫秒

  • 過期時間本身會被持久化,即使redis本身停止服務了,停服期間過期的時間還是同樣計算

使用 PERSIST 可以去掉過期時間,永久保留 key

String

SET 命令來設定 string型別值,它會替代已經儲存在redis中的key的值,即使原來儲存的值型別不是string

  • value大小不能超過512M
  • 如果SET值時,發現已經儲存,則不覆蓋原值,可以通過 set mykey myValue nx ,即後面跟 nx 來實現這種語義;另外如果僅想在key存在的時候覆蓋,可以通過 set mykey myValue xx 即後面跟 xx 來實現這種語義
  • 批量獲取使用MSET,對應GET為MGET
  • set key value ex 10 設定10秒後過期

INCR 命令會把 string 型別值當做integer,實現自增1,如果key不存在,它會被置為0,然後再自增1。如果 string 不能當做 integer 會丟擲異常

  • 自增的上限是64 bit的integer。
  • 類似的命令有 INCRBY ,可自定義增長的大小。其餘還有DECR DECRBY
  • INCR命令是原子操作。

EXISTS 判斷key是否存在

DEL 刪除key

TYPE 判斷key的型別

TTL 獲取key的存活時間

LIST

  1. LPUSH 命令向list頭新增元素只需要常量時間,可一次新增多個

  2. RPUSH 命令向list尾部新增元素只需要常量時間,可一次新增多個

  3. LRANGE 提取list中一定範圍內的元素,比如 lrange mylist 0 -1 ,範圍是兩個索引,都可以是負數,-1表示最後一個,-2表示倒數第2個,依此類推

  4. RPOP 返回list中的最後一個元素,並從list中移除它,如果沒有元素了就返回 NULL

  5. LTRIM 保留給定索引範圍之內的資料,list中的其餘值都刪掉

  6. BRPOP 從list中返會並刪除最後一個元素,如果列表沒有值,就阻塞,根據阻塞的時間,如果是0,就一直阻塞直到有值存在,大於0則阻塞相應的時間長度

  7. BLPOP 對應BRPOP操作第一個元素

使用brpop/blpop 需要注意:

  • 客戶端的請求處理是按照順序來的,第一個阻塞的當有其它客戶端插入資料會第一個處理
  • 它的返回會有兩個值
  • 超時返回NULL

自動建立和移除keys

當往redis中沒有對應key存在的集合中push元素或者刪除一個空的集合,redis需要主動的去建立空的集合或者是刪除沒有值的key。對應的操作有三條規則:

  • 當往集合中新增元素,如果目標的key不存在,在新增之前redis會首先建立一個空的集合
  • 當從集合中移除一個元素,如果value移除後是空的,key就會被刪掉
  • 使用形如 LLEN 的只讀命令,或者是使用移除元素的命令,來操作一個不存在的key,redis的表象就像key本身的value是一個空集合一樣

Hash

使用hash能夠用來代表一個物件,放到hash裡面的欄位數量理論上是沒有限制的

  1. hmset: 往hash中塞多個欄位
  2. hget:獲取當個的欄位
  3. hmget:以陣列形式返回值
  4. hincrby: 對單個欄位進行遞增操作
hmset user:1000 name paxi verified 1 a 10 //塞入user的多個欄位hget user:1000 name  //獲取name欄位值hmget user:1000 name verified //以陣列形式返回值,key不存在返回nullhincrby user:1000 a 10 //將欄位a增加10複製程式碼

Set

set在redis中用來儲存string的無序集合。

  1. sadd:往set中新增新的元素,可以單個或者批量的新增
  2. smembers:獲取set中的所有元素
  3. sismember:校驗某個元素是不是屬於給定結合
  4. sinter:獲取多個set的交集
  5. spop:從set中隨機刪除一個元素,並返回它的值
  6. sunionstore:取多個set中的並集
  7. scard:計算set中唯一值的個數(集合論中的基數)
 sismember myset 1 //判斷 1 是不是在集合 myset中sunionstore myset1 myset2 //假如 myset1不存在,就相當於把 myset2 中的元素拷貝到了 myset1複製程式碼

Sorted sets

用來儲存唯一的string,它每一個值都包含一個score屬性,它會根據如下規則排序

  • 如果A和B兩個元素有有不同的score,且 A.score >
    B.score,那麼 A>
    B
  • 如果A和B有著一樣的score,如果從字面排序上A比B要排在前面,那麼 A>
    B

它內部實現是 dual-ported資料結構 ,內部同時包含了 skip list和 hash table,每次新增元素的時間是O(lgN),但是獲取的時間是常量的

  1. zadd:往 sorter sets中新增元素,可以同時新增多個,新增同樣的key則會更新元素本身的score
  2. zrange:按順序獲取集合中一段索引範圍之內的元素
  3. zrevrange:按逆序獲取集合中一段索引範圍之內的元素
  4. zrangebyscore:取score範圍內的元素
  5. zremrangebyscore:移除score範圍內的元素
  6. zrank:獲取特定key的排序位置
zadd hackers 1940 “Alan Kay” //往 hackers中新增 “Alan key” 它的score是1940zrange hackers 0 -1 withscores //按照順序獲取hackers中的所有元素,0表示第一個,-1表示最後一個,同時返回對應元素的分數zrevrange hackers 0 -1 //按照逆序複製程式碼

Bitmaps

它並非一種資料結構,而是在string型別上定義的一種面向bit的操作。它最大的優勢是能節省空間

  1. setbit :設定key的特定位置的bit值為0或者1,當key的長度不夠會自動擴充
  2. getbit:返回特定索引位置的bit值,範圍外的bit返回0
  3. bitop:提供bit級別的操作,包括 AND OR XOR NOT
  4. bitcount:計算bit值是1的個數
  5. bitpos:找到第一個指定的值(指定0或者1)的位置

HyperLogLogs

它是一種概率資料結構,用來統計唯一的值。一般統計唯一的值的時候,需要記錄所有已經訪問過的元素,這會消耗大量的記憶體,但是使用HyperLogLogs只需要使用常量的記憶體,最差的情況下愛只需要12k,此時的精度不會差於1%。

  1. pfadd: 往 其中新增元素
  2. pfcount:計算元素的個數

HyperLogLogs實際只儲存了一個狀態,並不包含真實的元素的值

redis 官網介紹

來源:https://juejin.im/post/5bb971f85188255c791b194f

相關文章