redis系列(二)- 語法與命令

GitLqr發表於2019-02-23

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)複製程式碼

相關文章