Redis支持的數據類型
String
List
Set
Sorted Set
Hashes
Bit array
HyperLogLog
Binary-safe strings :
Redis的鍵是二進制安全的,可使用任何的二進制序列做爲鍵.
好比"foo"這樣的字符串,甚至是JPEG文件的二進制內容.
空串""也是合法的鍵.
不推薦使用特別長的鍵.
影響性能,作鍵的比較,查找鍵是很耗費性能的.
同時對帶寬以及內存要求很大.若是當前的任務是匹配大值的存在.
建議使用hash,好比SHA1 , MD5等.
不推薦使用特別短的鍵.
例如使用"user:1000:followers"而不是"u1000flw".
前者明顯可讀性高,並且增長的空間較小.
堅持用統一的命名結構
好比 "object-type:id"
使用"."或"-"來表示由多個詞語組成的字段.
好比"comment:1234:reply.to"或者"comment:1234:reply-to"
鍵的最大長度是512MB
這裏的最大長度指的是單個key的長度.
對於value一樣限制的是512MB.
List
List有兩種底層實現機制 : 一種是基於array,而另外一種是基於linked list.
而Redis中的list就是基於後者(linked list).
這樣作的好處就是
在list頭部/尾部 添加數據的時候,均可以以很快的速度去處理,無論你是添加1條數據,仍是插入1億條數據效率上都是差很少的.
壞處就是
當你訪問list的時候,隨着index的變大,消耗的時間也將成比例增長.
若是訪問一個比較大的list 中間的元素的需求比較重要的話,建議使用sorted set.
經常使用命令 :
LPUSH , RPUSH , LPOP , RPOP , LRANGE , LTRIM ..
LRANGE
接受3個參數 : 一個list實例參數,兩個index參數(起始位置,結束位置)
兩個index參數都可覺得負數, 表示list.size() - index 處的元素的索引數;
LRANGE mylist 0 -3
LPUSH/RPUSH
它們的參數是可變長的參數.
具體來講第一個參數接收一個list實例,後面n個參數均是要添加到list最開始/最末端 的元素.多個參數之間用空格分割
LPUSH mylist 12 4 www "ss"
LTRIM
相似於LRANGE , 所不一樣的是 LRANGE只是爲了展示,而LTRIM會將在它抽取的範圍外的元素都給移除.
和LPUSH合做,能夠實現保留最新多少條數據.
LPUSH mylist 100 3 4
LTRIM mylist 0 999
LPOP/RPOP 將list最前端/最尾端的元素返回回來,而且將它從源list中刪除掉.
能夠和PUSH操做一塊兒使用實現生產者消費者模式.
list最廣泛的兩個表明性用法
1).記載用戶發佈到社交網絡的最新更新.
2).使用消費者-生產者模式進行進程之間的通訊:
生產者向一個list中添加元素;
消費者消耗這些元素,並執行操做.
Redis提供了一些list命令來保證這種作法的高效性以及可靠性.
list擁有一個特性使得它適合實現 隊列 , 而且一般做爲進程間通訊系統的構建塊.這個特性就是BLPOP 和 BRPOP .是個阻塞操做.
Note :
正常來說 生產者消費者模式, 當消費者向list索取元素的時候,發現該隊列爲空, 那麼,消費者一般會進行等待一下子,而後再重試索取(這個過程叫輪詢),
這樣,會致使redis以及客戶端都作了不少無用的命令行操做.
所以Redis提供了兩個阻塞型的 pop 操做.
當list爲空時,只有當新的元素被添加到list中後或者達到了用戶指定的超時時間,BRPOP/BLPOP指令纔會返回給調用者(一個結果).
demo :
BRPOP tasks 5 --等待tasks中的元素,若是超過5秒鐘沒有能夠用的元素,就返回.
若是timeout參數 設置爲 0 , 那麼會永遠等待新元素(不會超時,一直阻塞).
其中list參數能夠接受 多個列表,好比task1 task2 .. , 當有一個列表任務有新增元素,就返回pop的結果.
關於BRPOP/BLPOP的一些須要注意的事情:
1).客戶端是按照順序來享受服務的
第一個客戶端阻塞的來等待一個list,那麼當有新的元素被其它的客戶端push進來,那麼它(即第一個客戶端)將會首先享受這個服務.
2).和RPOP/LPOP的返回值不一樣
它是個包含鍵名的雙元素的數組,由於BRPOP/BLPOP能夠同時阻塞式地從多個list列表中等待元素.
3).若是過時時間的閥值到了,將返回NULL
關於list以及阻塞操做的更多內容:
1).可使用RPOPLPUSH指令 來構建更安全的隊列 或者 旋轉隊列.
2).redis提供了一個阻塞的變種指令 : BRPOPLPUSH
主鍵的自動建立與刪除
三條規則來總結:
1). 當咱們添加一個元素到聚合數據類型,若是目標關鍵字不存在,在添加這個元素以前會(自動)建立一個空的聚合數據類型.
2). 當咱們從聚合數據類型中移除元素的時候, 若是該值是空的,那麼鍵也將自動被銷燬.
3).調用 只讀命令/移除元素的寫命令 在一個空的關鍵字上,永遠會返回一樣的結果,好像該關鍵字正持有命令行但願找到空的數據類型.
Hashes (散列)
鍵值對 , 能夠理解爲java中的對象或map.
demo :
hmset user:1000 uname antirez birthyear 1977 verified 1
hget user:1000 uname
hget user:1000 birthyear
hgetall user:1000
hmget user:1000 uname birthyear no-such-field
hincrby user:1000 uname birthyear 10
Set
redis中的set是字符串類型的無序集合.
可使用SADD指令添加元素.
若是給定的元素已經存在,還能夠作不少其它的操做,好比作交集,並集處理,或者比較多個set的不一樣之處.
sadd myset 1 2 3
smembers myset
sismember myset 3 --檢查元素3是否在set中存在
sinter tag:1:news tag:2:news tag:10:news tag:27:news --對這些set取交集
sunionstore game:1:deck deck -- 合併多個set
spop game:1:deck -- 從set中隨機取出一個元素,並在該set中刪除該元素
scard game:1:deck --返回該set集合中元素的個數
sandmember game:1:deck --返回set中的一個隨機元素,對源set沒有影響
Sorted Set
Sorted Set像是Set以及Hash的混合體.
排序規則:
1).按照score(一個設置的浮點值)從小到大順序排列的.
2).若是score一致,那麼按照value的字段順序排列
實踐注意:
Sorted Set實現自兩個接口(dual-ported) : skip list 以及 hash table
所以每次添加元素的時候,以O(log(N))複雜度進行操做. 這個複雜度是ok的.
但取數的時候,redis幾乎不用作什麼額外操做,由於順序是已經排列好的.
經常使用命令
ZADD some_set any_score the_element
ZRANGE some_set start_index end_index [withscores]
ZREVRANGE some_set start_index end_index [withsores]
ZRANGEBYSCORE some_set -inf any_score
ZREMRANGEBYSCORE some_set any_start_score any_end_score
ZREVRANK some_set
#如下命令是基於字典而非score來取得結果的
ZRANGEBYLEX , ZREVRANGEBYLEX , ZREMRANGEBYLEX , ZLEXCOUNT
demo : zrangebylex hackers [B [P -- 表示閉區間
注意,全部*range*的操做,都會把這些元素從set中刪除哦~
Bitmap
Bitmap 並不是是一種數據類型.而是String類型上的一組"面向-位"的操做.
因爲String是二進制安全的大文本(能夠有512M大小),所以就有了 2^32種不一樣的位組合.
bit操做分爲兩組 : 常量時間-單個位 的操做 ; bit組的操做(即多個bit的批量操做).
經常使用命令 SETBIT , GETBIT , BITOP , BITCOUNT , BITPOS
bitmap廣泛使用場景 :
1).各類實時分析
2).存儲和對象id關聯的boolean信息, 高效而又節省空間
HyperLogLog (如下簡稱HLL)
redis提供的一種機率數據結構.用於計算惟一事物(技術上來說,是指估計一個集合的基數).
若是用其它方式,會消耗成比例的內存來實現.
而是用redis提供的hyperloglog,能夠獲得比較精確的統計結果,這個結果相比真實結果,偏差小於1%.
使用 PFADD 來添加計數 ; 使用 PFCOUNT 來查詢集合中的基數.
HLL中不會真的存儲這些元素,該數據結構只保存一個狀態.
Redis的其它顯著特性
1).支持 對大集合的中的鍵空間進行逐步迭代
2).能夠雲信Lua腳本服務器端 來提高延遲和帶寬
3).Redis也是一個pub-sub服務器(即發佈與訂閱)