BitMap實現用戶簽到、UV統計

1. Redis 的 BitMap 概述

在 Redis 中,BitMap 并非一種獨立的數據結構,而是基于 String 類型數據結構實現的一種存儲方式。由于 String 類型的最大上限是 512M,換算成 bit 位就是 2^32 個,這決定了 BitMap 可操作的最大范圍。BitMap 非常適合用于處理大量的布爾值,能以極小的空間存儲大量的標志位信息,常用于簽到統計、活躍用戶統計等場景。

2. BitMap 常用操作命令

SETBIT:用于向指定位置(offset)存入一個 0 或 1,例如?SETBIT key offset value

GETBIT:獲取指定位置(offset)的 bit 值,即?GETBIT key offset

BITCOUNT:統計 BitMap 中值為 1 的 bit 位的數量,命令為?BITCOUNT key

BITFIELD:可對 BitMap 中 bit 數組的指定位置(offset)的值進行查詢、修改、自增等操作。

BITFIELD_RO:獲取 BitMap 中 bit 數組,并以十進制形式返回。

BITOP:能將多個 BitMap 的結果做位運算(與、或、異或),如?BITOP AND result_key key1 key2

BITPOS:查找 bit 數組中指定范圍內第一個 0 或 1 出現的位置,例如?BITPOS key 1

3. 基于 BitMap 的簽到功能實現

簽到實現
  • 業務邏輯:獲取當前登錄用戶的 ID 和日期,根據用戶 ID 和日期拼接 Redis 的 key,確定今天是本月的第幾天,然后使用?SETBIT?命令將該位置的 bit 位設置為 1 表示簽到。
@Override
public Result sign() {Long userId = UserHolder.getUser().getId();LocalDateTime now = LocalDateTime.now();String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = USER_SIGN_KEY + userId + keySuffix;int dayOfMonth = now.getDayOfMonth();stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);return Result.ok();
}
簽到統計
  • 業務邏輯:同樣先獲取當前登錄用戶的 ID 和日期,拼接 Redis 的 key 并確定今天是本月的第幾天。使用?BITFIELD?命令獲取本月截止今天為止的所有簽到記錄,返回一個十進制數字。通過循環對該數字進行位運算,從右向左逐位檢查,統計連續簽到的天數,直到遇到第一個 0 為止。
@Override
public Result signCount() {Long userId = UserHolder.getUser().getId();LocalDateTime now = LocalDateTime.now();String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = USER_SIGN_KEY + userId + keySuffix;int dayOfMonth = now.getDayOfMonth();List<Long> result = stringRedisTemplate.opsForValue().bitField(key, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if (result == null || result.isEmpty() || result.get(0) == null || result.get(0) == 0) {return Result.ok(0);}Long num = result.get(0);int count = 0;while (num > 0) {if ((num & 1) == 0) {break;} else {count++;}num >>>= 1;}return Result.ok(count);
}

四、BitMap總結

Redis 的 BitMap 利用 String 類型的特性,以高效的方式處理大量布爾值信息。在簽到功能的實現中,通過合理使用?SETBIT?和?BITFIELD?等命令,能輕松完成簽到記錄和簽到統計的操作,不僅節省了存儲空間,還提高了操作效率。

五、UV統計

UV:全稱Unique Visitor,也叫獨立訪客量,是指通過互聯網訪問、瀏覽這個網頁的自然人。1天內同一個用戶多次訪問該網站,只記錄1次。
PV:全稱Page View,也叫頁面訪問量或點擊量,用戶每訪問網站的一個頁面,記錄1次PV,用戶多次打開頁面,則記錄多次PV。往往用來衡量網站的流量。

在 UV 統計場景中,由于需要統計大量獨立訪客,使用傳統方式存儲所有訪客信息會占用大量內存。而 Redis 的 HyperLogLog 以其低內存占用和可接受的誤差,成為了 UV 統計的理想選擇,能夠高效地完成大規模數據的基數統計任務。

HyperLogLog(HLL)是從 Loglog 算法派生的概率算法,用于確定非常大的集合的基數(集合中不同元素的數量),無需存儲集合中的所有值。

Redis 中 HyperLogLog 的特點

????????數據結構:基于 string 結構實現。

????????內存占用:單個 HLL 的內存永遠小于 16kb,內存占用極低。

????????誤差:測量結果是概率性的,存在小于 0.81%的誤差,但對于 UV 統計來說,此誤差可忽略不計。

對于百萬級別的數據,使用 HyperLogLog 進行統計時,內存占用僅十幾 kb,充分體現了 HyperLogLog 在處理大規模數據基數統計時內存占用低的優勢。

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

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

相關文章

共享模型之管程(悲觀鎖)

共享模型之管程&#xff08;悲觀鎖&#xff09; 文章目錄 共享模型之管程&#xff08;悲觀鎖&#xff09;一、常見線程安全的類二、對象頭三、Monitor&#xff08;監視器 / 管程&#xff09;四、偏向鎖偏向鎖的實現原理撤銷偏向鎖 五、輕量級鎖輕量級鎖的釋放 六、重量級鎖七、…

網絡安全ctf試題 ctf網絡安全大賽真題

MISC 1 簽到 難度 簽到 復制給出的flag輸入即可 2 range_download 難度 中等 flag{6095B134-5437-4B21-BE52-EDC46A276297} 0x01 分析dns流量&#xff0c;發現dns && ip.addr1.1.1.1存在dns隧道數據&#xff0c;整理后得到base64: cGFzc3dvcmQ6IG5zc195eWRzIQ 解…

centos7操作系統下安裝docker,及查看docker進程是否啟動

centos7下安裝docker&#xff0c;需要用到的yun命令 &#xff08;yum命令用于添加卸載程序&#xff09; 1.設置倉庫&#xff1a; yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2.安裝 Docker Engine-Community yum in…

私有云基礎架構與運維(二)

二.私有云基礎架構 【項目概述】 經過云計算基礎知識及核心技術的學習后&#xff0c;希望進一步了解 IT 基礎架構的演變過 程&#xff0c;通過學習傳統架構、集群架構以及私有云基礎架構的相關知識&#xff0c;認識企業從傳統 IT 基 礎架構到私有云基礎架構轉型的必要性。…

Linux 系統不同分類的操作命令區別

Linux 系統有多種發行版,每種發行版都有其獨特的操作命令和工具。以下是一些常見的分類及其操作命令的區別: 1. 基于 Red Hat 的發行版 (RHEL, CentOS, Fedora) 1.1 包管理 安裝軟件包: bash復制 sudo yum install <package> 更新軟件包: bash復制 sudo yum update…

?PLC數據類型和?C#數據類型的數據類型映射表

數據類型映射表 ?PLC數據類型?C#數據類型讀取方式?補充說明BitboolDBX布爾值BytebyteDBB單字節無符號整數WordushortDBW16位無符號整數DWorduintDBD32位無符號整數Intshort16位有符號整數DIntint32位有符號整數RealfloatDBR單精度浮點數LRealdoubleDBL雙精度浮點數Stringstr…

windows部署spleeter 版本2.4.0:分離音頻的人聲和背景音樂

windows部署spleeter 版本2.4.0&#xff1a;分離音頻的人聲和背景音樂 一、Spleeter 是什么&#xff1f; Spleeter 是由法國音樂流媒體公司 Deezer 開發并開源的一款基于深度學習的音頻分離工具。它能夠將音樂中的不同音軌&#xff08;如人聲、鼓、貝斯、鋼琴等&#xff09;分…

QTS單元測試框架

1.QTS單元測試框架介紹 目前QTS項目采用C/C語言,而CppUnit就是xUnit家族中的一員,它是一個專門面向C的單元測試框架。因此,QTS采用CppUnit測試框架是比較理想的選擇。 CppUnit按照層次來管理測試,最底層的就是TestCase,當有了幾個TestCase以后&#xff0c;可以將它們組織成Te…

dify + ollama + deepseek-r1+ stable-diffusion 構建繪畫智能體

故事背景 stable-diffusion 集成進 dify 后&#xff0c;我們搭建一個小智能體&#xff0c;驗證下文生圖功能 業務流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…

分享幾個論文校對相關的deepseek提示詞

論文校對 1.檢查這段文字是否有語法或風格錯誤&#xff1a;[在此處粘貼您的文本]。 2.審查我的[文件類型&#xff0c;例如&#xff0c;“論文”]中的這一段落是否有語法或風格錯誤&#xff1a;[在此處粘貼您的文本]。 3.請審查我關于[具體主題&#xff0c;例如&#xff0c;…

【極光 Orbit?STC8A-8H】02. STC8 單片機工程模板創建

【極光 Orbit?STC8A-8H】02. STC8 單片機工程模板創建 七律 單片機 小小芯片大乾坤&#xff0c;集成世界在其中。 初學雖感千重難&#xff0c;實踐方知奧妙通。 今天的講法和過去不同&#xff0c;直接來一個多文件模塊化的工程模板創建&#xff0c;萬事開頭難&#xff0c;…

mac安裝nvm=>node=>nrm

下載并安裝 NVM 運行以下命令下載并安裝 NVM&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash 配置環境變量 vim ~/.zshrc 按 i 將如下代碼復制進去&#xff0c;controlc &#xff0c;再按 :wq完成編輯 export NVM_DIR…

K8S學習之基礎十一:k8s中容器鉤子

容器鉤子 容器鉤子分為post-start和pre-stop post-start&#xff1a;容器啟動后執行的命令 pre-stop&#xff1a;容器關閉前執行的命令&#xff0c;可用于優雅關閉 # 分別定義兩個鉤子&#xff0c;啟動pod后更新index.html&#xff0c;關閉pod前正常關閉服務 vi post-pre.…

K8s 1.27.1 實戰系列(三)安裝網絡插件

Kubernetes 的網絡插件常見的有 Flannel 和 Calico ,這是兩種主流的 CNI(容器網絡接口)解決方案,它們在設計理念、實現方式、性能特征及適用場景上有顯著差異。以下是兩者的綜合對比分析: 一、Flannel 和 Calico 1. 技術基礎與網絡實現 Flannel 核心機制:基于 Overlay …

【五.LangChain技術與應用】【24.LangChain RAG文本向量化與存儲:智能檢索的核心技術】

凌晨三點,北京中關村的某棟辦公樓依然燈火通明。28歲的算法工程師小李盯著屏幕上的代碼,突然拍案而起:"終于成了!"他開發的智能客服系統在連續失敗78次后,首次準確識別出用戶"我想換個能打游戲的便宜手機"的真實需求——需要兼顧游戲性能和價格的機型…

深度學習五大模型:CNN、Transformer、BERT、RNN、GAN詳細解析

卷積神經網絡&#xff08;Convolutional Neural Network, CNN&#xff09; 原理 &#xff1a;CNN主要由卷積層、池化層和全連接層組成。卷積層通過卷積核在輸入數據上進行卷積運算&#xff0c;提取局部特征&#xff1b;池化層則對特征圖進行下采樣&#xff0c;降低特征維度&…

特征分解(Eigen decomposition)在深度學習中的應用與理解

特征分解在深度學習中的應用與理解 特征分解&#xff08;Eigendecomposition&#xff09;是線性代數中的一個核心工具&#xff0c;在深度學習領域有著廣泛的應用&#xff0c;尤其是在涉及矩陣操作和概率模型時。對于研究者來說&#xff0c;理解特征分解不僅有助于掌握數學基礎…

分布式ID生成方案:數據庫號段、Redis與第三方開源實現

分布式ID生成方案&#xff1a;數據庫號段、Redis與第三方開源實現 引言 在分布式系統中&#xff0c;全局唯一ID生成是核心基礎能力之一。本文針對三種主流分布式ID生成方案&#xff08;數據庫號段模式、Redis方案、第三方開源框架&#xff09;進行解析&#xff0c;從實現原理…

rabbitmq-amqp事務消息+消費失敗重試機制+prefetch限流

1. 安裝和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

【Python】05、Python運算符

文章目錄 1.算術運算符2.賦值運算符3.關系運算符4.邏輯運算符4.1 布爾值邏輯運算4.2 非布爾值的邏輯運算符 5.條件運算符6.運算符優先級 運算符也稱為操作符&#xff0c;可以對一個或多個值進行運算或各種操作。比如、-、都屬于運算符 1.算術運算符 加法 如果是兩個字符串之間…