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
判定性添加數據
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) 8
127.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) 1
127.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"
獲取規(guī)則:
-
從左到右舰蟆,索引分別為0、1声滥、2呜叫、3、4...
如:c(0) b(1) a(2) d(3) e(4) f(5)
-
從右到左怠李,索引分別為 -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"
規(guī)定時間內獲取并移除數據
語法:
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髓介,則可以獲取到數據惕鼓,操作如下:
- 在當前連接窗口中執(zhí)行指定時間內獲取命令,命令會處于等待狀態(tài)
127.0.0.1:6379> blpop a b c 20
|
- 打開一個新的連接唐础,20秒之內在新連接窗口中向a或b或c中存入數據
127.0.0.1:6379> lpush a a1
(integer) 1
- 窗口1會立馬獲取到向a中存入的數據
127.0.0.1:6379> blpop a b c 20
1) "a"
2) "a1"
(3.05s)
規(guī)定時間內取出一個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 …]
示例(以交集為例):
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
示例:
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重名沖突的幾率就比較高括尸。要解決這個問題,除了我們在命名時盡量做到統(tǒng)一和規(guī)范以外病毡,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
統(tǒng)計當前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