redis學習計划(七)redis常用數據類型 String的擴展bitmap


1.Bitmap簡介

我的redis學習基本都是根據www.redis.cn來學習,看的當中發現了一個bitmaps,以為是一個特有的數據類型。看了看資料,bitmaps的基本命令都在string的的命令當中。

因為redis的key和value本身就支持二進制的存儲方式,所以bitmaps只是一個獨特的擴展。因為是面向字節操作,所以他的最大長度就是512M,最適合設置成2^32個不同字節。

一般的使用場景都是單一的統計,效率較高。比如簽到啊,比如點擊啊。有人可能會說用set也可以做出類似操作,的確,set就有類似功能,但是不同的實現會有不同的側重點,

此就是相對於map效率高了很多。本身的存儲方式就決定了他的效率。

 

2.Bitmap相關命令

1)

命令:SETBIT key offset value

時間復雜度:O(1)

命令描述:對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。位的設置或清除取決於 value 參數,可以是 0 也可以是 1 。當 key 不存在時,自動生成一個新的字符串值。字符串會進行伸展(grown)以確保它可以將 value 保存在指定的偏移量上。當字符串值進行伸展時,空白位置以 0 填充。offset 參數必須大於或等於 0 ,小於 2^32 (bit 映射被限制在 512 MB 之內)。

返回值:指定偏移量原來儲存的位。

(2

命令:GETBIT key offset

時間復雜度:O(1)

命令描述:對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。當 offset 比字符串值的長度大,或者 key 不存在時,返回 0 。

返回值:字符串值指定偏移量上的位(bit)。

(3

命令:BITCOUNT key [start] [end]

時間復雜度:O(N)

命令描述:計算給定字符串中,被設置為 1 的比特位的數量。一般情況下,給定的整個字符串都會被進行計數,通過指定額外的 start 或 end 參數,可以讓計數只在特定的位上進行。start 和 end 參數的設置和 GETRANGE 命令類似,都可以使用負數值:比如 -1 表示最后一個位,而 -2 表示倒數第二個位,以此類推。不存在的 key 被當成是空字符串來處理,因此對一個不存在的 key 進行 BITCOUNT 操作,結果為 0 。

返回值:被設置為 1 的位的數量。

(4

命令:BITOP operation destkey key [key ...]

時間復雜度:O(N)

命令描述:對一個或多個保存二進制位的字符串 key 進行位元操作,並將結果保存到 destkey 上。

operation 可以是 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種:

  • BITOP AND destkey key [key ...] ,對一個或多個 key 求邏輯並,並將結果保存到 destkey 。
  • BITOP OR destkey key [key ...] ,對一個或多個 key 求邏輯或,並將結果保存到 destkey 。
  • BITOP XOR destkey key [key ...] ,對一個或多個 key 求邏輯異或,並將結果保存到 destkey 。
  • BITOP NOT destkey key ,對給定 key 求邏輯非,並將結果保存到 destkey 。

除了 NOT 操作之外,其他操作都可以接受一個或多個 key 作為輸入。

處理不同長度的字符串當 BITOP 處理不同長度的字符串時,較短的那個字符串所缺少的部分會被看作 0 。空的 key 也被看作是包含 0 的字符串序列。

當處理大型矩陣(matrix)或者進行大數據量的統計時,最好將任務指派到附屬節點(slave)進行,避免阻塞主節點。

返回值:保存到 destkey 的字符串的長度,和輸入 key 中最長的字符串長度相等。

 

ps:

  • 第一個,就是bitcount命令,在使用start,end的時候一定要注意,setbit和getbit命令操作的是bit,但是bitcount用的是byte來計算位數,兩者差了8倍,因此這點很容易采坑,也不建議用。

  • setbit的offset是用大小限制的,在0到 232(最大使用512M內存)之間,即0~4294967296之前,超過這個數會自動將offset轉化為0,因此使用的時候一定要注意。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM