Redis BitMap 實現簽到及連續簽到統計

一、引言

? ? ? ? 用戶簽到功能是很多應用都離不開的一個板塊,單詞打開、QQ達人等等為我們所熟知,這項功能該如何實現呢,一些朋友可能想當然的覺得無非將每日的簽到數據記錄下來不就好了,不會去細想用誰記錄,如何記錄才合適。

????????假如我們計入傳統的關系型數據庫,以MySQl為例,我們分別用INT、TINYINT、DATE分別存儲用戶ID、是否簽到(0或1)、當天日期,那么每條記錄將占用8字節(4+1+3),當用戶達到一定規模,每月的簽到數據存儲將占用很大空間,統計查找效率也低下。

? ? ? ? 為了解決這一問題,我們引入今天要介紹的一種Redis中的數據結構BitMap(位圖)。

二、簡介及基本操作

1.簡介

Redis 的 Bitmap(位圖)是一種基于位操作的數據結構,底層實際上是字符串(String)類型,但可以將字符串視為一個由二進制位組成的數組。每個位只能是 0 或 1,因此 Bitmap 非常適合用于存儲和處理大量的布爾狀態信息,而且非常節省空間。

2.基本操作

  • SETBIT:設置指定偏移量(offset)上的位的值(0 或 1)。

  • GETBIT:獲取指定偏移量上的位的值。

  • BITCOUNT:計算指定范圍內值為 1 的位的數量。

  • BITOP:對多個 Bitmap 進行位運算(AND、OR、XOR、NOT),并將結果存儲到新的 Bitmap 中。

  • BITPOS:查找指定范圍內第一個值為 0 或 1 的位的位置。

?關于位圖的詳細命令及RedisTemplate的詳細內容大家可以自行了解。

三、簽到實現

整個操作還是比較簡單的,我們在收到簽到請求后獲取到用戶信息,時間數據拼接為key對用戶當月的簽到操作做記錄,即在位圖對應位數上做寫1操作(controller比較簡單大家自己隨手寫一個測試即可)

    @Overridepublic void sign() {//獲取用戶Long uid = UserHolder.getUser().getId();//獲取日期LocalDateTime now = LocalDateTime.now();//拼接keyString keySuffix= now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key=RedisConstants.USER_SIGN_KEY+uid+keySuffix;//本月第幾天int dayOfMonth = now.getDayOfMonth();//寫入redis,位圖是從0開始索引的,所以減一stringRedisTemplate.opsForValue().setBit(key,dayOfMonth-1,true);}

?接下來我們用PostMan 做一下簽到測試

可以看到Redis中已經存儲了當前用戶三月份的簽到數據,也就是今天(03-31)的簽到,BitMap第31位為1,代表03-31以簽到,并且這一月的數據僅占4B的空間。

四、連續簽到統計實現

? ? ? ? 這里的連續簽到即指當月中從當前天起往回計數,直到未簽到的日子的總數,即今天沒簽那就算斷了(如果要統計當月簽到總數的話自然可以用bitCount直接統計)。

????????那怎么對BitMap進行這種倒敘的計數統計呢,其實我們從其二進制的存儲結構就能看出端倪,我們直接用BitMap數據和1進行與運算判斷當前的最后一位是否為1,條件滿足則計數并且無符號右移一位,繼續對當前最后一位做判斷直到不滿足條件。

    public Integer signCount() {//獲取用戶Long uid = UserHolder.getUser().getId();//獲取日期LocalDateTime now = LocalDateTime.now();//拼接keyString keySuffix= now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key=RedisConstants.USER_SIGN_KEY+uid+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()) {return 0;}Long num = result.get(0);if (num == null||num==0) {return 0;}int count=0;//循環遍歷while (true){//和1做與運算,得到最后一個比特位,再和0比較if ((num & 1 ) == 0) {//為零,未簽到break;}else {//為1繼續計數count++;}//無符號右移1位,切換下一比特位num>>>=1;}return count;}

?我們改動一下剛剛的BitMap數據,為了方便我就不用BitField命令了,直接用工具改成如下數據

然后再用PostMan做測試,得到的連續簽到天數也是4天

????????本次分享主要為大家介紹一下BitMap在這種簽到業務中的應用,比較簡單,到這里已經全部結束,感謝大家閱讀。

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

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

相關文章

前端國際化-插件模式

文章目錄 Webpack 插件開發解析中文調用有道翻譯 API生成 JSON 語言文件React 國際化實現 Webpack 插件開發 創建 i18n-webpack-plugin.js 插件&#xff1a;在 src 目錄下掃描所有文件使用 babel-parser 解析 JavaScript/JSX 代碼識別中文文本通過有道翻譯 API 翻譯生成 local…

IP屬地和發作品的地址不一樣嗎

在當今這個數字化時代&#xff0c;互聯網已經成為人們日常生活不可或缺的一部分。隨著各大社交平臺功能的不斷完善&#xff0c;一個新功能——IP屬地顯示&#xff0c;逐漸走進大眾視野。這一功能在微博、抖音、快手等各大平臺上得到廣泛應用&#xff0c;旨在幫助公眾識別虛假信…

PP-ChatOCRv3新升級:多頁PDF信息抽取支持自定義提示詞工程,拓展大語言模型功能邊界

文本圖像信息抽取技術在自動化辦公、建筑工程、教育科研、金融風控、醫療健康等行業領域具有廣泛應用場景。2024年9月&#xff0c;飛槳低代碼開發工具PaddleX中新增文本圖像智能產線PP-ChatOCRv3&#xff0c;充分結合PaddleOCR的文本圖像版面解析能力和文心一言語言理解優勢&am…

算法刷題記錄——LeetCode篇(1.2) [第11~20題](持續更新)

更新時間&#xff1a;2025-03-29 LeetCode題解專欄&#xff1a;實戰算法解題 (專欄)技術博客總目錄&#xff1a;計算機技術系列目錄頁 優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注&#xff01; 17. 電話號碼的字母組合 給定一個僅包含數字 2-9…

如何在 vue 渲染百萬行數據,vxe-table 渲染百萬行數據性能對比,超大量百萬級表格渲染

vxe-table 渲染百萬行數據性能對比&#xff0c;超大量百萬級表格渲染&#xff1b;如何在 vue 渲染百萬行數據&#xff1b;當在開發項目時&#xff0c;遇到需要流暢支持百萬級數據的表格時&#xff0c; vxe-table 就可以非常合適了&#xff0c;不僅支持強大的功能&#xff0c;虛…

阿里 FunASR 開源中文語音識別大模型應用示例(準確率比faster-whisper高)

文章目錄 Github官網簡介模型安裝非流式應用示例流式應用示例 Github https://github.com/modelscope/FunASR 官網 https://www.funasr.com/#/ 簡介 FunASR是一個基礎語音識別工具包&#xff0c;提供多種功能&#xff0c;包括語音識別&#xff08;ASR&#xff09;、語音端…

如何使用 LLaMA-Factory 微調 LLaMA3

【LLaMa3微調】使用 LLaMA-Factory 微調LLaMA3 實驗環境 1.1 機器 操作系統&#xff1a;Windows 10 或 UbuntuPyTorch 版本&#xff1a;2.1.0Python 版本&#xff1a;3.10&#xff08;針對Ubuntu 22.04&#xff09;Cuda 版本&#xff1a;12.1GPU 配置&#xff1a;p100 (16GB) …

使用Java ApI 實現Hadoop文件上傳

目錄 文件傳輸步驟 windows的本機文件傳輸 linux的虛擬機文件傳輸 文件傳輸步驟 建立連接 在connect2HDFS()方法中&#xff0c;通過設置Configuration對象來指定HDFS的URI&#xff08;在這個例子中為hdfs://192.168.12.133:9000&#xff09;&#xff0c;并初始化一個FileSys…

喜訊 | 耘瞳科技視覺檢測與測量裝備榮膺“2024機器視覺創新產品TOP10”

3月28日&#xff0c;全球機器視覺行業盛會VisionChina2025&#xff08;上海&#xff09;機器視覺展完美收官。展會期間&#xff0c;由機器視覺產業聯盟&#xff08;CMVU&#xff09;舉辦的“2024機器視覺創新產品TOP10”企業名單正式揭曉&#xff0c;耘瞳科技“工業跨尺度場景實…

數據可視化(matplotlib)-------圖表樣式美化

目錄 一、圖表樣式概述 &#xff08;一&#xff09;、默認圖表樣式 &#xff08;二&#xff09;、圖表樣式修改 1、局部修改 2、全局修改 二、使用顏色 &#xff08;一&#xff09;、使用基礎顏色 1、單詞縮寫或單詞表示的顏色 2、十六進制/HTML模式表示的顏色 3、RGB…

202518 | Ngnix

Ngnix是什么 Nginx&#xff08;發音為“engine-x”&#xff09;是一個開源的高性能HTTP服務器、反向代理服務器、負載均衡器和郵件代理服務器。它由俄羅斯程序員Igor Sysoev開發&#xff0c;首次發布于2004年&#xff0c;旨在解決C10K問題&#xff08;即如何高效地處理10,000個…

WP Mail 郵件發送:WordPress Mail SMTP設置

在我們WordPress搭建個人網站完成后&#xff0c;讀者或者客戶發送的電子郵件&#xff0c;包括你的WPForms電子郵件通知&#xff0c;如果無法到達預定收件人收件箱&#xff0c;這會對我們網站的運營造成很大的影響&#xff0c;問題在于WordPress Mail SMTP的發送方式。 SMTP&am…

小智機器人關鍵函數解析:MqttProtocol::SendAudio()對輸入的音頻數據進行加密處理,通過UDP發送加密后的音頻數據

MqttProtocol::SendAudio()對輸入的音頻數據進行加密處理&#xff0c;通過UDP發送加密后的音頻數據。 源碼&#xff1a; void MqttProtocol::SendAudio(const std::vector<uint8_t>& data) {// 使用互斥鎖保護臨界區&#xff0c;確保同一時間只有一個線程可以訪問該…

Hadoop 常用命令集總覽

Hadoop 常用命令集總覽 在大數據處理領域&#xff0c;Hadoop 作為一種廣泛應用的分布式系統基礎架構&#xff0c;其重要性不言而喻。熟練掌握 Hadoop 的常用命令對于高效的數據處理和分析工作至關重要。本文將對 Hadoop 的常用命令進行專業而詳盡的列舉&#xff0c;并結合實例進…

mac m4 Homebrew安裝MySQL 8.0

1.使用Homebrew安裝MySQL8 在終端中輸入以下命令來安裝MySQL8&#xff1a; brew install mysql8.0 安裝完成后&#xff0c;您可以通過以下命令來驗證MySQL是否已成功安裝&#xff1a; 2.配置mysql環境變量 find / -name mysql 2>/dev/null #找到mysql的安裝位置 cd /op…

GoLand 2024.3 中文 GO語言開發工具

GoLand 2024.3 中文 GO語言開發工具 文章目錄 GoLand 2024.3 中文 GO語言開發工具一、介紹二、效果三、下載 一、介紹 JetBrains GoLand 2024 &#xff0c;是一款GO語言開發工具&#xff0c;全行代碼補全&#xff1a;能使用本地運行的上下文感知深度學習模型&#xff0c;可以自…

Excel去掉單元格里面的換行的方法

方法一&#xff1a;使用“查找和替換”功能 ?選中單元格?&#xff1a;首先選中需要替換換行符的單元格或區域。 ?打開替換窗口?&#xff1a;按下“CtrlH”快捷鍵&#xff0c;打開“查找和替換”對話框。 ?輸入換行符?&#xff1a; 在“查找內容”框中&#xff0c;你可…

React 中的 Props

Props&#xff08;Properties 的縮寫&#xff09;是 React 中用于組件間通信的核心機制。它們允許數據從父組件單向傳遞到子組件。Props 是 React 組件不可變&#xff08;只讀&#xff09;的輸入參數&#xff0c;這種特性使得組件更加可預測且易于維護。 Props 的核心特性 單…

基于簡單神經網絡的線性回歸

一、概述 本代碼實現了一個簡單的神經網絡進行線性回歸任務。通過生成包含噪聲的線性數據集&#xff0c;定義一個簡單的神經網絡類&#xff0c;使用梯度下降算法訓練網絡以擬合數據&#xff0c;并最終通過可視化展示原始數據、真實線性關系以及模型的預測結果。 二、依賴庫 …

?19.思科路由器:OSPF協議引入直連路由的實驗研究

思科路由器:OSPF協議引入直連路由的實驗研究 一、實驗拓撲二、基本配置2.1、sw1的配置2.2、開啟交換機三層功能三、ospf的配置3.1、R1的配置3.2、R2的配置3.3、重啟ospf進程四、引入直連路由五、驗證結果隨著互聯網技術的不斷發展,路由器作為網絡互聯的關鍵設備,其性能與穩定…