關於點陣圖,可能大家不太熟悉, 那麼點陣圖能幹啥呢?點陣圖的內容其實就是普通的字元串,也就是byte數組,我們都知道 byte 8 位無符號整數 0 到 255 說個場景。比如你處理一些業務時候,往往會存在 是或者不是 這樣的數據,那麼這種數據還是頻繁去查看和請求,從數據方面和請求次數方面都是非常的大的。 ...
關於點陣圖,可能大家不太熟悉,
那麼點陣圖能幹啥呢?點陣圖的內容其實就是普通的字元串,也就是byte數組,我們都知道
byte | 8 位無符號整數 | 0 到 255 |
說個場景。比如你處理一些業務時候,往往會存在 是或者不是 這樣的數據,那麼這種數據還是頻繁去查看和請求,從數據方面和請求次數方面都是非常的大的。那麼Redis點陣圖可以幫你解決。每天的記錄只占據一個位,他的存儲格式:0 1 0 1 0 1。在操作方面我們可以使用:get/set, gitbit/setbit等將byte數組看成【位數組】來處理。
說說他的特性:
位數組是自動擴展的,如果超出現有內容範圍,它會自動將位數組進行零擴充。
當然一般這種業務數據,都往往少不了統計,查找,那麼點陣圖指令統計bitcount和查找bitpos。bitcount 用來統計指定位置範圍內 1 的個數,bitpos 用來查找指定範圍內出現的第一個 0 或 1。
bitpos指定的範圍是【start,end】。註意的是start 和 end 參數是位元組索引,也就是說指定的位範圍必須是 8 的倍數,
當然,我們都知道之前指定的點陣圖都是單個位的,當然也有一次操作多個位的,不過必須用管道,不過從3.2版本後。有個bitfield,有三個指令,分別是:get/set/incrby,它們都可以對指定位片段進行讀寫,但是最多只能處理 64 個連續的位,如果超過 64 位,就得使用多個子指令,bitfield 可以一次執行多個子指令。
BITFIELD mykey INCRBY i5 100 1 GET u4 0
當需要一個整型時,有符號整型需在位數前加i,無符號在位數前加u
。例如,u8
是一個8位的無符號整型,i16
是一個16位的有符號整型。有符號整型最大支持64位,而無符號整型最大支持63位。對無符號整型的限制,是由於當前Redis協議不能在響應消息中返回64位無符號整數。
所謂有符號數是指獲取的位數組中第一個位是符號位,剩下的才是值。如果第一位是 1,那就是負數。無符號數表示非負數,沒有符號位,獲取的位數組全部都是值。有符號數最多可以獲取 64 位,無符號數只能獲取 63 位 (因為 Redis 協議中的 integer 是有符號數,最大 64 位,不能傳遞 64 位無符號值)。如果超出位數限制,Redis 就會告訴你參數錯誤。