redis使用場景之位操作(大資料處理)

2022-05-09 07:36:12 字數 1336 閱讀 7132

在學習redis的過程了,看到了redis還能用於大資料處理,具體場景如下:

原理是:

redis內構建乙個足夠長的陣列,每個陣列元素只能是0和1兩個值,然後這個陣列的下標index用來表示我們上面例子裡面的使用者id(必須是數字哈),那麼很顯然,這個幾億長的大陣列就能通過下標和元素值(0和1)來構建乙個記憶系統,就能實現上述場景。用到的命令是:setbit、getbit、bitcount

先來說說setbit、getbit、bitcount這三個指令的用法:

在學習這幾個命令之前,我們得先了解下redis中字串的儲存方式,redis中的字串都是以二進位制的方式進行儲存的,比如說我執行如下命令:

我們知道 'a' 的ascii碼是 97。轉換為二進位制是:01100001。我們bit相關命令都是對這個二進位制資料進行操作

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可以用來統計這個二進位制資料中1的個數,如下:

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

我們通過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的位置,如下:

redis使用場景

最近要去面試php程式設計師,去各家招聘 看看,都要有redis方面的知識儲備。這裡寫一篇部落格,就當是對最近學習redis的一次回顧。簡單一句話介紹redis 基於記憶體的高效的key value資料庫,把資料載入到記憶體中進行處理,定期把資料儲存到硬碟進行儲存,單執行緒。redis五大資料型別 ...

redis使用場景

redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在寫龐大的sql上了,而是利用redis靈活多變的資料結構和資料操作來實現。redis常用資料型別 redis最為常用的資料型別主要有以下五種 下面我們先來逐一的分析下這五種資料型別的使用和內部實現方式 ...

Redis使用場景

1 字串使用場景 a 快取功能 典型使用場景 redis作為快取層,mysql作為儲存層,絕大部分請求的資料都是從redis中獲取,由於redis具有支撐高併發的特性,所以快取通常能起到加速讀寫和降低後端壓力的作用。b 計數 c 共享session 典型應用場景 使用者登陸資訊,redis將使用者的...