-
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
-
LPUSH 命令向list頭新增元素只需要常量時間,可一次新增多個
-
RPUSH 命令向list尾部新增元素只需要常量時間,可一次新增多個
-
LRANGE 提取list中一定範圍內的元素,比如
lrange mylist 0 -1
,範圍是兩個索引,都可以是負數,-1表示最後一個,-2表示倒數第2個,依此類推 -
RPOP 返回list中的最後一個元素,並從list中移除它,如果沒有元素了就返回 NULL
-
LTRIM 保留給定索引範圍之內的資料,list中的其餘值都刪掉
-
BRPOP 從list中返會並刪除最後一個元素,如果列表沒有值,就阻塞,根據阻塞的時間,如果是0,就一直阻塞直到有值存在,大於0則阻塞相應的時間長度
-
BLPOP 對應BRPOP操作第一個元素
使用brpop/blpop 需要注意:
- 客戶端的請求處理是按照順序來的,第一個阻塞的當有其它客戶端插入資料會第一個處理
- 它的返回會有兩個值
- 超時返回NULL
自動建立和移除keys
當往redis中沒有對應key存在的集合中push元素或者刪除一個空的集合,redis需要主動的去建立空的集合或者是刪除沒有值的key。對應的操作有三條規則:
- 當往集合中新增元素,如果目標的key不存在,在新增之前redis會首先建立一個空的集合
- 當從集合中移除一個元素,如果value移除後是空的,key就會被刪掉
- 使用形如 LLEN 的只讀命令,或者是使用移除元素的命令,來操作一個不存在的key,redis的表象就像key本身的value是一個空集合一樣
Hash
使用hash能夠用來代表一個物件,放到hash裡面的欄位數量理論上是沒有限制的
- hmset: 往hash中塞多個欄位
- hget:獲取當個的欄位
- hmget:以陣列形式返回值
- 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的無序集合。
- sadd:往set中新增新的元素,可以單個或者批量的新增
- smembers:獲取set中的所有元素
- sismember:校驗某個元素是不是屬於給定結合
- sinter:獲取多個set的交集
- spop:從set中隨機刪除一個元素,並返回它的值
- sunionstore:取多個set中的並集
- 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),但是獲取的時間是常量的
- zadd:往 sorter sets中新增元素,可以同時新增多個,新增同樣的key則會更新元素本身的score
- zrange:按順序獲取集合中一段索引範圍之內的元素
- zrevrange:按逆序獲取集合中一段索引範圍之內的元素
- zrangebyscore:取score範圍內的元素
- zremrangebyscore:移除score範圍內的元素
- 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的操作。它最大的優勢是能節省空間
- setbit :設定key的特定位置的bit值為0或者1,當key的長度不夠會自動擴充
- getbit:返回特定索引位置的bit值,範圍外的bit返回0
- bitop:提供bit級別的操作,包括 AND OR XOR NOT
- bitcount:計算bit值是1的個數
- bitpos:找到第一個指定的值(指定0或者1)的位置
HyperLogLogs
它是一種概率資料結構,用來統計唯一的值。一般統計唯一的值的時候,需要記錄所有已經訪問過的元素,這會消耗大量的記憶體,但是使用HyperLogLogs只需要使用常量的記憶體,最差的情況下愛只需要12k,此時的精度不會差於1%。
- pfadd: 往 其中新增元素
- pfcount:計算元素的個數
HyperLogLogs實際只儲存了一個狀態,並不包含真實的元素的值