更新時間:2022-11-09 09:35:41 來源:動力節點 瀏覽1016次
位圖是當需要將巨大域的布爾信息映射為緊湊表示時立即出現在您腦海中的數據結構。當內存空間非常寶貴時,它是一種非常流行的數據結構。Redis 作為內存數據結構服務器,提供對位操作操作的支持。
中的數據結構。當內存空間非常寶貴時,它是一種非常流行的數據結構:操作系統內核(內存頁、inode 等)、數字成像等。
Redis 作為內存數據結構服務器,提供對位操作操作的支持。但是, Redis 中的位圖沒有特殊的數據結構 。相反,基本 Redis 結構支持位級操作: 字符串。現在,Redis 字符串的最大長度為 512 MB。因此,Redis 可以映射為 Bitmap 的最大域是 2 32 (512 MB = 2 29 字節 = 2 32 位)。
Redis 中與位相關的操作有兩種:恒定時間 (O(1)),例如獲取/設置特定位的操作,以及基本上對一組位進行操作的 O(N) 操作。在這些情況下,N 是操作需要處理的位長度。讓我們看一些例子。
# SETBIT key offset value :在'key'的偏移'offset'處存儲 位 值 'value ' 。歐( 1 )
# 返回 存儲在該偏移處的 原始 位 值 。
127.0 . 0.1 : 6379 > 設置位 k 10 1
(整數) 0
# GETBIT key offset :在'key'中獲取 'offset'的值 。歐( 1 )
127.0 . 0.1 : 6379 > 獲取比特 k 10
(整數) 1
127.0 . 0.1 : 6379 > 獲取位 k 11
(整數) 0
127.0 . 0.1 : 6379 > 獲取位 k 0
(整數) 0
127.0 . 0.1 : 6379 > 設置位 k 9 1
(整數) 0
127.0 . 0.1 : 6379 > 設置位 k 8 1
(整數) 0
# 因為它仍然是一個通用的String , 所以這里是一個 get 。
127.0 . 0.1 : 6379 > 得到 k
"\x00\xe0"
# "\x00\xe0" -> "0000 0000 111"
#BITCOUNT key [ start end ] :范圍內設置的位數。_ _ 歐( ? )
# 重要:開始 和 結束 是 字節 而不是 位
127.0 . 0.1 : 6379 > 比特 數 k
(整數) 3
127.0 . 0.1 : 6379 > 設置 m “喵”
好的
# 喵 -> 01101101 01100101 01101111 01110111
127.0 . 0.1 : 6379 > 位數 m
(整數) 21
# BITPOS key bit [ start ] [ end ] : key in range中1或0的第 一個位置 。歐( ? )
127.0 . 0.1 : 6379 > 設置我的密鑰“\ xff \xf0\x00”
好的
127.0 . 0.1 : 6379 > BITPOS mykey 0
(整數) 12
除了對鍵本身起作用的運算符外,BITOP 運算符還用于多個鍵之間的按位邏輯運算。
# BITOP 操作 destkey key [ key ...]. 歐( ? )
# 運算 可以 是 AND , OR , XOR 和 NOT
127.0 . 0.1 : 6379 > 設置 一個 “\xff\xff”
好的
127.0 . 0.1 : 6379 > bitop 不是 nota _
(整數) 2
127.0 . 0.1 : 6379 > 得到 通知
"\x00\x00"
127.0 . 0.1 : 6379 > 設置 b "\x0f\x0f"
好的
127.0 . 0.1 : 6379 > 設置 c "\xf0\xf0"
好的
127.0 . 0.1 : 6379 > BITOP 或 orbc b c
(整數) 2
127.0 . 0.1 : 6379 > 獲得 orbc
"\xff\xff"
127.0 . 0.1 : 6379 > BITOP AND andbc b c
(整數) 2
127.0 . 0.1 : 6379 > 得到 andbc
"\x00\x00"
127.0 . 0.1 : 6379 > BITOP XOR xorbc b c
(整數) 2
127.0 . 0.1 : 6379 > 得到 xorbc
"\xff\xff"
由于位圖操作沒有自己的數據結構,因此沒有特殊的數據結構可以描述。Redis 字符串本身是作為二進制安全字符串實現的。Redis 字符串數據結構內部稱為簡單動態字符串(SDS)。它本質上是一個帶有一些額外簿記信息的原生 char []。
位圖函數的實現在文件 bitops.c中。
PS 鑒于位操作算法對關鍵操作系統和圖形功能的重要性,大多數架構都為此類操作提供了特殊指令。閱讀各種有趣的計算機算術算法的好地方是永恒的經典 Hacker's Delight。
這個 流行的 GetSpool 博客 是使用位圖對大型數據集進行實時分析的一個很好的例子。它也是位圖經典用例的一個示例:將極大域的布爾信息存儲到(相對)較小的空間中,同時保持良好的性能。
尺寸通常是非常大的位圖的一個問題,因為對其最有用的操作是 O(N)。為了避免使用大鍵,Redis 文檔 建議 將大鍵拆分為多個較小的鍵。在密鑰變大之前,BITCOUNT 性能仍然可以接受。此時,建議是拆分鍵或使用范圍參數進行增量查詢。 處理緩慢的 BITOP 操作的 建議是在從站上運行它。因此,一般來說,處理中等大小的密鑰并通過將密鑰拆分為多個密鑰來規劃未來的潛在增長是有意義的。
Redis Sets 和位圖操作提供的功能本質是相似的。所以經常混淆這兩種方法中的哪一種更好。好吧,這實際上取決于用例的確切性質。顯然,這個討論只對集合和位圖都可以實現的那種操作有效。
Redis Sets 通常是高效且可擴展的,并且應該是首選的數據結構,直到它的大小變得難以為繼。Redis Set 也更易于管理,編程和調試適用于大多數應用程序。不應低估 Set 的易用性:操作位圖的代碼通常難以閱讀、理解、調試和維護。即使域非常大,集合仍然可能是合適的。例如,如果一個應用程序旨在跟蹤對熱門電子商務網站的每日訪問量,那么結果可能仍然很適合一組,因為通常只有 5-10% 的整個用戶群會每天訪問該網站。對于預計 60% 的整個用戶群每天登錄的網站來說,這顯然會發生變化。然后,考慮到對大量鍵的邏輯按位操作的大小和性能,位圖變得更加相關。Redis Set 還具有不必將 ID 映射到位偏移量的明顯優勢。同樣,如果您的值來自大于 2 的域32 那么Redis Sets必須比找出機制來分割位圖的域更容易使用。
這是一個編造的(但足夠真實!)示例,用于可能應用 Redis 位圖操作的地方。假設您正在運行一個非常受歡迎的在線 MOOC ,成千上萬的學生已經注冊了該 MOOC。促進課程的學術團隊想要一個儀表板,他們可以在其中查看學生進度的實時狀態以及注冊學生的一般背景。您決定通過 Redis 位圖操作來實現這一點。這是一個逐步的方法。
創建一個計劃以在學生 ID 和位圖偏移之間進行映射。它可以像 ID 作為位圖中的偏移量一樣簡單。
課程開始后,創建和填充各種與人口統計相關的位圖。例如,在同一所大學注冊其他 MOOC 的學生、教育水平、性別等。
現在隨著課程的進行,您可以創建新的位圖來記錄課程進度。例如,完成第一周所有講座的學生,完成第一周所有作業的學生等。
現在,基于這些鍵創建實時分析將是一個非常簡單的練習,并且可以在拖放 UI 上完成。例如
一位教授想看看有多少學生觀看了第一周(A)的講座,但沒有完成第一周(B)的作業:操作員:BITOP。操作:A AND(非 B)。
完成第 1 周 (A)、第 2 周 (B)、第 3 周 (C) 和第 4 周 (D) 的所有作業的學生:操作員:BITOP。操作 A AND B AND C AND D. 說,這些是通過課程的人。
通過課程的所有男學生(M)(如上計算,比如說,P):操作員:BITOP。操作:M AND P。
通過課程的學生人數:BITCOUNT P.
類似地,可以將任意數量的有趣群組設置為位圖,并在其上運行此類排列。
以上就是關于“Redis數據結構:位圖”介紹,如果大家想了解更多相關知識,不妨來關注一下本站的Redis教程,里面還有更豐富的知識等著大家去學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習