解析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,帶權重進行判斷
- 排行榜應用實現
以上是在對五種資料型別進行存取時的一些常用命令操作。關於其他的命令使用,小夥伴們在用到的時候可以直接入官網檢視就可以了