Redis5.x五種數據類型常見命令


關注公眾號:CoderBuff,回復“redis”獲取《Redis5.x入門教程》完整版PDF。

第三章 · 命令

按照第一章 准備工作中的步驟,我們通過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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM