目錄
#SETBIT" >#SETBIT
GETBIT" >GETBIT
BITCOUNT" >BITCOUNT
BITPOS" > BITPOS
BITOP" >BITOP
应用场景" >应用场景
用户行为记录器
用户上线统计
首頁 資料庫 Redis 深入淺析Redis中的點陣圖(bitmap)

深入淺析Redis中的點陣圖(bitmap)

Dec 02, 2021 am 10:17 AM
redis 點陣圖

這篇文章帶大家了解一下Redis中的點陣圖(bitmap),希望對大家有幫助!

深入淺析Redis中的點陣圖(bitmap)

Redis 的位圖(bitmap)是由多個二進位位元組成的數組,數組中的每個二進位位元都有與之對應的偏移量(從0 開始),透過這些偏移量可以對位圖中指定的一個或多個二進位位元進行操作。 【相關推薦:Redis影片教學

實際上,點陣圖並不是 Redis 提供的一種新的資料類型,它是字串類型的擴充。所以點陣圖的指令可以直接使用在字串類型的鍵上,點陣圖指令操作的鍵也可以被字串類型指令操作。

例如,現有一個字串鍵foo:

redis> set foo bar
登入後複製

1 個位元組由8 個二進位位元組成,所以foo 鍵的二進位形式就是:

深入淺析Redis中的點陣圖(bitmap)

#SETBIT

透過SETBIT 指令,可以為位圖指定偏移量上的二進位位元設定值,offset 必須大於等於0 ,value 只能是0 或1。此指令的時間複雜度是 O(1)。

SETBIT key offset value

SETBIT 指令在對二進位位元進行設定之後,將傳回二進位位元被設定之前的舊值作為結果。

假設現在想把bar 變成aar,只需如下兩步驟操作:

redis> setbit foo 6 0
(integer) 1
redis> setbit foo 7 1
(integer) 0
redis> get foo"aar"
登入後複製

當執行SETBIT 指令嘗試對位圖進行設定的時候,如果位圖不存在,或者點陣圖目前的大小無法滿足,Redis 將對被設定的位圖進行擴展,並將所有未設定的二進位位元的值初始化為0。例如:

redis> setbit far 10 1
登入後複製

由於far 並不存在,所以Redis 會將0~9 的二進位位元設為0,因為Redis 對位圖的擴展操作是以位元組為單位進行的,所以實際上far一共有16 個二進位位,並非10 個,且11~15 的二進位位也是0。

基於這種情況,當指定的二進位位元偏移量過大時,Redis 需要一次分配完所有內存,這可能會造成 Redis 伺服器阻塞。例如儲存使用者的性別,1 代表男性,0 代表女性,使用 ID 作為二進制偏移量,如果 ID 從 10000000001 開始的,就需要將用戶 ID 減去 10000000000 再進行存儲,否則會造成內存浪費。

GETBIT

使用 GETBIT 指令可以取得位圖指定偏移量上的二進位位元的值。此指令的時間複雜度是 O(1)。

GETBIT key offset

如果輸入的偏移量超過了點陣圖目前擁有的最大偏移量,將傳回 0 作為結果。

BITCOUNT

透過 BITCOUNT 指令可以統計位圖中值為 1 的二進位位元數。此指令的時間複雜度是 O(n)。

BITCOUNT key [start end]

在預設情況下,BITCOUNT 指令會對位圖所包含的所有位元組中的二進位位元進行統計,也可以透過可選的start 參數和end 參數,讓BITCOUNT 只對指定位元組範圍內的二進位位元進行統計(不是二進位偏移量)。例如,希望統計ar 兩個位元組中值為1 的二進位數量:

redis> bitcount foo 1 2
(integer) 7
登入後複製

start 和end 參數也支援使用負數索引,下方的用法與上方的等效:

redis> bitcount foo -2 -1
(integer) 7
登入後複製

BITPOS

透過執行BITPOS 指令,在位圖中尋找第一個被設定為指定值的二進位位,並傳回這個二進位位元的偏移量。

BITPOS key value [start end]

#BITPOS 也接受可選的start 參數和end 參數,讓BITPOS 指令只在指定位元組範圍內的二進位位中進行查找。

redis> get foo"aar"redis> bitpos foo 1
(integer) 1
redis> bitpos foo 0
(integer) 0
redis> bitpos foo 0 1 2
(integer) 8
redis> bitpos foo 1 1 2
(integer) 9
redis> bitpos foo 1 -1 -1
(integer) 17
登入後複製

針對邊界的處理:

  • 當嘗試對一個不存在的位圖或一個所有位元都被設定成了0 的位圖中查找值為1 的二進位位元時,BITPOS 指令將傳回-1 作為結果。
  • 如果在一個所有位都被設定成1 的位圖中尋找值為0 的二進位位,那麼BITPOS 指令將傳回位圖最大偏移量加上1 作為結果

BITOP

透過BITOP 指令,對一個或多個位圖執行指定的二進位位元運算,並將運算結果儲存到指定的鍵中。

BITOP operation destkey key [key ...]

#

operation 参数的值可以是 AND、OR、XOR、NOT 中的任意一个,这 4 个值分别对应逻辑并、逻辑或、逻辑异或和逻辑非 4 种运算,其中 AND、OR、XOR 这 3 种运算允许用户使用任意数量的位图作为输入,而 NOT 运算只允许使用一个位图作为输入。BITOP 命令在将计算结果存储到指定键中之后,会返回被存储位图的字节长度。

当 BITOP 命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作 0。

redis> set foo1 bar
OK
redis> set foo2 aar
OK
redis> bitop or res foo1 foo2
(integer) 3
redis> get res"car"
登入後複製

深入淺析Redis中的點陣圖(bitmap)

注意:BITOP 可能是一个缓慢的命令,它的时间复杂度是 O(N),在处理长字符串时应注意一下效率问题。

应用场景

用户行为记录器

用用户 ID 作为偏移量,若用户做了某种行为则通过 SETBIT 将二进制位设置为 1,通过 GETBIT 判断用户是否做了某种行为,通过 BITCOUNT 可以知道有多少用户执行了行为。

用户上线统计

可以使用 SETBIT 和 BITCOUNT 来实现,以用户 ID 作为 key ,假设今天是上线统计功能开放的第一天,ID 为 1 的用户上线后就通过 SETBIT 1 0 1。当要计算此用户的总共以来的上线次数时,使用 BITCOUNT 命令就可以得出的结果。

使用这种方式存储数据,即使 10 年后,1个用户就只占用几百字节的内存,它的处理速度依然很快。如果 bitmap 数据比较大,建议将 bitmap 拆分成多个小的 bitmap 分别进行处理。

更多编程相关知识,请访问:编程入门!!

以上是深入淺析Redis中的點陣圖(bitmap)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1323
25
PHP教程
1272
29
C# 教程
1251
24
redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

See all articles