Redis 位圖基本使用

1. 爲什麼需要位圖

在我們平時開發過程中,會有一些 bool 型數據需要存取,比如用戶一年的簽到記錄,簽了是 1,沒簽是 0,要記錄 365 天。如果使用普通的 key/value,每個用戶要記錄 365個,當用戶上億的時候,需要的存儲空間是驚人的。

爲了解決這個問題,Redis 提供了位圖數據結構,這樣每天的簽到記錄只佔據一個位,365 天就是 365 個位,46 個字節 (一個稍長一點的字符串) 就可以完全容納下,這就大大節約了存儲空間。

2. 位圖基本操作

  • 位圖底層數據結構
    位圖實際上還是使用的redis的String數據結構,只是草操作時可以按位設置01(一般只需要設置1的位置), 設置完成後也可以用get命令查看對應的字符(對應數字的ASICALL碼)

  • setbit、getbit

127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> get s
h

3. bitcount統計有多少個1

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitcount w
(integer) 21
127.0.0.1:6379> bitcount w 0 0 # 第一個字符中 1 的位數
(integer) 3
127.0.0.1:6379> bitcount w 0 1 # 前兩個字符中 1 的位數
(integer) 7

4. bitpos判斷0 or 1開始的位置

127.0.0.1:6379> bitpos w 0 # 第一個 0 位
(integer) 0
127.0.0.1:6379> bitpos w 1 # 第一個 1 位
(integer) 1
127.0.0.1:6379> bitpos w 1 1 1 # 從第二個字符算起,第一個 1 位
(integer) 9
127.0.0.1:6379> bitpos w 1 2 2 # 從第三個字符算起,第一個 1 位
(integer) 17

5. bitfield 指令操作一個範圍的位

  • 注意最多一次操作64個位, 如果是操作無符號數一次最多63個位因爲redis默認是有符號數
127.0.0.1:6379> bitfield w get u4 0 # 從第一個位開始取 4 個位,結果是無符號數 (u)
(integer) 6
127.0.0.1:6379> bitfield w get u3 2 # 從第三個位開始取 3 個位,結果是無符號數 (u)
(integer) 5
127.0.0.1:6379> bitfield w get i4 0 # 從第一個位開始取 4 個位,結果是有符號數 (i)
1) (integer) 6
127.0.0.1:6379> bitfield w set u8 8 97 # 從第 8 個位開始,將接下來的 8 個位用無符號數 97 替換
1) (integer) 101
127.0.0.1:6379> get w
"hallo"
  • 次命令也可以一次執行多個get/set/incrby命令
127.0.0.1:6379> bitfield w get u4 0 get u3 2 get i4 0 get i3 2
1) (integer) 6
2) (integer) 5
3) (integer) 6
4) (integer) -3

5.1incrby命令溢出問題

bitfield 指令提供了溢出策略子指令 overflow,用戶可以選擇溢出行爲,默認是折返(wrap),還可以選擇失敗 (fail) 報錯不執行,以及飽和截斷 (sat),超過了範圍就停留在最大最小值。overflow 指令隻影響接下來的第一條指令,這條指令執行完後溢出策略會變成默認值折返 (wrap)。

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
1) (integer) 15
127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1 # 保持最大值
1) (integer) 15
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 11
127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
1) (integer) 12
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章