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號範圍內的活躍過的用戶,需要去重
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章