1. 程式人生 > >Redis5.x五種資料型別常見命令

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"

自增任意浮點數通過incrbyfloatincrbyfloat [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到末尾通過appendapppend [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)

推入/彈出常用命令

通過rpushlpush,將一個或多個值向右或向左推入。

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"

接著上面的示例,通過rpoplpop,移除並返回列表中最後端、最左端的元素。

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"

lrangelindex均不會修改原本的列表值,但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"

zrevrangezrange類似,但它是按分數從大到小排列,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)