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

關注公衆號:CoderBuff,回覆「redis」獲取《Redis5.x入門教程》完整版PDF。html

第三章 · 命令

按照第一章 準備工做中的步驟,咱們經過redis-cli命令進入redis命令行交互。java

本章節將圍繞上一章節的數據類型,針對不一樣的數據類型操做不一樣的Redis命令。python

字符串(string)

讀/寫/刪簡單命令

寫命令經過set關鍵字實現,set [key] [value]程序員

127.0.0.1:6379> set hello world
OK

讀命令經過get關鍵字實現,get [key]redis

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]app

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=二、用戶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]……命令返回同時存在全部集合(key一、key2)中的元素(交集運算)。

sinterstore [dest-key] [key1] [key2]……命令也是同上的交集運算,但它將元素存儲到dest-key鍵中。

sunion [key1] [key2]……命令返回全部集合中(key一、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)
相關文章
相關標籤/搜索