Redis之datatype概述

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服務器(即發佈與訂閱)
相關文章
相關標籤/搜索