Redis5.x五種資料型別常見命令
關注公眾號:CoderBuff,回覆“redis”獲取《Redis5.x入門教程》完整版PDF。
- 《Redis5.x入門教程》目錄
- 第一章 · 準備工作
- 第二章 · 資料型別
- 第三章 · 命令
- 第四章 · 配置
- 第五章 · Java客戶端(上)
- 第六章 · 事務
- 第七章 · 分散式鎖
- 第八章 · Java客戶端(下)
第三章 · 命令
按照第一章 準備工作中的步驟,我們通過redis-cli
命令進入redis命令列互動。
本章節將圍繞上一章節的資料型別,針對不同的資料型別操作不同的Redis命令。
字串(string)
讀/寫/刪簡單命令
寫命令通過set
關鍵字實現,set [key] [value]
127.0.0.1:6379> set hello world
OK
讀命令通過get
關鍵字實現,get [key]
。
127.0.0.1:6379> get hello
"world"
刪除命令通過del
關鍵字實現(刪除命令可以適用於所有的資料型別),del [key]
。
127.0.0.1:6379> del hello
(integer) 1
字串資料型別還有一個mset
表示同時寫入一個或多個字串值,mset [key1] [value1] [key2] [value2]
。
127.0.0.1:6379> mset key1 value1 key2 value2 OK
自增/自減命令
自增+1命令通過incr
關鍵字實現,incr [key]
。
127.0.0.1:6379> set hello 1 #寫入key為hello的值為1 OK 127.0.0.1:6379> get hello #讀取key為hello的值 "1" 127.0.0.1:6379> incr hello #將key為hello的值自增+1 (integer) 2 127.0.0.1:6379> get hello #讀取key為hello的值 "2"
自減-1命令通過decr
關鍵字實現,decr [key]
。
127.0.0.1:6379> set world 1 #寫入key為world的值為1
OK
127.0.0.1:6379> get world #讀取key為world的值
"1"
127.0.0.1:6379> decr world #將key為world的值自減-1
(integer) 0
127.0.0.1:6379> get world #讀取key為world的值
"0"
自增任意整數通過incrby
實現,incrby [key] [number]
。
127.0.0.1:6379> set coderbuff 1 #寫入key為coderbuff的值為1
OK
127.0.0.1:6379> get coderbuff #讀取key為coderbuff的值
"1"
127.0.0.1:6379> incrby coderbuff 10 #將key為coderbuff的值自增+10
(integer) 11
127.0.0.1:6379> get coderbuff #讀取key為coderbuff的值
"11"
自減任意整數通過decrby
實現,decrby [key] [number]
。
127.0.0.1:6379> set coderbook 1 #寫入key為coderbook的值為1
OK
127.0.0.1:6379> get coderbook #讀取key為coderbook的值
"1"
127.0.0.1:6379> decrby coderbook 10 #將key為coderbook的值自增-10
(integer) -9
127.0.0.1:6379> get coderbook #讀取key為coderbook的值
"-9"
自增任意浮點數通過incrbyfloat
,incrbyfloat [key] [float]
。
127.0.0.1:6379> set coderchat 1 #寫入key為coderchat的值為1
OK
127.0.0.1:6379> get coderchat #讀取key為coderchat的值
"1"
127.0.0.1:6379> incrbyfloat coderchat 1.1 #將key為coderchat的值自增+1.1
"2.1"
127.0.0.1:6379> get coderchat #讀取key為coderchat的值
"2.1"
字串操作命令
redis中對字串型別的資料型別不僅可以使用上述命令,它甚至還能像Java一樣進行值得追加、獲取子串等。
追加value值給指定key到末尾通過append
,apppend [key] [append_string]
。
127.0.0.1:6379> set say hello #寫入key為say的值為hello
OK
127.0.0.1:6379> get say #讀取key為say的值
"hello"
127.0.0.1:6379> append say world #在key為say的value值末尾追加world
(integer) 10 #返回key當前value值得長度
127.0.0.1:6379> get say #讀取key為say的值
"helloworld"
接著這個示例,通過命令getrange
獲取子字串,getrange [key] [start] [end]
。
127.0.0.1:6379> getrange say 1 10 #獲取位於位置1到10的子字串
"elloworld"
127.0.0.1:6379> get say #可以看到,儘管我們上面獲取了子字串,但並未修改原字串
"helloworld"
同樣是這個示例,我們通過命令setrange
替換子字串為給定值,我們會給出兩個關鍵引數,第一個引數是[start]表示從哪裡開始替換,第二個引數是[value]表示替換的內容,setrange [key] [start] [value]
。
127.0.0.1:6379> setrange say 1 i
(integer) 10
127.0.0.1:6379> get say
"hilloworld"
二進位制位命令
任何資料在作業系統中都是以二進位制位形式儲存的,字串型別中redis提供了對其進行二進位制位操作。通常情況下運用可能不多,但可以通過它實現一些“巧妙”的設計。
例如,在釘釘訊息中,我們傳送一條訊息會顯示“已讀”和“未讀”的人,我們需要將這兩個資訊儲存在redis中,應該怎麼設計?
我們設計一條訊息的key值結構為“[user_id]:[msg_id]”,所以key=“1:100”就表示“使用者ID為1傳送的訊息ID為100”。注意,此時如果使用者ID=2的人讀了這條訊息,就通過命令setbit 1:100 2 1
寫入,如果使用者ID=100的人讀了這條訊息,就通過setbit 1:100 10 1
。這條命令的含義表示對key=1:100的二進位制第2位寫入1,對key=1:100的二進位制第10位寫入1,1表示已讀,0則表示未讀。
127.0.0.1:6379> set 1:100 0 #定義key=1:100,表示使用者ID為1發出的訊息ID為100的訊息
OK
127.0.0.1:6379> setbit 1:100 0 0 #初始化1:100的第0位到第10位的二進位制為0,表示剛發出來都是未讀。
(integer) 0
127.0.0.1:6379> setbit 1:100 1 0
(integer) 0
127.0.0.1:6379> setbit 1:100 2 0
(integer) 1
127.0.0.1:6379> setbit 1:100 3 0
(integer) 1
127.0.0.1:6379> setbit 1:100 4 0
(integer) 0
127.0.0.1:6379> setbit 1:100 5 0
(integer) 0
127.0.0.1:6379> setbit 1:100 6 0
(integer) 0
127.0.0.1:6379> setbit 1:100 7 0
(integer) 0
127.0.0.1:6379> setbit 1:100 8 0
(integer) 0
127.0.0.1:6379> setbit 1:100 9 0
(integer) 0
127.0.0.1:6379> setbit 1:100 10 0
上面我們就初始化好了一個bitmap(點陣圖)。接下來,當用戶ID=2和使用者ID=10讀了這條訊息。
127.0.0.1:6379> setbit 1:100 1 1 #實際上,發出訊息的同時,自己也已讀了
(integer) 0
127.0.0.1:6379> setbit 1:100 2 1 #使用者ID=2讀了這條訊息
(integer) 0
127.0.0.1:6379> setbit 1:100 10 1 #使用者ID=10讀了這條訊息
(integer) 0
我們通過getbit
命令可以判斷出哪些使用者是否已讀這條訊息,例如,我們判斷使用者ID=3是否已讀這條訊息。
127.0.0.1:6379> getbit 1:100 3 #讀取key為1:100的二進位制位第3位二進位制值
(integer) 0 #返回0,表示未讀
判斷使用者ID=10是否已讀這條訊息。
127.0.0.1:6379> getbit 1:100 10 #讀取key為1:100的二進位制位第10位二進位制值
(integer) 1 #返回1,表示已讀
我們還可以通過bitcount
統計值為1的數量,也就是有多少人已讀這條訊息。
127.0.0.1:6379> bitcount 1:100 #統計二進位制位為1的數量
(integer) 3 #只有3個,和我們上面的假定一致,使用者自己(使用者ID=1)和使用者ID=2、使用者ID=10的使用者讀了這條訊息
最後還有一個關於二進位制位的命令bittop [operation] [result] [key1] [key2]
,可以對多個key值的二進位制位進行二進位制運算,包括並AND
、或OR
、異或XOR
、非NOT
,計算結果儲存在[result]中。
列表(list)
推入/彈出常用命令
通過rpush
、lpush
,將一個或多個值向右或向左推入。
rpush [key] [value1] [value2]
,將value值推入到列表的右端。
lpush [key] [value1] [value2]
,將value值推入到列表的左端。
127.0.0.1:6379> rpush books java #向列表key值為books的右側推入value值java
(integer) 1
127.0.0.1:6379> lpush books c #向列表key值為books的左側推入value值c
(integer) 2
127.0.0.1:6379> rpush books python #向列表key值為books的右側推入value值python
(integer) 3
127.0.0.1:6379> lrange books 0 -1 #檢視列表key值為books的值
1) "c"
2) "java"
3) "python"
接著上面的示例,通過rpop
、lpop
,移除並返回列表中最後端、最左端的元素。
rpop [key]
,移除列表最後端的元素。
lpop [key]
,移除列表最左端的元素。
127.0.0.1:6379> rpop books #移除列表key值為books最右端的元素並返回
"python"
127.0.0.1:6379> lrange books 0 -1 #檢視列表key為books的所有元素
1) "c"
2) "java"
127.0.0.1:6379> lpop books #移除列表key值為books最左端的元素並返回
"c"
127.0.0.1:6379> lrange books 0 -1 #檢視列表key為books的所有元素
1) "java"
在介紹完推入和彈出命令後,接下來將介紹與列表範圍檢視的命令。
lrange [key] [start] [end]
命令用於返回列表從[start]到[end]位置範圍內的所有元素,注意,位於[start]、[end]的元素也會被返回,上面的例子已經出現過該命令。
127.0.0.1:6379> rpush level A B C D #對列表key為level的右側連續推入value:A B C D
(integer) 4
127.0.0.1:6379> lrange level 0 1 #返回key為level的位置0~1的元素
1) "A"
2) "B"
127.0.0.1:6379> lrange level 0 -1 #檢視列表key為level的所有元素
1) "A"
2) "B"
2) "C"
2) "D"
lindex [key] [index]
命令用於返回指定位置[index]的元素,仍然使用上述示例。
127.0.0.1:6379> lindex level 3
"D"
lrange
和lindex
均不會修改原本的列表值,但ltrim
則用於“修建”列表值。
ltrim [key] [start] [end]
表示只保留列表從[start]到[end]範圍的所有元素,注意,包含位於[start]、[end]的元素,同樣採用上述示例。
127.0.0.1:6379> lrange level 0 -1 #檢視列表key為level的所有元素
1) "A"
2) "B"
2) "C"
2) "D"
127.0.0.1:6379> ltrim level 1 2 #保留列表位置為1~2的元素
OK
127.0.0.1:6379> lrange level 0 -1 #檢視列表key為level的所有元素
1) "B"
2) "C"
列表基本的命令就是上面這些,還有一些比較“高階”的命令:將元素從一個佇列移動到另外一個佇列,或者阻塞式的執行彈出命令知道有新元素新加入到列表中。在這裡就不再介紹,後面章節在介紹到redis的一些應用時再講。
雜湊(hash)
hmset
命令可寫入hash型別的值,hmset [key] [field1] [value1] [field2] [value2]
。
127.0.0.1:6379> hmset okevin name kevin sex male
OK
hmget
命令可讀取hash型別的值,hmget [key] [field]
。
127.0.0.1:6379> hmget okevin name
1) "kevin"
hlen
返回hash包含的鍵值對數量,hlen [key]
。
127.0.0.1:6379> hlen okevin
(integer) 2
hmgetall
返回hash包含的所有鍵值對,hmgetall [key]
。
127.0.0.1:6379> hgetall okevin #返回所有的鍵值對,奇數列為field,偶數列為value
1) "name"
2) "kevin"
3) "sex"
4) "male"
hexists
命令檢查給定的field是否存在hash值中,返回0表示不存在,返回1表示存在,hexists [key] [field]
。
127.0.0.1:6379> hexists okevin name
(integer) 1
127.0.0.1:6379> hexists okevin age
(integer) 0
hkeys
獲取hash包含的所有field鍵,hkeys [key]
。
127.0.0.1:6379> hkeys okevin
1) "name"
2) "sex"
hvals
獲取hash包含的所有field對應的value值,hvals [key]
。
127.0.0.1:6379> hvals okevin
1) "kevin"
2) "male"
hincrby
給hash中指定的field鍵自增任意整數(和字串型別的incrby
類似),hincrby [key] [field] [number]
。
127.0.0.1:6379> hmset okevin age 0 #新增“年齡”field值為0
OK
127.0.0.1:6379> hmget okevin age #獲取“年齡”
1) "0"
127.0.0.1:6379> hincrby okevin age 25 #給“年齡”field自增“25”整數
(integer) 25
127.0.0.1:6379> hmget okevin age #獲取“年齡”
1) "25"
hincrbyfloat
給hash中指定的filed鍵自增任意浮點數(和字串型別的incrbyfloat
類似),hincrbyfloat [key] [field] [number]
。
127.0.0.1:6379> hincrbyfloat okevin age 0.5
"25.5"
127.0.0.1:6379> hmget okevin age
1) "25.5"
hdel
刪除hash中指定的filed,hmdel [key] [field]
。
127.0.0.1:6379> hgetall okevin
1) "name"
2) "kevin"
3) "sex"
4) "male"
5) "age"
6) "25.5"
127.0.0.1:6379> hdel okevin age
(integer) 1
127.0.0.1:6379> hgetall okevin
1) "name"
2) "kevin"
3) "sex"
4) "male"
集合(set)
在上一章節講到,集合(set)是以無序方式儲存各不相同元素的資料型別。它和Java中的Set型別類似。它同樣具有新增、刪除、讀取等基本操作,還有兩個集合之間運算的操作。
讀/寫等常用命令
sadd
命令將一個或多個元素新增到集合裡,並返回被新增元素中原本並不存在集合中的元素數量,sadd [key] [member] [member]
。
127.0.0.1:6379> sadd students kevin yulinfeng
(integer) 2
sismember
命令檢查元素是否存在集合中,返回1表示存在,返回0表示不存在,sismember [key] [member]
。
127.0.0.1:6379> sismember students kevin
(integer) 1
127.0.0.1:6379> sismember students linfeng
(integer) 0
smembers
命令返回集合中包含的所有元素,smembers [key]
。
127.0.0.1:6379> smembers students
1) "yulinfeng"
2) "kevin"
scard
命令返回集合中元素的數量,scards [key]
。
127.0.0.1:6379> scard students
(integer) 2
srandmember
命令從集合中隨機返回一個或多個元素,當返回的元素數量設定為正數時,元素不會重複,當返回的元素數量設定為負數時,元素可能會重複,srandmember [key] [count]
。
127.0.0.1:6379> srandmember students 1
1) "yulinfeng"
127.0.0.1:6379> srandmember students 1
1) "kevin"
127.0.0.1:6379> srandmember students 3
1) "kevin"
2) "yulinfeng"
127.0.0.1:6379> srandmember students -3
1) "yulinfeng"
2) "kevin"
3) "kevin"
srem
命令從集合中移除一個或多個指定的元素,並返回被移除的元素數量,srem [key] [member] [member]
。
多個集合命令
redis可以對多個集合進行操作,例如數學中的差集運算、交集運算等。下面只列舉多個集合操作的命令,不再舉例,但如果有場景運用時一定要知道redis還可以做多集合運算。
sdiff [key1] [key2]……
命令返回存在於key1,但不存在於其他集合(key2)中的元素(差集運算)。
sdiff [dest-key] [key1] [key2]……
命令也是同上的差集運算,但它將元素儲存到dest-key鍵中。
sinter [key1] [key2]……
命令返回同時存在所有集合(key1、key2)中的元素(交集運算)。
sinterstore [dest-key] [key1] [key2]……
命令也是同上的交集運算,但它將元素儲存到dest-key鍵中。
sunion [key1] [key2]……
命令返回所有集合中(key1、key2)的元素(並集運算)。
sunionstore [dest-key] [key1] [key2]……
命令也是同上的並集運算,但它將元素儲存到dest-key鍵中。
有序集合
在上一章資料型別中,我們談到儘管“有序集合”這種資料型別,更像是“集合”的有序版,但對於資料結構上講,它更類似“雜湊(hash)”。它同雜湊型別一樣,值也是k-v形式,不同的是有序集合的v代表的是用於排序的“分數”。
讀/寫等常用命令
zadd
用於有序集合的寫入操作,zadd [key] [score1] [member1] [score2] [member2]……
。
127.0.0.1:6379> zadd sorted 2 a 3 b
(integer) 2
zcard
命令用於返回有序集合中的成員數量,zcard [key]
。
127.0.0.1:6379> zcard sorted
(integer) 2
zrank
用於返回有序集合中成員member的排名(按分數從小到大排列),zrank [key] [member]
。
127.0.0.1:6379> zrank sorted a
(integer) 0
127.0.0.1:6379> zrank sorted b
(integer) 1
zrevrank
命令也是返回成員member的排名,但它和zrank
排序規則相反,它是按分數從大到小排列,zrevrank [key] [member]
。
127.0.0.1:6379> zrevrank sorted a
(integer) 1
127.0.0.1:6379> zrevrank sorted b
(integer) 0
zscore
命令返回成員member的分數,zscore [key] [member]
。
127.0.0.1:6379> zscore sorted a
"2"
zrange [key] [start] [stop] (withscores)
命令用於返回有序集合中排名介於start和stop之間的成員(按分數從小到大排列),withscores引數可選表示是否返回分數,start和end指的是排在第幾名,從0開始。
127.0.0.1:6379> zrange sorted 0 0 withscores
1) "a"
2) "2"
127.0.0.1:6379> zrange sorted 0 1 withscores
1) "a"
2) "2"
3) "b"
4) "3"
zrevrange
同zrange
類似,但它是按分數從大到小排列,zrevrange [key] [start] [end] (withscores)
。
127.0.0.1:6379> zrevrange sorted 0 0 withscores
1) "b"
2) "3"
127.0.0.1:6379> zrevrange sorted 0 1 withscores
1) "b"
2) "3"
3) "a"
4) "2"
zcount [key] [min_score] [max_score]
返回分數介於min_score和max_score之間的成員數量。
127.0.0.1:6379> zcount sorted 0 2
(integer) 1
127.0.0.1:6379> zcount sorted 0 3
(integer) 2
zincrby [key] [incrment] [member]
命令用於給member成員的分數加上incrment。
127.0.0.1:6379> zincrby sorted 2 a
"4"
zrem
命令用於刪除有序集合中指定的成員,zrem [key] [member1] [member2]……
。
127.0.0.1:6379> zrem sorted a
(integer) 1
多個有序集合命令
同集合一樣,有序集合也可以做多個集合的操作,例如交集、並集等。
zinterstore
用於交集運算。
zunionstore
用於並集運算。
關注公眾號:CoderBuff,回覆“redis”獲取《Redis5.x入門教程》完整版PDF。
這是一個能給程式設計師加buff的公眾號 (CoderBuff)