Redis Bitmaps 數據結構模型位操作

Bitmaps 數據結構模型

Bitmap 本身不是一種數據結構,實際上它就是字符串,但是它可以對字符串的位進行操作。 比如 “abc” 對應的 ASCII 碼分別是 97、98、99。對應的二進制分別是 01100010、01100010、01100011, 如下所示:

    a        b         c
+--------+--------+--------+
|01100001|01100010|01100011|
+--------+--------+--------+

位圖的最大優點之一是它們在存儲信息時通常可以極大地節省空間。

例如,在一個用增量用戶 ID 表示不同用戶的系統中,僅使用 512 MB 內存就可以記住 40 億個用戶的單個比特信息。
1bit * 4,000,000,000 = 500,000,000 B = 488,281.25 KB = 476.8 MB

GETBIT 僅返回指定索引處的位的值。超出范圍的位(尋址超出目標密鑰中存儲的字符串長度的位)始終被視為零。

root@ubuntu-x64_01:~#  redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" get k1 
"a"root@ubuntu-x64_01:~#  redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua k1
"01100001"

setbit

設置健的第offset個位的值(從0算起),如有8個用戶 userid = 0, 1, 2, 3, 4, 5, 6,7 , 其中用戶 1, 3, 5 對網站進行了訪問 , 那么Bitmaps初始化如下:

setbit key offset value
192.168.88.11:6380> setbit users:2023-12-09 1 1
(integer) 0
192.168.88.11:6380> setbit users:2023-12-09 3 1
(integer) 0
192.168.88.11:6380> setbit users:2023-12-09 5 1
(integer) 0# 獲取當前哪些用戶訪問了 , 其中 1 表示訪問過的用戶 
root@ubuntu-x64_01:~#   /redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua users:2023-12-09
"01010100"

getbit

獲取健的第offset位的值(從0算起), 如下獲取 user 5 是否在 2023-12-09 訪問過, 1表示訪問,0表示沒有訪問,如果offset不存在,返回結果也是0, 超出范圍的位始終被視為零。

192.168.88.11:6380> getbit users:2023-12-09 5
(integer) 1

bitcount

獲取Bitmaps指定范圍值為1的個數,如統計 2023-12-09 這天訪問的用戶數量

192.168.88.11:6380> bitcount users:2023-12-09
(integer) 3

bitop

bitmaps之前的運算,它可以做and(交集)、or(并集)、not(非)、xor(異或),并將結果保存在 destkey ,如計算 2023-12-09、2023-12-10 兩天都訪問過的用戶數量

root@ubuntu-x64_01:~#  redis-cli  --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua users:2023-12-09
"01010100"
root@ubuntu-x64_01:~#  redis-cli  --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --evalgetbit.lua users:2023-12-10
"01100110"192.168.88.11:6380> bitop and users:2023-12-09_10 users:2023-12-09 users:2023-12-10
(integer) 1192.168.88.11:6380> bitcount users:2023-12-09_10
(integer) 2root@ubuntu-x64_01:~#  redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua users:2023-12-09_10
"01000100"

小結

將位圖拆分為多個鍵很簡單,例如為了對數據集進行分片,并且通常最好避免使用巨大的鍵。要將位圖拆分到不同的鍵上,而不是將所有位設置為一個鍵,一個簡單的策略就是為每個鍵存儲 M 位,并使用 獲取鍵名稱和bit-number/M在鍵(bit-number MOD M)內尋址的第 N 位。

假設 M=10 , 約100個用戶(有點少,僅用作舉例):

則 第91個用戶尋址如下:健名稱: 91 MOD 10 = 1 即 key = user1 , N = 91/10 = 9

則 第65個用戶尋址如下:健名稱: 65 MOD 10 = 5 即 key = user5 , N = 65/10 = 6

在這里插入圖片描述

SETBIT 、 GETBIT 、BITFIELD 均為 O(1)。

BITCOUNT、BITOP、BITPOS 是 O(n),其中n是比較中最長字符串的長度。

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

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

相關文章

HTML5+CSS3+JS小實例:文字依次點擊驗證

實例:文字依次點擊驗證 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

十七、FreeRTOS之FreeRTOS事件標志組

本節需要掌握以下內容&#xff1a; 1&#xff0c;事件標志組簡介&#xff08;了解&#xff09; 2&#xff0c;事件標志組相關API函數介紹&#xff08;熟悉&#xff09; 3&#xff0c;事件標志組實驗&#xff08;掌握&#xff09; 4&#xff0c;課堂總結&#xff08;掌握&am…

04_W5500_TCP_Server

上一節我們完成了TCP_Client實驗&#xff0c;這節使用W5500作為服務端與TCP客戶端進行通信。 目錄 1.W5500服務端要做的&#xff1a; 2.代碼分析&#xff1a; 3.測試&#xff1a; 1.W5500服務端要做的&#xff1a; 服務端只需要打開socket&#xff0c;然后監聽端口即可。 2…

基于Spring Boot的水產養殖管理系統

文章目錄 項目介紹主要功能截圖:部分代碼展示設計總結項目獲取方式?? 作者主頁:超級無敵暴龍戰士塔塔開 ?? 簡介:Java領域優質創作者??、 簡歷模板、學習資料、面試題庫【關注我,都給你】 ??文末獲取源碼聯系?? 項目介紹 基于Spring Boot的水產養殖管理系統,jav…

HarmonyOS Developer——鴻蒙【構建第一個JS應用(FA模型)】

創建JS工程 JS工程目錄結構 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 使用真機運行應用 說明 為確保運行效果&#xff0c;本文以使用DevEco Studio 3.1 Release版本為例&#xff0c;點擊此處獲取下載鏈接。 創建JS工程 若首次打開DevEco Studio&#xff0c;請點擊…

蝦皮什么商品好賣

在蝦皮&#xff08;Shopee&#xff09;平臺上&#xff0c;有許多商品類別都表現出了較好的銷售情況。然而&#xff0c;隨著時間和地區的變化&#xff0c;熱銷商品也會有所不同。本文將介紹一些在蝦皮平臺上表現較好的商品類別&#xff0c;并提供一些建議&#xff0c;幫助您在蝦…

交換機基本原理和配置

目錄 一、數據鏈路層功能 二、交換機的工作原理 三、交換機的四大功能 一、數據鏈路層功能 位于網絡層與物理層之間 數據鏈路的建立、維護與拆除幀包裝、幀傳輸、幀同步幀的差錯恢復流量控制 二、交換機的工作原理 交換機通過數據幀的源 MAC 地址&#xff0c;學習到交換機端…

偶數位字符前置算法

題目描述&#xff1a; 題目描述 編寫函數void myshift(char *s),在不打亂s原本相對位置情況下&#xff0c;將偶數位上的字符全部挪到奇數位字符的前面。輸入格式 輸入一個字符串 s保證輸入字符串 s 的長度大于等于1小于等于100輸出格式 輸出修改后的字符串 s。輸入樣例1 01234…

【算法】直接插入排序

目錄 1. 說明2. 舉個例子3. java代碼示例4. java示例截圖 1. 說明 1.直接插入排序的方式和打牌一樣&#xff0c;剛開始數組為空 2.拿到一個數字后從左到右將它與數組中的每一個數字進行比較&#xff0c;然后插入合適的位置 3.到最后&#xff0c;數組按照既定的順序排序好 2. 舉…

OpenCV基礎篇

OpenCV基礎篇 一、圖像、視頻讀取二、cv::Mat()數據類型三、繪圖功能四、鼠標響應事件五、圖像像素讀寫六、圖像像素運算七、顏色空間轉換八、圖像幾何變換九、圖像濾波十、圖像二值化十一、圖像梯度十二、Canny邊緣檢測十三、圖像形態學十四、圖像直方圖十五、霍夫變換十六、分…

線程池的拒絕策略

文章目錄 線程池的拒絕策略AbortPolicy拒絕策略&#xff1a;CallerRunsPolicy拒絕策略&#xff1a;DiscardOldestPolicy拒絕策略&#xff1a;DiscardPolicy拒絕策略&#xff1a; 線程池的拒絕策略 若在線程池當中的核心線程數已被用完且阻塞隊列已排滿&#xff0c;則此時線程池…

springboot_ssm_java學位論文盲審系統

本系統主要實現用戶登錄驗證&#xff0c;用戶使用郵箱&#xff0c;密碼和選擇身份進行登錄&#xff0c;用戶查看個人中心&#xff0c;提交論文&#xff0c;發表留言和問題反饋。用戶在線注冊。學生模塊功能實現&#xff1a;學生注冊&#xff0c;查看信息&#xff0c;修改資料&a…

智能優化算法應用:基于魚鷹算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于魚鷹算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于魚鷹算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.魚鷹算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

藍橋杯航班時間

藍橋杯其他真題點這里&#x1f448; //飛行時間 - 時差 已過去的時間1 //飛行時間 時差 已過去的時間2 //兩個式子相加會發現 飛行時間 兩段時間差的和 >> 1import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public cl…

Android藍牙協議棧fluoride(四) - 設備管理(bt interface)

設備管理的接口實現了藍牙的開/關、屬性設置、發現設備、獲取profile的接口等等。 接口聲明 接口聲明如下&#xff1a; // include/hardware/bluetooth.h typedef struct {// 打開接口并注冊回調函數int (*init)(bt_callbacks_t* callbacks, bool is_atv);// 關閉接口void (…

目標檢測YOLO系列從入門到精通技術詳解100篇-【圖像處理】邊緣檢測

目錄 知識儲備 算法原理 邊緣檢測(Canny算子) Canny算子邊緣檢測流程 應用案例

[Linux] LAMP架構

一、LAMP架構架構的概述 LAMP 架構是一種流行的 Web 應用程序架構&#xff0c;它的名稱是由四個主要組件的首字母組成的&#xff1a; Linux&#xff08;操作系統&#xff09;&#xff1a; 作為操作系統&#xff0c;Linux 提供了服務器的基礎。它負責處理硬件資源、文件系統管理…

解讀 | 阿里通義千問模型全尺寸開源 “誠意滿滿“背后的名與利

大家好&#xff0c;我是極智視界&#xff0c;歡迎關注我的公眾號&#xff0c;獲取我的更多前沿科技分享 邀您加入我的知識星球「極智視界」&#xff0c;星球內有超多好玩的項目實戰源碼和資源下載&#xff0c;鏈接&#xff1a;https://t.zsxq.com/0aiNxERDq 12 月 1 日阿里開源…

基于Web和深度學習的辣椒檢測產量預測系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義 辣椒是一種重要的經濟作物&#xff0c;被廣泛種植和消費。然而&#xff0c;辣椒的產量預測一直是農業生產中的重要問題。準確地預測辣椒的產量可以幫助農民合理安…

第10節:Vue3 論點

如何在UniApp中使用Vue3框架創建論點&#xff1a; <template> <view> <text>{{ segments[currentSegment].content }}</text> </view> </template> <script> import { ref, computed } from vue; export default { setup…