1. 程式人生 > 實用技巧 >redis常用命令

redis常用命令

Redis常用命令操作

1. 資料型別

  • string

  • hash

  • list

  • set

  • sortedset/zset

2. 操作命令

2.1 操作 string

2.1.1 string 基礎操作

新增/修改資料

語法:
set key value
示例:
127.0.0.1:6379> set username zhangsan
OK

獲取資料

語法:
get key
示例:
127.0.0.1:6379> get username
"zhangsan"    

刪除資料

語法:
del key
示例:
127.0.0.1:6379> del username
(integer) 
1

判定性新增資料(key不存在才新增)

語法:
setnx key value
示例:
127.0.0.1:6379> setnx username zhangsan
(integer) 1
127.0.0.1:6379> setnx username lisi
(integer) 0

新增/修改多個數據

語法:
mset key1 value1 key2 value2 …
示例:
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK

獲取多個數據

語法:
mget key1 key2 …
示例:
127.0.0.1:6379> mget k1 k2 k3
1) "v1" 2) "v2" 3) "v3"

獲取資料的字元個數(字串長度)

語法:
strlen key
示例:
127.0.0.1:6379> strlen username
(integer) 8127.0.0.1:6379> strlen k1
(integer) 2

追加字元到原始字串後面(如果原始字串存在就追加,否則新建)

語法:
append key value
示例:
127.0.0.1:6379> append username 1
(integer) 9
127.0.0.1:6379> get username
"zhangsan1"127.0
.0.1:6379> append password 123 (integer) 3 127.0.0.1:6379> get password "123"

2.1.2 string 擴充套件操作

設定整形數值資料自增(預設自增1)

語法:
incr key
示例:
127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3

設定整形數值資料增加指定整數值

語法:
incrby key increment
示例:
127.0.0.1:6379> incrby num 10
(integer) 13

設定資料資料增加指定小數值

語法:
incrbyfloat key increment
示例:
127.0.0.1:6379> incrbyfloat num 1.5
"14.5"

設定整形數值資料自減(預設自減1)

語法:
decr key
示例:
127.0.0.1:6379> set num2 10
OK
127.0.0.1:6379> decr num2
(integer) 9

設定設定整形數值資料減小指定值

語法:
decrby key decrement
示例:
127.0.0.1:6379> decrby num2 2
(integer) 7

設定資料的有效時長(支援自動過期)

1.單位為秒
語法: 
setex key seconds value
示例:
127.0.0.1:6379> setex code 10 abcd
OK
10秒內獲取
127.0.0.1:6379> get code
"abcd"
10秒後獲取
127.0.0.1:6379> get code
(nil)
​
2.單位為毫秒
語法: 
psetex key milliseconds value
使用方式一致,不再演示

2.2 操作 hash

2.2.1 hash 基礎操作

新增、修改資料

語法1-新增單個:
hset key field value
示例:
127.0.0.1:6379> hset user:001 name zhangsan
(integer) 1
​
語法2-批量新增:
hmset key field1 value1 field2 value2 …
示例:
127.0.0.1:6379> hmset user:001 password 123 age 18
OK
​
語法3-判定性設定field的值,如果該field存在則不做任何操作:
hsetnx key field value
示例:
127.0.0.1:6379> hsetnx user:001 name lisi
(integer) 0

根據key和field獲取單個vlaue

語法:
hget key field
示例:
127.0.0.1:6379> hget user:001 name
"zhangsan"

根據key獲取所有的field和value

語法:
hgetall key
示例:
127.0.0.1:6379> hgetall user:001
1) "name"
2) "zhangsan"
3) "password"
4) "123"
5) "age"
6) "18"

刪除資料

語法:
hdel key field1 [field2 field3...]
示例:
127.0.0.1:6379> hdel user:001 name
(integer) 1127.0.0.1:6379> hdel user:001 password age
(integer) 2

根據key獲取field的數量

語法:
hlen key
示例:
127.0.0.1:6379> hmset user:001 name zhangsan password 123 age 18
OK
127.0.0.1:6379> hlen user:001
(integer) 3

判斷指定field是否存在

語法:
hexists key field
示例:
127.0.0.1:6379> hexists user:001 name
(integer) 1
127.0.0.1:6379> hexists user:001 name111
(integer) 0

2.2.2 hash 擴充套件操作

根據key獲取所有的欄位名field

語法:
hkeys key
示例:
127.0.0.1:6379> hkeys user:001
1) "name"
2) "password"
3) "age"

根據key獲取所有的欄位值value

語法:
hvals key
示例:
127.0.0.1:6379> hvals user:001
1) "zhangsan"
2) "123"
3) "18"

設定指定欄位的數值資料增加指定範圍的值

語法:
hincrby key field increment
hincrbyfloat key field increment
示例:
127.0.0.1:6379> hget user:001 age
"18"
127.0.0.1:6379> hincrby user:001 age 1
(integer) 19
127.0.0.1:6379> hincrby user:001 age -2
(integer) 17

2.3 操作list

2.3.1 list 基礎操作

新增資料

  • 從左側新增

語法:
lpush key value1 [value2 value3...]
示例:
127.0.0.1:6379> lpush list1 a b c
(integer) 3

當前資料為: c b a

  • 從右側新增

語法:
rpush key value1 [value2 value3...]
示例:
127.0.0.1:6379> rpush list1 d e f
(integer) 6

當前資料為: c b a d e f

獲取資料

  • 範圍獲取

語法:
lrange key start stop
示例1:
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
6) "f"
示例2:
127.0.0.1:6379> lrange list1 0 2
1) "c"
2) "b"
3) "a"
示例3:
127.0.0.1:6379> lrange list1 -3 -1
1) "d"
2) "e"
3) "f"

索引規則:

  1. 從左到右,索引分別為0、1、2、3、4...

    如:c(0) b(1) a(2) d(3) e(4) f(5)

  2. 從右到左,索引分別為 -1、-2、-3、-4...

    如:c(-6) b(-5) a(-4) d(-3) e(-2) f(-1)

  • 獲取指定索引的value

語法:
lindex key index
示例:
127.0.0.1:6379> lindex list1 0
"c"
127.0.0.1:6379> lindex list1 1
"b"
127.0.0.1:6379> lindex list1 -1
"f"
  • 移除並返回最左側或最右側的元素

語法:
lpop key
rpop key
示例:
127.0.0.1:6379> lpop list1
"c"
127.0.0.1:6379> rpop list1
"f"
  • 根據key獲取value的個數

語法:
llen key
示例:
127.0.0.1:6379> llen list1
(integer) 4

2.3.2 list 擴充套件操作

刪除指定key中指定數量的field

語法:
lrem key count value
示例:
127.0.0.1:6379> rpush list2 a b b b b c d d d d
(integer) 10
127.0.0.1:6379> lrem list2 4 b
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "c"
3) "d"
4) "d"
5) "d"
6) "d"
127.0.0.1:6379> lrem list2 5 d
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "c"

規定時間內獲取並移除資料

語法:
blpop key1 [key2 key3...] timeout
brpop key1 [key2 key3...] timeout
示例:
127.0.0.1:6379> lpush a a1
(integer) 1
127.0.0.1:6379> lpush b b1
(integer) 1
127.0.0.1:6379> lpush c c1
(integer) 1
127.0.0.1:6379> blpop a b c 5
1) "a"
2) "a1"
127.0.0.1:6379> blpop a b c 5
1) "b"
2) "b1"
127.0.0.1:6379> blpop a b c 5
1) "c"
2) "c1"
127.0.0.1:6379> blpop a b c 5
(nil)
(5.76s)

最後一次沒有獲取到資料,但是如果在等待的5秒中之內,另一個連線向 a b c 任意一個key中存入了value,則可以獲取到資料,操作如下:

  1. 在當前連線視窗中執行指定時間內獲取命令,命令會處於等待狀態

127.0.0.1:6379> blpop a b c 20
|
  1. 開啟一個新的客戶端視窗,20秒之內在新連線視窗中向a或b或c中存入資料

127.0.0.1:6379> lpush a a1
(integer) 1
  1. 視窗1會立馬獲取到最新存入的資料

127.0.0.1:6379> blpop a b c 20
1) "a"
2) "a1"
(3.05s)

規定時間內取出一個list的尾部元素並新增到另一個list的頭部

語法:
brpoplpush source destination timeout
source:被移除的list
destination:要新增的list
示例:
127.0.0.1:6379> rpush list3 a b c
(integer) 3
127.0.0.1:6379> lrange list3 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpush list4 aa bb cc
(integer) 3
127.0.0.1:6379> lrange list4 0 -1
1) "aa"
2) "bb"
3) "cc"
127.0.0.1:6379> brpoplpush list3 list4 10
"c"
127.0.0.1:6379> lrange list3 0 -1
1) "a"
2) "b"
127.0.0.1:6379> lrange list4 0 -1
1) "c"
2) "aa"
3) "bb"
4) "cc"

2.4 操作 set

2.4.1 set 基礎操作

新增資料

語法:
sadd key member1 [member2...]
示例:
127.0.0.1:6379> sadd set1 a a b c d
(integer) 4

獲取全部資料

語法:
smembers key
示例:
127.0.0.1:6379> smembers set1
1) "a"
2) "d"
3) "c"
4) "b"

刪除資料

語法:
srem key member1 [member2...]
示例:
127.0.0.1:6379> srem set1 a b
(integer) 2
127.0.0.1:6379> smembers set1
1) "d"
2) "c"

獲取member元素的個數

語法:
scard key
示例:
127.0.0.1:6379> scard set1
(integer) 2

判斷集合中是否包含指定資料

語法:
sismember key member
示例:
127.0.0.1:6379> sismember set1 d
(integer) 1
127.0.0.1:6379> sismember set1 ddd
(integer) 0

隨機獲取集合中[指定數量]的資料

語法:
srandmember key [count]
示例:
127.0.0.1:6379> sadd set2 a b c d e f g h i
(integer) 9
127.0.0.1:6379> srandmember set2
"b"
127.0.0.1:6379> srandmember set2
"b"
127.0.0.1:6379> srandmember set2
"h"
127.0.0.1:6379> srandmember set2
"e"
127.0.0.1:6379>  
127.0.0.1:6379> srandmember set2 3
1) "f"
2) "e"
3) "h"
127.0.0.1:6379> srandmember set2 3
1) "d"
2) "c"
3) "i"
127.0.0.1:6379> srandmember set2 3
1) "e"
2) "h"
3) "g"

隨機移除並返回集合中的某個資料

語法:
spop key
示例:
127.0.0.1:6379> spop set2
"i"
127.0.0.1:6379> spop set2
"d"
127.0.0.1:6379> smembers set2
1) "a"
2) "h"
3) "f"
4) "b"
5) "e"
6) "g"
7) "c"

2.4.1 set 擴充套件操作

求多個集合的交、並、差集

  • 交集

語法:
sinter key1 [key2 …]  
示例:
127.0.0.1:6379> sadd s1 a b c d e f
(integer) 6
127.0.0.1:6379> sadd s2 a bb c dd e ff
(integer) 6
127.0.0.1:6379> sinter s1 s2
1) "c"
2) "a"
3) "e"
  • 並集

語法:
sunion key1 [key2 …]  
示例:
127.0.0.1:6379> sunion s1 s2
1) "f"
2) "dd"
3) "b"
4) "a"
5) "d"
6) "bb"
7) "e"
8) "c"
9) "ff"
  • 差集

語法:
sdiff key1 [key2 …]
示例:
127.0.0.1:6379> sdiff s1 s2
1) "f"
2) "d"
3) "b"
127.0.0.1:6379> sdiff s2 s1
1) "ff"
2) "dd"
3) "bb"

求多個集合的交、並、差集並存儲到指定集合中

語法:
交集: sinterstore destination key1 [key2 …]  
並集: sunionstore destination key1 [key2 …]  
差集: sdiffstore destination key1 [key2 …]
示例(以交集為例,將s1和s2的交集儲存到s3中):
127.0.0.1:6379> smembers s3
(empty list or set)
127.0.0.1:6379> sinter s1 s2
1) "a"
2) "e"
3) "c"
127.0.0.1:6379> sinterstore s3 s1 s2
(integer) 3
127.0.0.1:6379> smembers s3
1) "e"
2) "a"
3) "c"

將指定資料從原始集合中移動到目標集合中

語法:
smove source destination member
示例(將s1中的a元素移動到s4中):
127.0.0.1:6379> smembers s4
(empty list or set)
127.0.0.1:6379> smove s1 s4 a
(integer) 1
127.0.0.1:6379> smembers s4
1) "a"
127.0.0.1:6379> smembers s1
1) "e"
2) "d"
3) "c"
4) "f"
5) "b"

2.5 key 的操作

2.5.1 key 的基本操作

刪除指定key(根據key刪除任意型別資料)

語法:
del key
示例1-刪除string:
127.0.0.1:6379> set aa bb
OK
127.0.0.1:6379> get aa
"bb"
127.0.0.1:6379> del aa
(integer) 1
127.0.0.1:6379> get aa
(nil)
示例2-刪除hash:
127.0.0.1:6379> hset hash1 k1 v1
(integer) 1
127.0.0.1:6379> hgetall hash1
1) "k1"
2) "v1"
127.0.0.1:6379> del hash1
(integer) 1
127.0.0.1:6379> hgetall hash1
(empty list or set)

...其它資料型別同理...

判斷key是否存在

語法:
exists key
示例:
127.0.0.1:6379> set aaa bbb
OK
127.0.0.1:6379> exists aaa
(integer) 1
127.0.0.1:6379> exists bbb
(integer) 0

獲取key的型別

語法:
type key
示例:
127.0.0.1:6379> set mystring hellostring
OK
127.0.0.1:6379> hset myhash k1 v1
(integer) 1
127.0.0.1:6379> type mystring
string
127.0.0.1:6379> type myhash
hash

對list、set中的數值資料進行排序

語法:
sort key         #升序
sort key desc    #降序
示例:
127.0.0.1:6379> del list1
(integer) 0
127.0.0.1:6379> lpush list1 11 2 33 7 5 18
(integer) 6
127.0.0.1:6379> sort list1
1) "2"
2) "5"
3) "7"
4) "11"
5) "18"
6) "33"
127.0.0.1:6379> sort list1 desc
1) "33"
2) "18"
3) "11"
4) "7"
5) "5"
6) "2"

對list、set中的字串資料進行排序

語法:
sort key alpha
sort key desc alpha
示例:
127.0.0.1:6379> del list2
(integer) 0
127.0.0.1:6379> lpush list2 a b c d
(integer) 4
127.0.0.1:6379> sort list2
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> sort list2 alpha
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> sort list2 desc alpha
1) "d"
2) "c"
3) "b"
4) "a"

重新命名key

語法1-如果新的key已存在會先刪除新key然後在重新命名:
rename key newkey
示例:
127.0.0.1:6379> del username
(integer) 0
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> set username2 lisi
OK
127.0.0.1:6379> rename username username2
OK
127.0.0.1:6379> get username
(nil)
127.0.0.1:6379> get username2
"zhangsan"

語法2-如果新的key不存在則重新命名:
renamenx key newkey
示例:
127.0.0.1:6379> set username3 wangwu
OK
127.0.0.1:6379> renamenx username2 username3
(integer) 0
127.0.0.1:6379> renamenx username2 username4
(integer) 1
127.0.0.1:6379> get username4
"zhangsan"

2.5.2 key 的擴充套件操作

獲取key的有效時間

語法1-獲取秒為單位的時效:
ttl key
語法2-獲取毫秒為單位的時效:
pttl key
示例:
127.0.0.1:6379> del username
(integer) 0
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> ttl username
(integer) -1
127.0.0.1:6379> ttl username2
(integer) -2
127.0.0.1:6379> setex username3 30 wangwu
OK
127.0.0.1:6379> ttl username3
(integer) 21
127.0.0.1:6379> pttl username3
(integer) 15840

返回-1代表key沒有設定有效時間,返回-2代表key不存在,返回正數代表剩餘有效時長

為指定key設定有效期

語法:
expire key seconds
pexpire key milliseconds
示例:
127.0.0.1:6379> del hash1
(integer) 0
127.0.0.1:6379> hset hash1 k1 v1
(integer) 1
127.0.0.1:6379> ttl hash1
(integer) -1
127.0.0.1:6379> expire hash1 30
(integer) 1
127.0.0.1:6379> ttl hash1
(integer) 20

127.0.0.1:6379> del hash2
(integer) 1
127.0.0.1:6379> hset hash2 k2 v2
(integer) 1
127.0.0.1:6379> ttl hash2
(integer) -1
127.0.0.1:6379> pexpire hash2 30000
(integer) 1
127.0.0.1:6379> ttl hash2
(integer) 26
127.0.0.1:6379> pttl hash2
(integer) 21380

切換key從時效性轉換為永久性

語法:
persist key
示例:
127.0.0.1:6379> del username
(integer) 0
127.0.0.1:6379> setex username 60 zhangsan
OK
127.0.0.1:6379> ttl username
(integer) 55
127.0.0.1:6379> persist username
(integer) 1
127.0.0.1:6379> ttl username
(integer) -1

查詢key

語法:
keys pattern
示例:
127.0.0.1:6379> del username
(integer) 1
127.0.0.1:6379> set username1 zhangsan1
OK
127.0.0.1:6379> set username2 zhangsan2
OK
127.0.0.1:6379> set username3 zhangsan3
OK
127.0.0.1:6379> keys *
1) "username3"
2) "username1"
3) "username2"
127.0.0.1:6379> keys username*
1) "username3"
2) "username1"
3) "username2"
127.0.0.1:6379> keys *3
1) "username3"

2.6 db 常用指令

2.6.1 存在的問題

redis在使用過程中,伴隨著操作資料量的增加,會出現大量的資料以及對應的key。這是key重名衝突的機率就比較高。要解決這個問題,除了我們在命名時儘量做到統一和規範以外,redis 自身也提供了一個解決機制。

2.6.2 解決方式

redis為每個服務提供有16個數據庫,編號從0到15,每個資料庫之間是相互獨立的。如果沒有進行過特殊設定,預設使用的是0號資料庫。

2.6.3 db 基礎操作

切換資料庫

語法:
select index
示例:
select 1

2.6.4 db 擴充套件操作

資料移動

語法:
move key index
示例:
move username 1

統計當前db中key的數量

語法:
dbsize
示例:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 1

清除資料

語法1-清除當前db中所有資料:
flushdb
語法2-清除所有db中的資料:
flushall