Redis
常用命令、數據類型
查看幫助
To get help about Redis commands type:
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
例如,help @string
字符串操作
set k1 value1 nx
nx表示無值的時候才執行成功
set k1 value1 xx
xx表示有值的時候才執行成功
mset k3 value3 k4 value4
含義爲 more set,用來設置多個值
mget k1 k2
獲取兩個值
msetnx k2 c k3 d
這個命令可以保證多筆操作是原子操作,類似於一個事務中
appenk k1 "world"
在k1後面追加world
getrange k1 2 5
獲取k1某兩個索引之間的字符串子串(支持正負索引)
setrange k1 mashibing
從某個索引開始覆蓋
strlen k1
獲取字符串長度
getset k1 bashibing
取出舊值,並將舊值設置爲新值(這樣可以減少一次IO通信)
…
查看某個key的類型
type k1
查看k1的類型
如果value爲1,查看的時候顯示是string類型,但是是可以進行int類型的自增操作的:incr k1
查看encoding編碼類型
object encoding k1
如果value爲1,上面的命令顯示爲int類型
有一些方法會改變數據的類型
數值類型的加減操作
decr k1
k1-1
decrby k1 22
k1+22
incrbyfloat k1 0.5
k1-0.5
二進制安全
redis 是二進制安全的,並不會去破壞你的編碼,也不去關心你是什麼編碼。底層存儲的時候,是按照Byte字節存儲的。我們前面看到的encoding,只是爲了讓加減之類的運算方法變得更快一些。
(HBASE也是二進制安全的)
在redis進程與外界交互的時候,redis存儲的是字節流,而不會轉換成字符流,也不會擅自按照某種數據類型存儲,這樣保證了數據不會被破壞,不會發生數據被截斷/溢出等錯誤。
- 編碼並不會影響數據的存儲
- 因此,在多人使用redis的時候,我們一定要在用戶端約定好數據的編碼和解碼。
問:Redis單線程是爲了減少用戶態到內核態的切換嗎?
答:不是,至少主要原因不是。
操作系統爲了響應多用戶的請求,而進行的從用戶態到內核態的切換,造成的的性能損耗,遠不及爲了保證數據一致性加鎖帶來的損耗。
Redis單線程是爲了避免加鎖的過程。
位圖 bitmap
bitop
按位操作
業務場景:
- 公司有用戶系統,讓你統計用戶登錄天數,且時間窗口隨機。例如,A用戶在某一年中登陸了幾次。怎麼優化?
可以使用redis實現,假設一年400天,讓每一天對應一個二進制位,需要50個字節即可。
setbit Tom 1 1
表示 Tom 在第2天登錄了一次(下標從0開始)
setbit Tom 364 1
表示 Tom 在第365天登錄了一次
bitcount Tom -2 -1
統計 Tom 在最後16天的總登錄次數 - 你是京東,618做活動,登錄就送禮物,假設京東有2億用戶。大庫應該備貨多少禮物?
用戶應該分爲:殭屍用戶、冷熱用戶、忠誠用戶
你需要統計活躍用戶,也是隨機時間窗口
比如說,統計本月1號~3號範圍內的活躍過的用戶,需要去重