1. 程式人生 > 其它 >解析Redis操作五大資料型別常用命令

解析Redis操作五大資料型別常用命令

摘要:分享經常用到一些命令和使用場景總結,以及對Redis中五大資料型別如何使用cmd命令列的形式進行操作的方法。

本文分享自華為雲社群《Redis操作五大資料型別常用命令解析》,作者:灰小猿。

Redis的幾個常用命令

資料庫切換

我們知道Redis預設有16個數據庫,預設是第0個數據庫,

那麼如果在需要對資料庫進行切換的時候,我們就可以使用下面這個命令:

使用如下命令進行切換

SELECT index

清除當前資料庫的資料

如果想要清除指定某一個數據庫的資料,

flushdb

清除所有資料庫的資料

flushall

檢視資料庫所有key

接下來這個命令應該是最常用的了,

keys *

判斷某個鍵是否存在

平常在開發中,我們還需要經常對key進行判斷,判斷其是否存在,

exists key

設定過期時間和檢視剩餘時間

因為我們設定的快取資料一般都不能是永久的,這個時候就需要我們在儲存資料的時候,就為其設定過期時間。

127.0.0.1:6379> expire test01 10
(integer) 1
127.0.0.1:6379> ttl test01
(integer) -2

檢視當前key的型別

type keyname

string資料型別

string型別是Redis中五大基本資料型別之一,這也是最常使用到的一個數據型別,所有很多小夥伴們對Redis的認識和操作就僅僅的停留在了對Redis的操作層面,

但是你是否知道string型別中的相關命令,還是有非常多實用的,

String型別存取基本操作

接下來先看一下對string型別進行基本儲存和獲取的命令。

127.0.0.1:6379> set key1 v1  #設定key和value
OK
127.0.0.1:6379> get key1  #獲取key對應的value
"v1"
127.0.0.1:6379> keys *  #獲取所有的key
1) "key1"
2) "mykey"
3) "hxy"
4) "site-list"
5) "hxy2"
6) "huixiaoyuan"
127.0.0.1:6379> exists key1  #檢視當前key是否存在
(integer) 
1 127.0.0.1:6379> append key1 hello #給當前key的value後面追加 (integer) 7 127.0.0.1:6379> strlen key1 #獲取value的長度 (integer) 7

遞增遞減操作

如果我們儲存的string中的內容是數字的話,我們也可以對其進行增或減操作,Redis可以自動的對字串進行相關的操作。實現的命令如下:

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> decr views
(integer) 1
127.0.0.1:6379> incrby views 10
(integer) 9
127.0.0.1:6379> decrby view 9
(integer) -9
127.0.0.1:6379> get views
"9"
127.0.0.1:6379> decrby views 9
(integer) 0
127.0.0.1:6379>

setex和setnx使用

  • setex 設定過期時間
  • setnx 不存在再設定,如果存在就設定不成功。常用於分散式鎖
#設定key3的值為hello,過期時間為30秒
127.0.0.1:6379> setex key3 30 hello
OK
127.0.0.1:6379> ttl key3
(integer) 21
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey2 redis
(integer) 1
127.0.0.1:6379> setnx mykey2 hxy
(integer) 0
127.0.0.1:6379> get mykey2
"redis"
127.0.0.1:6379>

mset和mget進行批量設定

使用msetnx時,同時設定一個或多個 key-value 對,當且僅當所有給定 key都不存在時才成立。

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379>

getset命令使用

getset命令從字面意思就可以看出來,他的作用是先get再set。

#如果不存在值,則返回null
127.0.0.1:6379> getset k5 v5
(nil)
127.0.0.1:6379> get k5
"v5"
如果存在值,就先獲取再設定新的值
127.0.0.1:6379> getset k5 vv5
"v5"
127.0.0.1:6379> get k5
"vv5"

總結

string類似的使用場景:

  • 計數器
  • 統計多單位數量
  • 物件快取儲存
  • 粉絲數

list資料型別

list存取基本操作

在使用list型別進行存取的時候,有兩個命令需要進行區分:

  • lpush:從左邊插入元素
  • rpush:從右邊插入元素
127.0.0.1:6379> lpush list1 v1
(integer) 1
127.0.0.1:6379> lpush list1 v2
(integer) 2
127.0.0.1:6379> lpush list1 v3
(integer) 3
127.0.0.1:6379> lrange list1 0 1
1) "v3"
2) "v2"
127.0.0.1:6379> rpush list1 v4
(integer) 4
127.0.0.1:6379> lrange list1 0 4
1) "v3"
2) "v2"
3) "v1"
4) "v4"

list型別移除元素

  • lpop 從左邊刪除
  • rpop 從右邊刪除
  • lrange keyname 0 -1 獲取list中的全部元素
127.0.0.1:6379> lpop list1
"v3"
127.0.0.1:6379> rpop list1
"v4"
127.0.0.1:6379> lrange list1 0 -1
1) "v2"
2) "v1"
127.0.0.1:6379>

注意:只有pop和push才分左右,其他的l都是list的意思

總結:

  • redis中的list其實是一個連結串列。before node after,left,right都可以插入值
  • 如果key不存在,就建立新的連結串列
  • 如果key存在,就新增內容
  • 如果移除了所有值,空連結串列,也代表不存在
  • 在兩邊插入或改動值效率最高,中間元素效率相對來說會低一點

set集合

set集合存取基本操作

127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset hello2
(integer) 1
127.0.0.1:6379> sadd myset hello3
(integer) 1
127.0.0.1:6379> smembers myset
1) "hello"
2) "hello3"
3) "hello2"
127.0.0.1:6379> sismember myset hello
(integer) 1
127.0.0.1:6379> sismember myset world
(integer) 0
127.0.0.1:6379>

獲取set中元素個數

127.0.0.1:6379> scard myset
(integer) 3

移除set集合中的指定元素

127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2

隨機抽選出指定個數的元素

127.0.0.1:6379> srandmember myset
"hello3"
127.0.0.1:6379> srandmember myset 2
1) "hello2"
2) "hello3"

隨機刪除一個元素

127.0.0.1:6379> spop myset
"hello2"

SDIFF差集 SINTER交集 SUNION並集

SDIFF keyname1 keyname2

總結

set集合一般用於元素的不重複的場景,比如抽獎系統,輪播等場景下

Hash(雜湊)

Hash存取基本操作

在使用hash集合的時候,要注意,hash其實就是一個Map集合,key-map的時候,值是一個map集合的形式進行儲存的,也和Java中的hashmap有一個類似。

#set一個具體的key-value
127.0.0.1:6379> hset myhash fieid1 v1
(integer) 1
127.0.0.1:6379> hget myhash fieid1
"v1"
#set多個key-value
127.0.0.1:6379> hmset myhash fieid1 v1 fieid2 v2
OK
#get多個欄位值
127.0.0.1:6379> hmget myhash fieid1 fieid2
1) "v1"
2) "v2"

HVALS獲取所有的value,HKEYS獲取所有的key,HGETALL獲取所有的鍵值

127.0.0.1:6379> HVALS myhash
1) "v1"
2) "v2"
127.0.0.1:6379> HKEYS myhash
1) "fieid1"
2) "fieid2"
127.0.0.1:6379> HGETALL myhash
1) "fieid1"
2) "v1"
3) "fieid2"
4) "v2"

總結:

  • hash可以用於儲存變更的資料,比如user,name,age等,尤其是使用者資訊之類的,hash更加適合用於物件的儲存,string更加適合用於字串的儲存。

Zset(有序集合)

在set集合的基礎上增加一個序列號,來進行排序

Zset有序集合存取基本操作

127.0.0.1:6379> ZADD salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> ZADD salary 6000 dahui
(integer) 1
127.0.0.1:6379> ZADD salary 1000 wanggang
(integer) 1
#指定輸出範圍是負無窮到正無窮,按照從小到大排序,
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "wanggang"
2) "xiaohong"
3) "dahui"
# 從大到小排序
127.0.0.1:6379> ZREVRANGE salary 0 -1
1) "dahui"
2) "xiaohong"
3) "wanggang"
ZRANGEBYSCORE使用語法
ZRANGEBYSCORE key min max

顯示所有資料,並且key和value同時顯示

127.0.0.1:6379>  ZRANGEBYSCORE salary -inf +inf withscores
1) "wanggang"
2) "1000"
3) "xiaohong"
4) "2500"
5) "dahui"
6) "6000"

獲取集合中元素的個數

127.0.0.1:6379> ZCARD salary
(integer) 3

總結

  • 案例思路:set排序,儲存班級成績,工資表排序
  • 普通訊息1,重要訊息2,帶權重進行判斷
  • 排行榜應用實現

以上是在對五種資料型別進行存取時的一些常用命令操作。關於其他的命令使用,小夥伴們在用到的時候可以直接入官網檢視就可以了

點選關注,第一時間瞭解華為雲新鮮技術~