關注公衆號:CoderBuff,回覆「redis」獲取《Redis5.x入門教程》完整版PDF。html
按照第一章 準備工做中的步驟,咱們經過redis-cli
命令進入redis命令行交互。java
本章節將圍繞上一章節的數據類型,針對不一樣的數據類型操做不一樣的Redis命令。python
寫命令經過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"
自增任意浮點數經過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=二、用戶ID=10的用戶讀了這條消息
最後還有一個關於二進制位的命令bittop [operation] [result] [key1] [key2]
,能夠對多個key值的二進制位進行二進制運算,包括並AND
、或OR
、異或XOR
、非NOT
,計算結果保存在[result]中。
經過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的一些應用時再講。
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)是以無序方式存儲各不相同元素的數據類型。它和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"
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。