Redis BitMap 用戶簽到

在這里插入圖片描述

Redis Bitmap

Bitmap(位圖)是 Redis 提供的一種用于處理二進制位(bit)的特殊數據結構,它基于 String 類型,每個 bit 代表一個布爾值(0 或 1),可以用于存儲大規模的二值狀態數據,如簽到、活躍用戶統計、去重等。


1. Bitmap 基本原理

  • Bitmap 本質上是一個二進制數組,每個 bit 僅占 1 位,相比普通的 String 存儲方式(每個字符 8 位),能大幅節省空間。
  • Redis 并沒有單獨的數據類型 Bitmap,它是基于 String 結構的。
  • 通過 位運算SETBITGETBITBITCOUNTBITOP 等)高效存取數據。

2. Bitmap 常用命令

(1)SETBIT:設置某一位的值

SETBIT key offset value
  • key:鍵名
  • offset:bit 偏移量(從 0 開始)
  • value01

📌 示例

SETBIT user:1001 1 1  # 將 user:1001 的第 1 位設置為 1
SETBIT user:1001 2 0  # 將 user:1001 的第 2 位設置為 0
SETBIT user:1001 5 1  # 將 user:1001 的第 5 位設置為 1

假設 user:1001 初始狀態是:(每個 0 代表 1 bit,總共 32 bit = 4 字節)

00000000 00000000 00000000 00000000

執行:

SETBIT user:1001 5 1  # 將 user:1001 的第 5 位設置為 1
SETBIT user:1001 5 1

結果變成:

00000100 00000000 00000000 00000000

第 5 位(從 0 開始計數,即第 6 個 bit)被設置為 1。

作用:類似于一個布爾數組,可用于表示某個用戶在不同時間點的狀態(如簽到)。


(2)GETBIT:獲取某一位的值

GETBIT key offset
  • key:鍵名
  • offset:bit 偏移量

📌 示例

GETBIT user:1001 1  # 返回 1
GETBIT user:1001 2  # 返回 0
GETBIT user:1001 5  # 返回 1

作用:查詢某個狀態,如某用戶是否簽到。


(3)BITCOUNT:統計 bit 為 1 的個數

BITCOUNT key [start end]
  • key:鍵名
  • [start end](可選):字節范圍(默認統計整個 key)

📌 示例

BITCOUNT user:1001  # 統計 user:1001 中 bit 為 1 的個數

作用

  • 統計某個用戶的簽到次數
  • 統計一段時間內活躍用戶數量

(4)BITOP:對多個 Bitmap 進行位運算

BITOP operation destKey key1 key2 ...
  • operation
    • AND(與)
    • OR(或)
    • XOR(異或)
    • NOT(非)
  • destKey:存儲結果的 key
  • key1 key2 ...:參與運算的 key

📌 示例

BITOP AND active_users today yesterday  # 統計連續兩天都活躍的用戶
BITOP OR total_active day1 day2 day3    # 統計三天內活躍過的用戶

作用

  • 計算多天簽到的交集、并集
  • 統計活躍用戶

3. Bitmap 典型應用

(1)用戶簽到

場景:每個用戶有一個 31 位的 Bitmap(對應 31 天),bit 為 1 表示已簽到,0 表示未簽到。

📌 示例

SETBIT sign:1001:20240301 0 1  # 用戶 1001 在 3 月 1 日簽到
SETBIT sign:1001:20240302 1 1  # 3 月 2 日簽到
SETBIT sign:1001:20240303 2 1  # 3 月 3 日簽到
GETBIT sign:1001:20240303 2  # 查詢 3 月 3 日是否簽到(返回 1)
BITCOUNT sign:1001:202403  # 查詢用戶 1001 3 月簽到次數

(2)統計活躍用戶

場景:每天創建一個 Bitmap,記錄活躍用戶(bit 位置對應用戶 ID)。

📌 示例

SETBIT active:20240301 1001 1  # 用戶 1001 3 月 1 日活躍
SETBIT active:20240301 1002 1  # 用戶 1002 3 月 1 日活躍
SETBIT active:20240302 1002 1  # 用戶 1002 3 月 2 日活躍
BITCOUNT active:20240301  # 統計 3 月 1 日活躍用戶數
BITOP AND active_both active:20240301 active:20240302  # 統計連續兩天活躍的用戶

(3)A/B 測試 & 用戶權限控制

場景:用 Bitmap 存儲用戶是否屬于 A/B 測試組或是否擁有某個權限。

📌 示例

SETBIT experiment:groupA 1001 1  # 用戶 1001 參與 A 組測試
SETBIT experiment:groupB 1002 1  # 用戶 1002 參與 B 組測試
GETBIT experiment:groupA 1001  # 查詢用戶 1001 是否在 A 組

4. Bitmap 優勢

? 節省空間:1 個 bit 僅占 1/8 字節,非常適合存儲大規模用戶數據(如千萬級別用戶簽到情況)。
? 高效查詢GETBITSETBIT 操作時間復雜度O(1),快速讀寫。
? 支持批量運算BITCOUNTBITOP 等可進行高效統計


5. Bitmap 限制

? 不支持刪除某個 bit(只能置 0,無法真正刪除)。
? 不支持范圍查詢(需要配合 BITCOUNTGETBIT)。
? 偏移量有限制(Redis 最大 String 長度約 512MB,即支持 2^32 個 bit)。


6. 總結

功能命令作用
設置 bitSETBIT key offset value設置指定偏移量的 bit
獲取 bitGETBIT key offset獲取指定偏移量的 bit
統計 1 的數量BITCOUNT key統計 key 中 bit 為 1 的個數
位運算BITOP operation destKey key1 key2對多個 Bitmap 進行 AND/OR/XOR/NOT 運算

Bitmap 非常適合用于海量用戶數據的布爾狀態存儲,如簽到、活躍用戶、權限控制等場景。

參考文獻

[1] https://redis.io/docs/latest/develop/data-types/bitmaps/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 3 新特性實戰:從理論到實踐

引言 Spring Boot 自發布以來,憑借其簡潔的配置和強大的功能,迅速成為 Java 開發者的首選框架。隨著 Spring Boot 3 的發布,開發者們迎來了更多令人興奮的新特性。本文將深入探討 Spring Boot 3 的新特性,并通過實戰示例展示如何…

Nodejs使用redis

框架:koa,通過koa-generator創建 redis: 本地搭建,使用默認帳號,安裝說明地址以及默認啟動設置:https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 中間件&#x…

調研報告:Hadoop 3.x Ozone 全景解析

Ozone 是 Hadoop 的分布式對象存儲系統,具有易擴展和冗余存儲的特點。 Ozone 不僅能存儲數十億個不同大小的對象,還支持在容器化環境(比如 Kubernetes)中運行。 Apache Spark、Hive 和 YARN 等應用無需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口…

AI學習——卷積神經網絡(CNN)入門

作為人類,我們天生擅長“看”東西:一眼就能認出貓狗、分辨紅綠燈、讀懂朋友的表情……但計算機的“眼睛”最初是一片空白。直到卷積神經網絡(CNN)?的出現,計算機才真正開始理解圖像。今天,我們就用最通俗的…

除自身以外數組的乘積——面試經典150題(力扣)

題目 給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法,且在 O(n) 時…

?算法OJ?二叉樹的前序遍歷【樹的遍歷】(C++實現)Binary Tree Preorder Traversal

?算法OJ?二叉樹的中序遍歷【樹的遍歷】(C實現)Binary Tree Inorder Traversal Given the root of a binary tree, return the preorder traversal of its nodes’ values. Example 1: Input: root [1,null,2,3] Output: [1,2,3]Explanation: Exam…

計算機二級MS之Excel

聲明:跟著大貓和小黑學習隨便記下一些筆記供大家參考,二級考試之前將持續更新,希望大家二級都能輕輕松松過啦,過了二級的大神也可以在評論區留言給點建議,感謝大家!! 文章目錄 考題難點&#x…

【Linux】VMware Workstation Pro 17 安裝教程

目錄 安裝 VMware Workstation Pro 17 一、CDS Repository 獲取安裝包 二、網盤獲取安裝包 三、Broadcom官方獲取安裝包 后續安裝過程沒啥特殊要求 安裝 VMware Workstation Pro 17 目前VMware Workstation pro 17已經對個人用戶免費開放使用。 Broadcom官網地址&#x…

如何在云端平臺上建立 30,000 名用戶的網頁 MMO游戲環境-2 (服務器)

接續上一篇「如何在云端平臺上建立 30,000 名用戶的網頁 MMO游戲環境」,接下來討論模擬連結上的問題。 最初計劃使用35臺伺服器來完成這個實驗,希望能夠有大量的用戶連接,以驗證真實的連接狀況。然而,我們高估了這方面&#xff0c…

架構設計的靈魂交響曲:系統設計各維度的深度解析與實戰指南

引言: 系統設計的背景與重要性 在快速變化的技術環境中,數字化轉型成為企業生存與發展的核心驅動力。系統設計能力不僅是技術團隊的核心競爭力,也是推動業務創新和提升整體效率的關鍵因素。根據Gartner的研究,超過70%的數字化轉型項目未能實…

C語言指針(詳細總結)

目錄 1.初始C指針 幾個重要的概念: 指針的加減 &與* 二級指針 2.指針與數組 指針數組 數組指針變量 一維數組與二維數組傳參的本質 ?編輯?編輯 ?編輯 3.指針與函數 函數指針數組 4.指針與結構體 5.野指針以及常見的內存管理錯誤 常見的內存錯…

JAVA學習-練習試用Java實現“編寫一個Spark程序,結合Elasticsearch對大數據進行全文搜索和篩選“

問題: 編寫一個Spark程序,結合Elasticsearch對大數據進行全文搜索和篩選。 解答思路: 為了編寫一個結合Apache Spark和Elasticsearch進行全文搜索和篩選的程序,你需要按照以下步驟操作: 1. 設置Spark環境:…

VLLM專題(二十一)—分布式推理與服務

1. 如何決定分布式推理策略? 在深入探討分布式推理和服務之前,我們首先需要明確何時使用分布式推理以及可用的策略是什么。常見的做法如下: 單 GPU(無需分布式推理): 如果你的模型可以放入單個 GPU 中,那么你可能不需要使用分布式推理。直接使用單個 GPU 運行推理即可。…

torcharrow gflags版本問題

問題描述 其實仍然是很簡單的編譯問題,但是又弄了一整個下午加幾乎整個晚上,進度緩慢,又吸取了教訓,因而還是來記錄一下。 在試圖使用torcharrow進行推薦系統模擬的時候,撰寫的python程序報錯:ERROR: flag…

介紹一下TiDB、RocksDb、levelDB、LSM 樹、SSTable。

LSM 樹(Log-Structured Merge-Tree) 核心原理:通過將隨機寫轉換為順序寫優化寫入性能,適用于寫密集型場景。數據首先寫入內存中的 MemTable(有序結構,如跳表),當達到閾值后轉為 Imm…

ESP32 BLE 初步學習筆記

前言 藍牙作為一個龐大的知識體系,其學習和運用對于初學者來說顯得有些復雜且凌亂。我整理了這段時間的學習筆記,涵蓋了協議棧、工作流程、參數等內容。在實際應用中,我們主要使用 GAP 和 GATT,協議棧中的其他部分只需了解即可。…

dfs(二十四)47. 全排列 II

47. 全排列 II 給定一個可包含重復數字的序列 nums ,按任意順序 返回所有不重復的全排列。 示例 1: 輸入:nums [1,1,2] 輸出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 輸入:nums [1,2,3] 輸出:[[1,…

代碼隨想錄算法訓練營第五十二天 |101. 孤島的總面積102. 沉沒孤島103. 水流問題104.建造最大島嶼

101. 孤島的總面積 卡碼網:101. 孤島的總面積(opens new window) 題目描述 給定一個由 1(陸地)和 0(水)組成的矩陣,島嶼指的是由水平或垂直方向上相鄰的陸地單元格組成的區域,且完全被水域單…

Simple-BEV的bilinear_sample 作為view_transformer的解析,核心是3D-2D關聯點生成

文件路徑models/view_transformers 父類 是class BiLinearSample(nn.Module)基于https://github.com/aharley/simple_bev。 函數解析 函數bev_coord_to_feature_coord的功能 將鳥瞰圖3D坐標通過多相機(針孔/魚眼)內外參投影到圖像特征平面&#xff0…

A/B測試入門指南

目錄 一、什么是A/B測試1.1 A/A測試1.2 多變量測試 二、A/B測試應用場景三、A/B測試基本流程四、A/B測試面試真題4.1 【是什么】4.2 【為什么】4.3 【怎么做】 五、應用實戰 一、什么是A/B測試 A/B 測試是一種常見的實驗方法,用于比較兩個或多個方案的效果&#xff…