網站首頁 編程語言 正文
在日常開發過程中,經常會有一些 bool 類型數據需要存取。比如記錄用戶一年內簽到的次數,簽了是 1,沒簽是 0。如果使用 key-value 來存儲,那么每個用戶都要記錄 365 次,當用戶成百上億時,需要的存儲空間將非常巨大。解決這個問題,可以使用redis中的位圖。
位圖(bitmap)同樣屬于 string 數據類型。Redis 中一個字符串類型的值最多能存儲 512 MB 的內容,每個字符串由多個字節組成,每個字節又由 8 個 Bit 位組成。位圖結構正是使用“位”來實現存儲的,它通過將比特位設置為 0 或 1來達到數據存取的目的,這大大增加了 value 存儲數量,它存儲上限為2^32。
位圖本質上就是一個普通的字節串,也就是 bytes 數組。您可以使用getbit/setbit命令來處理這個位數組,位圖的結構如下所示:
位圖適用于一些特定的應用場景,比如用戶簽到次數、或者登錄次數等。上圖是表示一位用戶 10 天內來網站的簽到次數,1 代表簽到,0 代表未簽到,這樣可以很輕松地統計出用戶的活躍程度。相比于直接使用字符串而言,位圖中的每一條記錄僅占用一個 bit 位,從而大大降低了內存空間使用率。
Redis 官方也做了一個實驗,他們模擬了一個擁有 1 億 2 千 8 百萬用戶的系統,然后使用 Redis 的位圖來統計“日均用戶數量”,最終所用時間的約為 50ms,且僅僅占用 16 MB內存。
位圖應用原理
某網站要統計一個用戶一年的簽到記錄,若用 sring 類型存儲,則需要 365 個鍵值對。若使用位圖存儲,用戶簽到就存 1,否則存 0。最后會生成 00010101… 這樣的存儲結果,其中每天的記錄只占一位,一年就是 365 位,約為 46 個字節。如果只想統計用戶簽到的天數,那么統計 1 的個數即可。
位圖操作的優勢,相比于字符串而言,它不僅效率高,而且還非常的節省空間。
Redis 的位數組是自動擴展的,如果設置了某個偏移位置超出了現有的內容范圍,位數組就會自動擴充。
位圖常用命令
1) SETBIT命令
用來設置或者清除某一位上的值,其返回值是原來位上存儲的值。key 在初始狀態下所有的位都為 0 ,示例如下:
SETBIT key offset value
其中 offset 表示偏移量,從 0 開始。示例如下:
127.0.0.1:6379> SET user:1 a
OK
#設置偏移量offset為0
127.0.0.1:6379> SETBIT user:1 0 1
(integer) 0
#當對應位的字符是不可打印字符,redis會以16進制形式顯示
127.0.0.1:6379> GET user:1
"\xe1"
2) GETBIT命令
用來獲取某一位上的值。示例如下:
127.0.0.1:6379> GETBIT user:1 0
(integer) 1
當偏移量 offset 比字符串的長度大,或者當 key 不存在時,返回 0。
redis> EXISTS bits
(integer) 0
redis> GETBIT bits 100000
(integer) 0
3) BITCOUNT命令
統計指定位區間上,值為 1 的個數。語法格式如下:
BITCOUNT key [start end]
示例如下:
127.0.0.1:6379> BITCOUNT user:1
(integer) 8
通過指定的 start 和 end 參數,可以讓計數只在特定的字節上進行。start 和 end 參數和 GETRANGE 命令的參數類似,都可以使用負數,比如 -1 表示倒數第一個位, -2 表示倒數第二個位。.
4)Redis Bitop 命令
對一個或多個保存二進制位的字符串 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 作為輸入。
場景
統計當日活躍用戶
每日活躍統計創建一個bitmap鍵,當用戶活躍了根據用戶id的偏移量來設置
對應的位為1
用戶簽到
每個用戶創建一個位圖的鍵,以某一天為基礎,之后的天數距離這一天的天數為偏移量,
如果用戶點擊了簽到,則設置對用的偏移位為1。
原文鏈接:https://blog.csdn.net/weixin_41184457/article/details/122851552
相關推薦
- 2022-09-04 Go語言簡介和環境配置_Golang
- 2022-07-11 go語言實現二叉樹的序例化與反序列化_Golang
- 2022-08-11 GoFrame基于性能測試得知grpool使用場景_Golang
- 2022-07-21 hadoop本地數據統計
- 2023-01-09 基于Python實現拉格朗日插值法_python
- 2022-08-31 Python無法用requests獲取網頁源碼的解決方法_python
- 2023-01-11 Python?基于xml.etree.ElementTree實現XML對比示例詳解_python
- 2022-04-01 Python實現隨機生成圖片驗證碼詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支