redis系列文章:
redis系列(一)- 安裝與啟動
redis系列(二)- 語法與命令
一、簡述
Redis支援的鍵值型別有:String字元型別、map雜湊型別、list列表型別、set集合型別、sortedset有序集合型別。本篇將對這些鍵值型別在使用上進行總結,並介紹下Keys命令,雖然語法簡單,但由於數量過多,還需要我們多多實踐。
二、String字元型別
1、賦值
語法:SET key value
127.0.0.1:6379> set test 123
OK複製程式碼
2、取值
語法:GET key
127.0.0.1:6379> get test
"123“複製程式碼
3、取值並賦值
語法:GETSET key value
127.0.0.1:6379> getset s2 222
"111"
127.0.0.1:6379> get s2
"222"複製程式碼
4、設定/獲取多個鍵值
語法:
- MSET key value [key value …]
- MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k1 k3
1) "v1"
2) "v3"複製程式碼
5、刪除
語法:DEL key
127.0.0.1:6379> del test
(integer) 1複製程式碼
6、數值增減
a. 遞增數字
當儲存的字串是整數時,redis提供一個實用的命令INCR,其作用是讓當前鍵值遞增,並返回遞增後的值。
語法:INCR key
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3複製程式碼
b. 增加指定整數
語法:INCRBY key increment
127.0.0.1:6379> incrby num 2
(integer) 5
127.0.0.1:6379> incrby num 2
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9複製程式碼
c. 遞減數值
語法:DECR key
127.0.0.1:6379> decr num
(integer) 9
127.0.0.1:6379> decr num
(integer) 8複製程式碼
d. 減少指定整數
語法:DECRBY key decrement
127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> decr num
(integer) 5
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> decrby num 3
(integer) -1複製程式碼
7、向尾部追加值
append的作用是向鍵值的末尾追加value。如果鍵不存在則將該鍵的值設定為value,即相當於set key value。返回值是追加後字串的總長度。
語法:APPEND key value
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str
"hello world!"複製程式碼
8、獲取字串長度
STRLEN命令返回鍵值的長度,如果鍵不存在則返回0.
語法:STRLEN key
127.0.0.1:6379> strlen str
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str
(integer) 5複製程式碼
三、map雜湊型別
在redis中,map也叫hash。假設有User物件以JSON序列化的形式儲存到Redis中,User物件有id,username、password、age、name等屬性,儲存的過程如下:
儲存、更新: User物件 –> json(string) –> redis 。
如果在業務上只是更新age屬性,其他的屬性並不做更新我應該怎麼做呢? 如果仍然採用上邊的方法在傳輸、處理時會造成資源浪費,下邊講的hash可以很好的解決這個問題。
redis hash介紹
hash叫雜湊型別,它提供了欄位和欄位值的對映。欄位值只能是字串型別,
不支援雜湊型別、集合型別等其他型別。如下:
1、賦值
HSET命令不區分插入和一時更新操作,當執行插入操作時HSET命令返回1,當執行更新操作時返回0。
一次設定一個欄位值
語法:HSET key field value
127.0.0.1:6379> hset user username zhangesan
(integer) 1複製程式碼
一次設定多個欄位值
語法:HMSET key field value [field value…]
127.0.0.1:6379> hmset user age 20 username lisi
OK複製程式碼
當欄位不存在時賦值,類似HSET,區別在於如果欄位存在,該命令不執行任何操作
語法:HSETNX key field value
127.0.0.1:6379> hsetnx user age 30
(integer) 0複製程式碼
如果user中沒有age欄位,則設定age值為30,否則不做任何操作。
2、取值
一次獲取一個欄位值
語法:HGET key field
127.0.0.1:6379> hget user username
"zhangesan"複製程式碼
一次獲取多個欄位值
語法:HMGET key filed[field…]
127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"複製程式碼
獲取所有欄位值
語法:HGETALL key
127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"複製程式碼
3、刪除欄位
可以刪除一個或多個欄位,返回值是被刪除的欄位個數。
語法:HDEL key field [field…]
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1複製程式碼
4、增加數字
語法:HINCRBY key field increment
127.0.0.1:6379> hincrby user age 2 將使用者的年齡加2
(integer) 22
127.0.0.1:6379> hget user age 獲取使用者的年齡
"22“複製程式碼
5、判斷欄位是否存在
語法:HEXISTS key field
127.0.0.1:6379> hexists user age 檢視user中是否有age欄位
(integer) 1
127.0.0.1:6379> hexists user name 檢視user中是否有name欄位
(integer) 0複製程式碼
6、只獲取欄位名或欄位值
語法:
- HKEYS key
- HVALS key
127.0.0.1:6379> hmset user age 20 name lisi
OK
127.0.0.1:6379> hkeys user
1) "age"
2) "name"
127.0.0.1:6379> hvals user
1) "20"
2) "lisi"複製程式碼
7、獲取欄位數量
語法:HLEN key
127.0.0.1:6379> hlen user
(integer) 2複製程式碼
四、list列表型別
Arraylist和linkedlist的區別
- ArrayList是使用陣列來儲存資料,特點:查詢快、增刪慢
- LinkedList是使用雙向連結串列儲存資料,特點:增刪快、查詢慢,但是查詢連結串列兩端的資料也很快。
redis的list採用連結串列來儲存,故對於redis的list資料型別的操作,是操作list的兩端資料來操作的。
1、向列表兩端增加元素
向列表左邊增加元素
語法:LPUSH key value [value…]
127.0.0.1:6379> lpush list1 1 2 3
(integer) 3複製程式碼
向列表右邊增加元素
127.0.0.1:6379> rpush list1 4 5 6
(integer) 3複製程式碼
2、檢視列表
LRANGE命令是列表型別最常用的命令之一,獲取列表中的某一片段,將返回start、stop之間的所有元素(包含兩端的元素),索引從0開始。索引可以是負數,如:“-1”代表最右邊的一個元素。
語法:LRANGE key start stop
127.0.0.1:6379> lrange list1 0 2
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"複製程式碼
3、從列表兩端彈出元素
LPOP命令從列表左邊彈出一個元素,會分兩步完成:
第一步:裝列表左邊的元素從列表中移除
第二步:返回被移除的元素值。
語法:
- LPOP key
- RPOP key
127.0.0.1:6379> lpop list1
"1"
127.0.0.1:6379> rpop list1
"6"複製程式碼
4、獲取列表中元素的個數
語法:LLEN key
127.0.0.1:6379> llen list1
(integer)4複製程式碼
5、刪除列表中指定的值
LREM命令會刪除列表中前count個值為value的元素,返回實際刪除的元素個數。根據count值的不同,該命令的執行方式會有所不同。
- 當count>0時,LREM會從列表左邊開始刪除。
- 當count<0時,LREM會從列表右邊開始刪除。
- 當count=0時,LREM刪除所有值為value的元素。
語法:LREM key count value
127.0.0.1:6379> lrem list1 1 4 從左邊開始刪除值為4的元素
(integer)1複製程式碼
6、獲取/設定指定索引的元素值
獲得指定索引的元素值
語法:LINDEX key index
127.0.0.1:6379> lindex list1 2
"5"複製程式碼
設定指定索引的元素值
語法:LSET key index value
127.0.0.1:6379> lset list1 2 4
OK
127.0.0.1:6379> lrange list1 0 -1
1) "2"
2) "3"
3) "4"複製程式碼
7、只保留列表指定片段
指定範圍和LRANGE一致
語法:LTRIM key start stop
127.0.0.1:6379> lrange list1 0 -1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> ltrim list1 0 1
OK
127.0.0.1:6379> lrange list1 0 -1
1) "4"複製程式碼
8、向列表中插入元素
該命令首先會在列表中從左到右查詢值為pivot的元素,然後根據第二個引數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面。
語法:LINSERT key BEFORE|AFTER pivot value
127.0.0.1:6379> lrange list1 0 -1
1) "4"
127.0.0.1:6379> linsert list1 after 4 5
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "4"
2) "5"複製程式碼
9、將元素從一個列表轉移到另一個列表中
語法:RPOPLPUSH source destination
127.0.0.1:6379> rpoplpush list1 list2
"5"
127.0.0.1:6379> lrange list2 0 -1
1)"5"
127.0.0.1:6379> lrange list1 0 -1
1) "4"複製程式碼
五、set集合型別
set(集合)與list(列表)的區別:
- 集合型別:無序、不可重複
- 列表型別:有序、可重複
1、增加/刪除元素
語法:SADD key member [member…]
127.0.0.1:6379> sadd set1 a b c
(integer)3
127.0.0.1:6379> sadd set1 a
(integer)0複製程式碼
語法:SREM key memeber [member…]
127.0.0.1:6379> srem set1 c d d不在集合中,故只移除c
(integer)1複製程式碼
2、獲取集合中所有元素
語法:SMEMBERS key
127.0.0.1:6379> smemebers set1
1)"b"
1)"a"複製程式碼
3、判斷元素是否在集合中
語法:SISMEMBER key member
127.0.0.1:6379> sismember set1 a
(integer)1
127.0.0.1:6379> sismember set1 h
(integer)0複製程式碼
4、運算命令
a. 集合的差集運算 A – B
屬於A並且不屬於B的元素構成的集合。
語法:SDIFF key [key…]
127.0.0.1:6379> sadd setA 1 2 3
(integer)3
127.0.0.1:6379> sadd setB 2 3 4
(integer)3
127.0.0.1:6379> sdiff setA setB
1)"1"
127.0.0.1:6379> sdiff setB setA
1)"4"複製程式碼
b. 集合的交集運算 A ∩ B
屬於A且屬於B的元素構成的集合。
語法:SINTER key [key…]
127.0.0.1:6379> sinter setA setB
1)"2"
2)"3"複製程式碼
c. 集合的並集運算 A ∪ B
屬於A或者屬於B的元素構成的集合。
語法:SUNION key [key…]
127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"複製程式碼
5、獲取集合中元素的個數
語法:SCARD key
127.0.0.1:6379> smembers setA
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> scard setA
(integer)3複製程式碼
6、從集合中彈出一個元素
注意:由於集合是無序的,所以SPOP命令會從集合中隨機選擇一個元素彈出。
語法:SPOP key
127.0.0.1:6379> spop setA
"1"複製程式碼
六、sortedset有序集合型別
Sortedset又叫zset,是有序集合,可排序,但是唯一。Sortedset與set不同之處是,會給set中的元素新增一個分數,然後通過這個分數進行排序。
1、增加元素
向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含之前已經存在的元素。
語法:ZADD key score member [score member…]
127.0.0.1:6379> zadd scoreboard 80 zhangesan 89 lisi 94 wangwu
(integer)3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer)0複製程式碼
2、獲取元素的分數
語法:ZSCORE key member
127.0.0.1:6379> zscore scoreboard lisi
"97"複製程式碼
3、刪除元素
移除有序集key中的一個或多個成員,不存在的成員將被忽略。
當key存在但不是有序集型別時,返回一個錯誤。
語法:ZREM key member [member…]
127.0.0.1:6379> zrem scoreboard lisi
(integer)1複製程式碼
4、獲取排名在某個範圍的元素列表
a. 按照元素分數從小到大的順序返回索引從start到stop之間的所有元素(包含兩端的元素)
語法:ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrange scoreboard 0 2
1)"zhangesan"
2)"wangwu"
3)"lisi"複製程式碼
b. 按照元素分數從大到小的順序返回索引從start到stop之間的所有元素(包含兩端的元素)
語法:ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrevrange scoredboard 0 2
1)"lisi"
2)"wangwu"
3)"zhangesan"複製程式碼
如果需要獲得元素的分數,可以在命令尾部加上WITHSCORES引數
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"複製程式碼
5、獲取元素的排名
a. 從小到大
語法:ZRANK key member
127.0.0.1:6379> zrank scoreboard lisi
(integer)0複製程式碼
b. 從大到小
語法:ZREVRANK key member
127.0.0.1:6379> zrevrank scoreboard zhangsan
(integer)1複製程式碼
6、獲取指定分數範圍的元素
語法:ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]
127.0.0.1:6379> zrangebyscore scoreboard 90 97 WITHSCORES
1) "wangwu"
2) "94"
3) "lisi"
4) "97"
127.0.0.1:6379> zrangebyscore scoreboard 70 100 limit 1 2
1) "wangwu"
2) "lisi"複製程式碼
7、增加某個元素的分數
返回值是更改後的分數
語法:ZINCRBY key increment member
127.0.0.1:6379> zincrby scoreboard 4 lisi
"101"複製程式碼
8、獲取集合中元素的數量
語法:ZCARD key
127.0.0.1:6379> zcard scoreboard
(integer)3 複製程式碼
9、獲得指定分數範圍內的元素個數
語法:ZCOUNT key min max
127.0.0.1:6379> zcount scoreboard 80 90
(integer) 1複製程式碼
10、按照排名範圍刪除元素
語法:ZREMRANGEBYRANK key start stop
127.0.0.1:6379> zremrangebyrank scoreboard 0 1
(integer)2
127.0.0.1:6379> zrange scoreboard 0 -1
1)"lisi"複製程式碼
11、按照分數範圍刪除元素
語法:ZREMRANGEBYSCORE key min max
127.0.0.1:6379> zadd scoreboard 84 zhangsan
(integer)1
127.0.0.1:6379> zremrangebyscore scoreboard 80 100
(integer)1複製程式碼
七、Keys命令
1、keys
返回滿足給定pattern的所有key
127.0.0.1:6379> keys mylist*
1) "mylist"
2) "mylist5"
3) "mylist6"
4) "mylist7"
5) "mylist8"複製程式碼
2、exists
確認一個key是否存在
示例:從結果來看,資料庫中不存在HongWan這個key,但是age這個key是存在的
127.0.0.1:6379> exists HongWan
(integer)0
127.0.0.1:6379> exists age
(integer)1複製程式碼
3、del
刪除一個key
127.0.0.1:6379> del age
(integer)1
127.0.0.1:6379> exists age
(integer)0複製程式碼
4、rename
重新命名key
示例:把age改成age_new。
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> rename age age_new
OK
127.0.0.1:6379>keys *
1) "age_new"複製程式碼
5、type
返回值的型別
示例:判斷出值的型別
127.0.0.1:6379> type addr
string
127.0.0.1:6379> type myzset2
set
127.0.0.1:6379> type mylist
list複製程式碼
6、設定key的生存時間
redis在實際使用過程中更多的是用作快取,然而快取的資料一般都是需要設定生存時間的,即:到期後資料銷燬。
EXPIRE key seconds 設定key的生存時間(單位:秒)key在多少秒後會自動刪除
TTL key 設定key剩餘的生存時間
PERSIST key 清除生存時間
PEXPIRE key milliseconds 生存時間設定單位為:毫秒複製程式碼
示例:
127.0.0.1:6379> set test 1 設定test的值為1
OK
127.0.0.1:6379> get test 獲取test的值
"1"
127.0.0.1:6379> EXPIRE test 5 設定test的生存時間為5秒
(integer)1
127.0.0.1:6379> TTL test 檢視test的生於生成時間還有1秒刪除
(integer)1
127.0.0.1:6379> TTL test
(integer) -2
127.0.0.1:6379> get test 獲取test的值,已經刪除
(nil)複製程式碼