Redis位操作介紹


在學習redis的過程了,看到了redis還能用於大數據處理,具體場景如下:
騰訊10億用戶,要幾個毫秒內查詢到某個用戶是否在線,你能怎么做?千萬別說給每個用戶建立一個key,然后挨個記(你可以算一下需要的內存會很恐怖,而且這種類似的需求很多,騰訊光這個得多花多少錢。。)
原理是:
redis內構建一個足夠長的數組,每個數組元素只能是0和1兩個值,然后這個數組的下標index用來表示我們上面例子里面的用戶id(必須是數字哈),那么很顯然,這個幾億長的大數組就能通過下標和元素值(0和1)來構建一個記憶系統,就能實現上述場景。用到的命令是:setbit、getbit、bitcount

先來說說setbit、getbit、bitcount這三個指令的用法:
在學習這幾個命令之前,我們得先了解下redis中字符串的存儲方式,redis中的字符串都是以二進制的方式進行存儲的,比如說我執行如下命令:


我們知道 'a' 的ASCII碼是 97。轉換為二進制是:01100001。我們BIT相關命令都是對這個二進制數據進行操作

GETBIT
GETBIT命令可以返回key對應的value在offset(偏移)處的bit值,以上文提到的kk為例,a對應的二進制數據是01100001,所以當offset為0時,對應的bit值為0;offset為1時,對應的bit值為1;offset為2時,對應的bit值為1;offset為3時,對應的bit值為0,依此類推….,如下:


通過上述結果,可以看到offset從0到7,就是01100001,也就是說offset是從左往右計數的,也就是從高位往低位。當超過位數時,結果是0

BITCOUNT
BITCOUNT可以用來統計這個二進制數據中1的個數,如下:




官網上有一個非常有意思的案例:用戶上線次數統計。節選部分原文如下:



SETBIT
我們通過SETBIT 命令將 andy中的 'a' 變成 'b' 應該怎么變呢?
也就是將 01100001 變成 01100010 (b的ASCII碼是98),這個很簡單啦,也就是將'a'中的offset 6從0變成1,將offset 7 從1變成0。如下圖:


大家可能也發現了,每次SETBIT完畢之后,有一個(integer) 0或者(integer)1的返回值,這個是在你進行SETBIT 之前,該offset位的比特值。

另外使用 BITPOS 指令可以用來獲取二進制位串中第一個1或者0的位置,如下:

 

參考博客:https://zhuanlan.zhihu.com/p/51170402


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM