1.redis的特徵
內存級別高速緩存。
k -v 鍵值對存儲。
單線程 串行化(worker)。
io模型 epoll。
二進制安全的存儲,字節的存儲(客戶端需要確定統一編碼)。
value有類型,每個類型具有本地方法。
底層是使用C寫的,實際數據的存儲結構都可以從C文件看到。
2.redis的5種常見的數據結構
這幾種數據的存儲結構,數據庫底層對於value的存儲是基於數據結構的,可以參考redis源碼進行了解(涉及到C語言)
5種常用value類型應用場景。String 、list、hash、set、sorted set zset
3.redis的使用場景
redis
value有類型,每個類型具有本地方法
當redis中的value是數組list時,我們可以通過本地方法獲取redis中數組中下標爲x的值。
String:存儲字符串、數值、bitmap
字符串場景:session共享、uuid、VFS in mem ( 內存虛擬文件存儲系統 小文件)
數值場景:限流器、點擊率,瀏覽量統計。
bitmap場景:二進制操作。
二進制操作涉及到: AND(與)、 OR(或)、 NOT(非)、 XOR(異或)
按位與運算符(&)
參加運算的兩個數據,按二進制位進行“與”運算。
運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:兩位同時爲“1”,結果才爲“1”,否則爲0
按位或運算符(|)
參加運算的兩個對象,按二進制位進行“或”運算。
運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :參加運算的兩個對象只要有一個爲1,其值爲1。
非運算(~)
參加運算的一個數據,按二進制位進行取反
運算規則:1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01110
異或運算符(^)
參加運算的兩個數據,按二進制位進行“異或”運算。
運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:參加運算的兩個對象,如果兩個相應位爲“異”(值不同),則該位結果爲1,否則爲0。
用戶統計:
-
任意時間窗 統計用戶的登錄。
00000000000100 ,登錄爲1,未登錄爲0
通過setbit設置是0-365天否登錄,通過bitcount可以統計一個時間段內的登記次數(一天只記錄一次)。
-
計算活躍用戶,某年,某月,某天。
日活量
周活躍量bitop 做或運算 ,將週一至周天的活躍數據做或運算得到一個周活量的bit。
-
類似12306 搶票,進行矩陣運算
假設一輛高鐵從武漢到北京,途經上海、廣州。
當一個人去買票時,說出自己的出發點,和目的地,然後再問有無座次時。這在搶票時是一個高頻操作。如何用最快的方式計算出來,這個就需要用到二進制的一些算法,可以快速運算結果,比如or或運算就可以算出剩餘坐票。
4. 權限 777 rwx 421 000 = 0 111=7
linux服務的權限 777 rwx 就是由12 個二進制位表示
list 數組
存入:有序
同向存取:棧
異向:隊列
數組 :index
LTRIM: 保留熱數據
場景:
評論 : 分頁,利用棧後進先出的特性,最新的評論最在上面。
hash
存儲map<k,v>類型的數據。
set
無序不重複的集合,可用於去重。
sorted set(zset)
可排序的集合,可用於排名、分頁等。
4.根據key查詢redis值的真實存儲結構
前面講了5種redis的值類型存儲,實際底層的存儲又基於數據結構實現了這五種類型的存儲。
可以通過以下命令查看值存儲的實際數據編碼結構。
object encoding key