亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis中的bitmap是什么

發布時間:2021-12-03 15:37:13 來源:億速云 閱讀:330 作者:iii 欄目:關系型數據庫

本篇內容主要講解“Redis中的bitmap是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Redis中的bitmap是什么”吧!

Redis中的bitmap是什么

Redis 的位圖(bitmap)是由多個二進制位組成的數組,數組中的每個二進制位都有與之對應的偏移量(從 0 開始),通過這些偏移量可以對位圖中指定的一個或多個二進制位進行操作。

實際上,位圖并不是 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是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

牙克石市| 木里| 怀来县| 荃湾区| 建湖县| 安岳县| 来凤县| 安福县| 南城县| 信阳市| 金华市| 建阳市| 五常市| 石屏县| 孝昌县| 大洼县| 五家渠市| 衡阳县| 建瓯市| 河西区| 景洪市| 梅河口市| 南阳市| 汉阴县| 行唐县| 温州市| 来凤县| 云梦县| 安庆市| 淮北市| 竹北市| 高雄县| 楚雄市| 湖北省| 安徽省| 嘉兴市| 顺义区| 玉门市| 德昌县| 黄山市| 渭源县|