二、redis中String和List兩種資料型別和應用場景
導讀
前面文章【一、深入理解redis之需要掌握的知識點 】中,我們對redis需要學習的內容進行了一個梳理。從本篇文章開始,我們將要對redis中各個知識點做詳細的學習和分析。
本篇文章我們學習的是redis中基礎資料型別String和List,以及他們的應用場景。
如果大家在工作、學習、面試中針對redis還有什麼疑問或者其他問題,可以評論區告訴我。
為了保證可以連續不間斷的獲取最新的技術分析及講解,建議關注本部落格。
String
應用場景:基於字串的操作–》儲存session,map等熱資料
使用:
Set key value命令
| Get key命令
| STRLEN key命令:返回 value的位元組長度
| APPEND key value命令:對原有value值進行追加操作
| MSET 和 MGET命令可以一次儲存或獲取多個key對應的值。
應用場景:基於數字的操作–》計數器。
限流:以ip地址為key,初始數值為6,每次進入減少1,減少到0後不可再進入;秒殺場景,扣庫存
| 使用:
INCR key 命令 對是數值型別的value進行+1操作。INCR key 和 DECRBY 命令 都是將字串值解析成整型然後進行操作。
應用場景: 基於二進位制位bit的操作-bitmap(點陣圖)–》
統計使用者任意時間視窗內的登入次數或統計任意時間視窗內活躍的使用者數量。
什麼是二進位制?什麼是二進位制操作?什麼是點陣圖?點陣圖應用場景。
使用:
SETBIT 操作二進位制位.“Setbit key offset value”. offset為從左向右的偏移量。
“Setbit k1 1 1”存入資料。“STRLEN k1”返回長度為1位元組。 “Get k1” 返回“@”。
為什麼會返回“@”,這是因為二進位制中1位元組位8bit.第一個bit位永遠為0.,所以“Setbit k1 1 1”其實往redis中存入的1位元組資料應該為“01000000”,“01000000”其實為2的6次方為64。在ASCII碼中64表示的字串為“@”。
‘setbit k1 7 1’命令的語義為往redis中存入一個1位元組的資料,該位元組從左向右數偏移量為7的bit位存入數值1,即由原來的‘01000000’變更為‘01000001’,即65,因此“get k1”返回ASCII碼值為65的字串“A”。從上面命令可以發現“set bit” 命令不會覆蓋原value的值,只會修改指定偏移量位置的值
| BITCOUNT 命令。
‘bitcount key start
end’命令統計指定key中位元組範圍內1的個數。Start和end指定的是value中位元組開始和其實的位置。
例如 有個key 為k1,value為‘01000001 01000000’。則“bitcout k1 0 2”返回的值為3.這是因為在以上value的二進位制表示中有3個1。 可以使用 ‘bitcount k1 0 -1’查詢指定key中的所有二進位制1的個數。 可以使用 “-1”表示全部,這是因為“bitcount”命令的位元組索引擁有正向索引和反向索引兩種
| BITOP 命令可以對指定key集合進行按位與(and)、或(or)操作然後把二進位制操作後的值儲存到指定的 destkey中。‘BITOP operation destkey key [key …]’。
“BITOP and andkey k1 k2”命令表示 對 ‘k1’和‘k2’的value進行二進位制
與(and)操作,然後把操作的結果儲存到‘andkey’中。
‘BITOP or orkey k1
k2’命令表示為‘k1’和‘k2’的value進行二進位制或(or)操作,然後把操作的結果儲存到‘orkey’中。
List
Redis中的List是一個雙向連結串列,可以模擬佇列(逆向)、棧(同向)、陣列(下標)。
LPUSH向LIST左邊(頭部)新增元素(LPUSH key value…)
| RPUSH向LIST右邊(尾部)新增元素(RPUSH key value…)
| LRANGE 可以獲取連結串列中指定範圍的結果,由於也是雙向的,因此也可以使用-1表示尾部(LRANGE key 0 -1 獲取全部資料)
| 不管是LPUSH還是RPUSH,都可以一次給一個key賦多個值
| RPOP 或者 LPOP 命令可以從LIST的右邊或者左邊刪除一個值,並返回刪除的值
| 使用PUSH 和POP命令的組合可以展示佇列和棧的效果;左側存左側取同向存取則為棧,先進後出; 左側存右側取逆向存取則為佇列,先進先出
| LINDEX或RINDEX 命令可以獲取LIST中指定下標的值(LINDEX key 4)
| LTRIM key start stop 或RTRIM命令可以擷取LIST中指定長度的資料(LTRIM key 0 2
),只保留LIST中指定長度的資料,LTRIM的應用場景為永遠只保留最新的資料,例如永遠只獲取前幾個最新的熱點評論
| LIST上的阻塞操作: 當使用POP命令從LIST中獲取資料時,如果此時LIST為空,則使用者需要在客戶端不斷輪詢請求,無效的輪詢會浪費CPU並且增加REDIS的壓力;這個時候就可以使用BRPOP或者BLPOP命令以阻塞的方式獲取資料,可以給阻塞增加超時時間,如果在指定時間內有資料了則返回,如果在指定時間內沒有資料被獲取則返回null。同時,redis還為所有阻塞的消費者按照先後順序進行排隊
| 在LIST中還有進階的安全佇列命令:RPOPLPUSH和BRPOPLPUSH。
“RPOPLPUSH key1
key2”從key1所屬LIST右側讀取一個數據然後推送到key2所屬的LIST左側;
如果key1不存在則返回null,並且不執行任何操作;
如果key1和key2相同,那麼這個步驟就相當於一個旋轉操作成為一個迴圈佇列;
BRPOPLPUSH是RPOPLPUSH的阻塞佇列版本,也可以指定等待阻塞的時間;
RPOPLPUSH模式一安全佇列的應用場景為:當客戶端讀取資料後把資料從key1尾部移動到key2頭部,當客戶端處理完資料後,可以使用LREM命令再刪除key2中的資料,這種模式可以防止因為客戶端崩潰而丟失資料,定時任務可以定時掃描key2,如果key2中有的值已經存在很長時間了,則可以把它重新加入到key1訊息佇列中;
RPOPLPUSH模式二迴圈佇列也可以應用到監控程式中,多個客戶端同時對一個key進行旋轉操作,他們會得到不同的值,當佇列中訊息都被訪問過之後,佇列又會從頭開始進行,這個模式的好處是,當某一個客戶端出錯把訊息丟失了也不用擔心,在一定的時間之後可以被重新讀取到。
後續redis中將要講解的內容梳理
往期文章
Redis
Java集合
二、Jdk1.7和1.8中HashMap資料結構及原始碼分析
三、JDK1.7和1.8HashMap資料結構及原始碼分析-續
八、JDK1.8中HashMap擴容機制
Java-IO體系
一、C10K問題經典問答
二、java.nio.ByteBuffer用法小結
三、Channel 通道
四、Selector選擇器
五、Centos-Linux安裝nc
六、windows環境下netcat的安裝及使用
七、IDEA的maven專案的netty包的匯入(其他jar同)
八、JAVA IO/NIO
九、網路IO原理-建立ServerSocket的過程
十、網路IO原理-徹底弄懂IO
十一、JAVA中ServerSocket呼叫Linux系統核心
十二、IO進化過程之BIO
十三、Java-IO進化過程之NIO
十四、使用Selector(多路複用器)實現Netty中Reactor單執行緒模型
十五、使用Selector(多路複用器)實現Netty中Reactor主從模型
十六、Netty入門服務端程式碼
十七、IO進化過程之EVENT(EPOLL-事件驅動非同步模型)
如需瞭解更多更詳細內容也可關注本人CSDN部落格:不吃_花椒