解讀Redis常見命令

2023-09-14 18:00:21

Redis資料結構介紹

Redis是一個key-value的資料庫,key一般是String型別,不過value的型別多種多樣:

貼心小建議:命令不要死記,學會查詢就好啦

Redis為了方便我們學習,將操作不同資料型別的命令也做了分組,在官網:https://redis.io/commands 可以檢視到不同的命令:

當然我們也可以通過Help命令來幫助我們去檢視命令

Redis 通用命令

通用指令是部分資料型別的,都可以使用的指令,常見的有:

  • KEYS:檢視符合模板的所有key
  • DEL:刪除一個指定的key
  • EXISTS:判斷key是否存在
  • EXPIRE:給一個key設定有效期,有效期到期時該key會被自動刪除
  • TTL:檢視一個KEY的剩餘有效期

通過help [command] 可以檢視一個命令的具體用法,例如:

程式碼如下

  • KEYS
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379>

# 查詢以a開頭的key
127.0.0.1:6379> keys a*
1) "age"
127.0.0.1:6379>

貼心小提示:在生產環境下,不推薦使用keys 命令,因為這個命令在key過多的情況下,效率不高

  • DEL
127.0.0.1:6379> help del

  DEL key [key ...]
  summary: Delete a key
  since: 1.0.0
  group: generic

127.0.0.1:6379> del name #刪除單個
(integer) 1  #成功刪除1個

127.0.0.1:6379> keys *
1) "age"

127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 #批次新增資料
OK

127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
4) "age"

127.0.0.1:6379> del k1 k2 k3 k4
(integer) 3   #此處返回的是成功刪除的key,由於redis中只有k1,k2,k3 所以只成功刪除3個,最終返回
127.0.0.1:6379>

127.0.0.1:6379> keys * #再查詢全部的key
1) "age"	#只剩下一個了
127.0.0.1:6379>

貼心小提示:在拷貝程式碼的時候,只需要拷貝對應的命令哦~

  • EXISTS
127.0.0.1:6379> help EXISTS

  EXISTS key [key ...]
  summary: Determine if a key exists
  since: 1.0.0
  group: generic

127.0.0.1:6379> exists age
(integer) 1

127.0.0.1:6379> exists name
(integer) 0
  • EXPIRE

貼心小提示:記憶體非常寶貴,對於一些資料,我們應當給他一些過期時間,當過期時間到了之後,他就會自動被刪除~

127.0.0.1:6379> expire age 10
(integer) 1

127.0.0.1:6379> ttl age
(integer) 8

127.0.0.1:6379> ttl age
(integer) 6

127.0.0.1:6379> ttl age
(integer) -2

127.0.0.1:6379> ttl age
(integer) -2  #當這個key過期了,那麼此時查詢出來就是-2 

127.0.0.1:6379> keys *
(empty list or set)

127.0.0.1:6379> set age 10 #如果沒有設定過期時間
OK

127.0.0.1:6379> ttl age
(integer) -1  # ttl的返回值就是-1

Redis命令-Key的層級結構

Redis沒有類似MySQL中的Table的概念,我們該如何區分不同型別的key呢?

例如,需要儲存使用者.商品資訊到redis,有一個使用者id是1,有一個商品id恰好也是1,此時如果使用id作為key,那就會衝突了,該怎麼辦?

我們可以通過給key新增字首加以區分,不過這個字首不是隨便加的,有一定的規範:

Redis的key允許有多個單詞形成層級結構,多個單詞之間用':'隔開,格式如下:

這個格式並非固定,也可以根據自己的需求來刪除或新增詞條。

例如我們的專案名稱叫 zhangsan,有user和product兩種不同型別的資料,我們可以這樣定義key:

  • user相關的key:zhangsan:user:1

  • product相關的key:zhangsan:product:1

如果Value是一個Java物件,例如一個User物件,則可以將物件序列化為JSON字串後儲存:

KEY VALUE
zhangsan:user:1 {"id":1, "name": "Jack", "age": 21}
zhangsan:product:1 {"id":1, "name": "小米11", "price": 4999}

一旦我們向redis採用這樣的方式儲存,那麼在視覺化介面中,redis會以層級結構來進行儲存,形成類似於這樣的結構,更加方便Redis獲取資料

Redis命令-String命令

String型別,也就是字串型別,是Redis中最簡單的儲存型別。

其value是字串,不過根據字串的格式不同,又可以分為3類:

  • string:普通字串
  • int:整數型別,可以做自增.自減操作
  • float:浮點型別,可以做自增.自減操作

String的常見命令有:

  • SET:新增或者修改已經存在的一個String型別的鍵值對
  • GET:根據key獲取String型別的value
  • MSET:批次新增多個String型別的鍵值對
  • MGET:根據多個key獲取多個String型別的value
  • INCR:讓一個整型的key自增1
  • INCRBY:讓一個整型的key自增並指定步長,例如:incrby num 2 讓num值自增2
  • INCRBYFLOAT:讓一個浮點型別的數位自增並指定步長
  • SETNX:新增一個String型別的鍵值對,前提是這個key不存在,否則不執行
  • SETEX:新增一個String型別的鍵值對,並且指定有效期

貼心小提示:以上命令除了INCRBYFLOAT 都是常用命令

  • SET 和GET: 如果key不存在則是新增,如果存在則是修改
127.0.0.1:6379> set name Rose  //原來不存在
OK

127.0.0.1:6379> get name 
"Rose"

127.0.0.1:6379> set name Jack //原來存在,就是修改
OK

127.0.0.1:6379> get name
"Jack"
  • MSET和MGET
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK

127.0.0.1:6379> MGET name age k1 k2 k3
1) "Jack" //之前存在的name
2) "10"   //之前存在的age
3) "v1"
4) "v2"
5) "v3"
  • INCR和INCRBY和DECY
127.0.0.1:6379> get age 
"10"

127.0.0.1:6379> incr age //增加1
(integer) 11
    
127.0.0.1:6379> get age //獲得age
"11"

127.0.0.1:6379> incrby age 2 //一次增加2
(integer) 13 //返回目前的age的值
    
127.0.0.1:6379> incrby age 2
(integer) 15
    
127.0.0.1:6379> incrby age -1 //也可以增加負數,相當於減
(integer) 14
    
127.0.0.1:6379> incrby age -2 //一次減少2個
(integer) 12
    
127.0.0.1:6379> DECR age //相當於 incr 負數,減少正常用法
(integer) 11
    
127.0.0.1:6379> get age 
"11"

  • SETNX
127.0.0.1:6379> help setnx

  SETNX key value
  summary: Set the value of a key, only if the key does not exist
  since: 1.0.0
  group: string

127.0.0.1:6379> set name Jack  //設定名稱
OK
127.0.0.1:6379> setnx name lisi //如果key不存在,則新增成功
(integer) 0
127.0.0.1:6379> get name //由於name已經存在,所以lisi的操作失敗
"Jack"
127.0.0.1:6379> setnx name2 lisi //name2 不存在,所以操作成功
(integer) 1
127.0.0.1:6379> get name2 
"lisi"
  • SETEX
127.0.0.1:6379> setex name 10 jack
OK

127.0.0.1:6379> ttl name
(integer) 8

127.0.0.1:6379> ttl name
(integer) 7

127.0.0.1:6379> ttl name
(integer) 5

Redis命令-Hash命令

Hash型別,也叫雜湊,其value是一個無序字典,類似於Java中的HashMap結構。

String結構是將物件序列化為JSON字串後儲存,當需要修改物件某個欄位時很不方便:

Hash結構可以將物件中的每個欄位獨立儲存,可以針對單個欄位做CRUD:

Hash型別的常見命令

  • HSET key field value:新增或者修改hash型別key的field的值
  • HGET key field:獲取一個hash型別key的field的值
  • HMSET:批次新增多個hash型別key的field的值
  • HMGET:批次獲取多個hash型別key的field的值
  • HGETALL:獲取一個hash型別的key中的所有的field和value
  • HKEYS:獲取一個hash型別的key中的所有的field
  • HINCRBY:讓一個hash型別key的欄位值自增並指定步長
  • HSETNX:新增一個hash型別的key的field值,前提是這個field不存在,否則不執行

貼心小提示:雜湊結構也是以後實際開發中常用的命令

  • HSET和HGET
127.0.0.1:6379> HSET zhangsan:user:3 name Lucy//大key是 zhangsan:user:3 小key是name,小value是Lucy
(integer) 1
127.0.0.1:6379> HSET zhangsan:user:3 age 21// 如果操作不存在的資料,則是新增
(integer) 1
127.0.0.1:6379> HSET zhangsan:user:3 age 17 //如果操作存在的資料,則是修改
(integer) 0
127.0.0.1:6379> HGET zhangsan:user:3 name 
"Lucy"
127.0.0.1:6379> HGET zhangsan:user:3 age
"17"
  • HMSET和HMGET
127.0.0.1:6379> HMSET zhangsan:user:4 name HanMeiMei
OK
127.0.0.1:6379> HMSET zhangsan:user:4 name LiLei age 20 sex man
OK
127.0.0.1:6379> HMGET zhangsan:user:4 name age sex
1) "LiLei"
2) "20"
3) "man"
  • HGETALL
127.0.0.1:6379> HGETALL zhangsan:user:4
1) "name"
2) "LiLei"
3) "age"
4) "20"
5) "sex"
6) "man"
  • HKEYS和HVALS
127.0.0.1:6379> HKEYS zhangsan:user:4
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS zhangsan:user:4
1) "LiLei"
2) "20"
3) "man"
  • HINCRBY
127.0.0.1:6379> HINCRBY  zhangsan:user:4 age 2
(integer) 22
127.0.0.1:6379> HVALS zhangsan:user:4
1) "LiLei"
2) "22"
3) "man"
127.0.0.1:6379> HINCRBY  zhangsan:user:4 age -2
(integer) 20
  • HSETNX
127.0.0.1:6379> HSETNX zhangsan:user4 sex woman
(integer) 1
127.0.0.1:6379> HGETALL zhangsan:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
127.0.0.1:6379> HSETNX zhangsan:user:3 sex woman
(integer) 1
127.0.0.1:6379> HGETALL zhangsan:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
5) "sex"
6) "woman"

Redis命令-List命令

Redis中的List型別與Java中的LinkedList類似,可以看做是一個雙向連結串列結構。既可以支援正向檢索和也可以支援反向檢索。

特徵也與LinkedList類似:

  • 有序
  • 元素可以重複
  • 插入和刪除快
  • 查詢速度一般

常用來儲存一個有序資料,例如:朋友圈點贊列表,評論列表等。

List的常見命令有:

  • LPUSH key element ... :向列表左側插入一個或多個元素
  • LPOP key:移除並返回列表左側的第一個元素,沒有則返回nil
  • RPUSH key element ... :向列表右側插入一個或多個元素
  • RPOP key:移除並返回列表右側的第一個元素
  • LRANGE key star end:返回一段角標範圍內的所有元素
  • BLPOPBRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil

  • LPUSH和RPUSH
127.0.0.1:6379> LPUSH users 1 2 3
(integer) 3
127.0.0.1:6379> RPUSH users 4 5 6
(integer) 6
  • LPOP和RPOP
127.0.0.1:6379> LPOP users
"3"
127.0.0.1:6379> RPOP users
"6"
  • LRANGE
127.0.0.1:6379> LRANGE users 1 2
1) "1"
2) "4"

Redis命令-Set命令

Redis的Set結構與Java中的HashSet類似,可以看做是一個value為null的HashMap。因為也是一個hash表,因此具備與HashSet類似的特徵:

  • 無序
  • 元素不可重複
  • 查詢快
  • 支援交集.並集.差集等功能

Set型別的常見命令

  • SADD key member ... :向set中新增一個或多個元素
  • SREM key member ... : 移除set中的指定元素
  • SCARD key: 返回set中元素的個數
  • SISMEMBER key member:判斷一個元素是否存在於set中
  • SMEMBERS:獲取set中的所有元素
  • SINTER key1 key2 ... :求key1與key2的交集
  • SDIFF key1 key2 ... :求key1與key2的差集
  • SUNION key1 key2 ...:求key1和key2的並集

例如兩個集合:s1和s2:

求交集:SINTER s1 s2

求s1與s2的不同:SDIFF s1 s2

具體命令

127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> smembers s1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> srem s1 a
(integer) 1
    
127.0.0.1:6379> SISMEMBER s1 a
(integer) 0
    
127.0.0.1:6379> SISMEMBER s1 b
(integer) 1
    
127.0.0.1:6379> SCARD s1
(integer) 2

案例

  • 將下列資料用Redis的Set集合來儲存:
  • 張三的好友有:李四.王五.趙六
  • 李四的好友有:王五.麻子.二狗
  • 利用Set的命令實現下列功能:
  • 計算張三的好友有幾人
  • 計算張三和李四有哪些共同好友
  • 查詢哪些人是張三的好友卻不是李四的好友
  • 查詢張三和李四的好友總共有哪些人
  • 判斷李四是否是張三的好友
  • 判斷張三是否是李四的好友
  • 將李四從張三的好友列表中移除
127.0.0.1:6379> SADD zs lisi wangwu zhaoliu
(integer) 3
    
127.0.0.1:6379> SADD ls wangwu mazi ergou
(integer) 3
    
127.0.0.1:6379> SCARD zs
(integer) 3
    
127.0.0.1:6379> SINTER zs ls
1) "wangwu"
    
127.0.0.1:6379> SDIFF zs ls
1) "zhaoliu"
2) "lisi"
    
127.0.0.1:6379> SUNION zs ls
1) "wangwu"
2) "zhaoliu"
3) "lisi"
4) "mazi"
5) "ergou"
    
127.0.0.1:6379> SISMEMBER zs lisi
(integer) 1
    
127.0.0.1:6379> SISMEMBER ls zhangsan
(integer) 0
    
127.0.0.1:6379> SREM zs lisi
(integer) 1
    
127.0.0.1:6379> SMEMBERS zs
1) "zhaoliu"
2) "wangwu"

Redis命令-SortedSet型別

Redis的SortedSet是一個可排序的set集合,與Java中的TreeSet有些類似,但底層資料結構卻差別很大。SortedSet中的每一個元素都帶有一個score屬性,可以基於score屬性對元素排序,底層的實現是一個跳錶(SkipList)加 hash表。

SortedSet具備下列特性:

  • 可排序
  • 元素不重複
  • 查詢速度快

因為SortedSet的可排序特性,經常被用來實現排行榜這樣的功能。

SortedSet的常見命令

  • ZADD key score member:新增一個或多個元素到sorted set ,如果已經存在則更新其score值
  • ZREM key member:刪除sorted set中的一個指定元素
  • ZSCORE key member: 獲取sorted set中的指定元素的score值
  • ZRANK key member:獲取sorted set 中的指定元素的排名
  • ZCARD key:獲取sorted set中的元素個數
  • ZCOUNT key min max:統計score值在給定範圍內的所有元素的個數
  • ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值
  • ZRANGE key min max:按照score排序後,獲取指定排名範圍內的元素
  • ZRANGEBYSCORE key min max:按照score排序後,獲取指定score範圍內的元素
  • ZDIFF.ZINTER.ZUNION:求差集.交集.並集

注意:所有的排名預設都是升序,如果要降序則在命令的Z後面新增REV即可,例如:

  • 升序獲取sorted set 中的指定元素的排名:ZRANK key member
  • 降序獲取sorted set 中的指定元素的排名:ZREVRANK key memeber