Redis实战(二):Redis 的 String 类型 bitmap
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.5k1-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號范圍內的活躍過的用戶,需要去重
總結
以上是生活随笔為你收集整理的Redis实战(二):Redis 的 String 类型 bitmap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM从入门到精通(二):详解Class
- 下一篇: MySQL调优(二):数据类型和sche