1. 程式人生 > >Redis 常用數據結構及其控制命令整合

Redis 常用數據結構及其控制命令整合

復雜 cond 升序 僅支持 inf 找到 cli 哈希 12px

Redis 鍵值支持5種基本結構,分別是字符串,列表,哈希,集合,有序集合。每一種數據結構都有對應的取值和設值命令,輔助命令,除此之外,還有一些全局命令,用來管理Redis存儲的所有 鍵。


全局命令

查看所有鍵

keys *

127.0.0.1:6379> keys *
1) "name"
2) "fuck"
3) "mlist"
4) "dict:test"
5) "fuck1"
6) "hello"
7) "mset"
8) "fuck2"

>> keys 會遍歷所有鍵,當Redis存儲大量鍵時,容易阻塞Redis的單線程運行,慎用。  

查看鍵總數

dbsize

127.0.0.1:6379> dbsize
(integer) 8

>> dbsize在計算鍵總數的事件復雜度是O(1), dbsize不會像keys命令會去遍歷所有鍵,而是直接獲取鍵總數變量。

查看鍵是否存在

exists key

  如果鍵存在則返回1,不存在返回0

127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> get name
"lyh"
127.0.0.1:6379> exists sdf
(integer) 0

刪除鍵

del key [key ...]

>> del 可以刪除任意數據結構的鍵,可以同時將多個以空格分隔的鍵同時刪除

  >> 操作成功返回1,否則返回0

127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> get name
"lyh"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> exists name
(integer) 0

鍵過期

expire key seconds

127.0.0.1:6379> set name lyh
OK
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> expire name 10
(integer) 1 # 設置成功,返回1

查看鍵過期時間

ttl key

  >> ttl 命令有三種返回值

  >> 大於等於0的整數表示鍵剩余的過期時間

  >> -1時表示鍵沒有設置過期時間

  >>-2時表示鍵不存在

127.0.0.1:6379> ttl name
(integer) 2 #
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2

查看鍵的數據

type key

127.0.0.1:6379> set is:str str
OK
127.0.0.1:6379> rpush is:list 2 a dfdf fdf
(integer) 4
127.0.0.1:6379> sadd is:set 1 1 3 3
(integer) 2
127.0.0.1:6379> hmset is:hash key1 1 key2 2
OK
127.0.0.1:6379> type is:str
string
127.0.0.1:6379> type is:set
set
127.0.0.1:6379> type is:hash
hash

如果鍵不存在,則返回none

  


字符串

Redis的鍵都是字符串類型,只有鍵對應的值可以是多種數據結構的。另外,字符串的值除了可以是字符串(簡單的字符串,復雜的字符串,如JSON,XML),數字,

  甚至是二進制(圖片,音頻,視頻),但是值最大不能超過512M。

常用命令

  設置值

  set key value [ex seconds] [px milliseconds] [nx|xx]

  >> ex seconds 為鍵設置秒級過期時間

  >> px milliseconds 為鍵設置毫秒級過期時間

  >> nx 鍵不存在才可以設置成功,用於添加

  >> xx 鍵存在才可以設置成功,用於更新

  另外,Redis還提供了setex和setnx,作用和ex,nx選項是一樣的。

獲取值

  get key

  >> 如果要獲取的鍵不存在,則返回nil

批量設置值

mset key value [ key value ...]

批量獲取值

mget key [key ...]

計數

incr key

  >> incr命令用於對值做自增操作,返回結果有三種情況

>> 值不是整數,返回錯誤

>> 值是整數,返回自增後的結果

>> 鍵不存在,按照值為0自增,返回結果為1

對一個不在的鍵執行incr:

127.0.0.1:6379> exists not:exists
(integer) 0
127.0.0.1:6379> incr not:exists
(integer) 1

如果值不是整數,返回錯誤

127.0.0.1:6379> set notint notint
OK
127.0.0.1:6379> incr notint
(error) ERR value is not an integer or out of range

其他不常用命令

追加值到已有值後邊

append key value

獲取字符串長度

strlen key

設置並返回原值

getset key value

設置指定位置的字符

setrange key offset value

獲取部分字符串

getrange key start end


哈希 也可以叫做字典,關聯數組。在Redis中,哈希類型是指鍵值本身又是一個鍵值對結構。

常用命令

設置值

  hset key field value

  >>成功返回1,失敗返回0

  >>Redis 同時提供了hsetnx,當要設置的哈希不在時,才可以設置

獲取值

  hget key field

  >>鍵不存在返回nil

刪除鍵

  hdel key field [field ...]

  >>hdel可以刪除一個或多個field,返回結果為成功刪除field的個數

計算哈希內部field個數

  hlen key

批量設置或獲取

  hmget key field [field ...]

  hmset key field value [field value...]

判讀是否存在指定field

  hexists key field

獲取所有field

  hkeys key

獲取所有value

  hvals key

獲取所有field-value

  hgetall key

遞增哈希的field

hincrby key field

hincrbyfloat key field

>>hincrby 和 hincrbyfloat,就像incrby和incrbyfloat命令一樣,但是他們的作用域是field

計算value的字符串長度(需要Redis3.2以上)

  hstrlen key field


列表 列表中的元素是有序的,可通過索引下標獲取某個元素或者某個範圍內的元素列表;列表中的元素可以是重復的。

列表的四種操作

+----------------------------------------------------+

| 操作類型 | 操作 |

| 添加 | rpush lpush linsert |

| 查 | lrange lindex llen |

| 刪除 | lpop rpop ltrim lrem |

| 修改 | lset |

| 阻塞操作 | blpop brpop |

常用命令

  從右邊添加元素至列表

  rpush key value [value ...]

127.0.0.1:6379> rpush mlist 1 a b a fdfd aa
(integer) 13
127.0.0.1:6379> lrange 0 -1
(error) ERR wrong number of arguments for ‘lrange‘ command
127.0.0.1:6379> lrange mlist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
8) "1"
9) "a"
10) "b"
11) "a"
12) "fdfd"
13) "aa"

  從左邊添加元素至列表

  lpush key value [value ...]

    >> 使用方法和rpush相同,只不過從左側插入

  向某個元素前或者後插入元素

  linsert key before|after pivot value

  >> linsert 命令會從列表中找到等於pivot的元素,在其前或者後插入一個新的元素value,返回值為當前列表長度

127.0.0.1:6379> lrange mlist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
8) "1"
9) "a"
10) "b"
11) "a"
12) "fdfd"
13) "aa"
127.0.0.1:6379> linsert mlist before a z
(integer) 14

獲取指定範圍的列表元素

lrange key start end

>> 索引下標從左到右是0到N-1,從右到左是-1到-N,更重要的是,lrange中的end選項包含了自身,這和其他編程語言不包含end很不一樣

獲取列表指定索引下標的元素

lindex key index

獲取列表長度

llen

刪除列表元素

lrem key count value

>> lrem會從列表中找到等於value的元素進行刪除,根據count的不同分為三種情況

>>count > 0;從左到右,刪除最多count個元素

>>count < 0;從右到左,刪除count絕對值個元素

>>count = 0;刪除所有元素

按照索引範圍剪裁列表

ltrim key start end

127.0.0.1:6379> lrange mlist 0 -1
1) "z"
2) "a"
3) "b"
4) "c"
5) "d"
6) "e"
7) "f"
8) "g"
9) "1"
10) "a"
11) "b"
12) "a"
13) "fdfd"
14) "aa"
127.0.0.1:6379> ltrim mlist 1 4
OK
127.0.0.1:6379> lrange mlist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"

修改指定索引下標的元素

lset key index newValue

阻塞操作

阻塞式彈出 :blpop key [key ...] timeout; brpop key [key ...] timeout

>> blpop和brpop是lpop和rpop的阻塞版本,它們除了彈出方向不同,使用方法一樣。

>> key [key ....] 多個列表的鍵

>>timeout 阻塞時間,如果timeout=0,客戶端會一直等待下去。


集合(set), 可用來保存多個字符串元素。集合不允許有重復元素,並且集合中的元素是無序的,不能通過索引獲取元素。

常用命令

集合內操作

  添加元素

  sadd key element [element ...]

127.0.0.1:6379> exists firstset
(integer) 0
127.0.0.1:6379> sadd firstset my name is lyh
(integer) 4

獲取所有集合元素

smembers key

127.0.0.1:6379> smembers firstset
1) "name"
2) "is"
3) "lyh"
4) "my"

當集合元素過多時,使用smembers存在阻塞Redis的可能。

刪除元素

srem key element [element ...]

127.0.0.1:6379> srem firstset my
(integer) 1

判斷元素是否在集合中

sismember key element

如果元素在集合中,返回1,否則返回0

127.0.0.1:6379> sismember firstset my
(integer) 0
127.0.0.1:6379> sismember firstset lyh
(integer) 1

計算元素個數

scard key

127.0.0.1:6379> scard firstset
(integer) 3

隨機從集合返回指定個數元素

srandmember key [count]

[count] 為可選參數,默認為1,該命令不會改變集合元素

127.0.0.1:6379> srandmember firstset
"lyh"
127.0.0.1:6379> smembers firstset
1) "name"
2) "is"
3) "lyh"
127.0.0.1:6379> srandmember firstset 2
1) "name"
2) "lyh"
127.0.0.1:6379> smembers firstset
1) "name"
2) "is"
3) "lyh"

從集合中隨機彈出元素

spop key

該命令會實際從集合中去除彈出的元素

127.0.0.1:6379> smembers firstset
1) "name"
2) "is"
3) "lyh"
127.0.0.1:6379> spop firstset
"name"
127.0.0.1:6379> smembers firstset
1) "is"
2) "lyh"

集合間操作

提前設置兩個集合:

127.0.0.1:6379> sadd set:1 java python javascript
(integer) 3
127.0.0.1:6379> sadd set:2 python mysql redis javascript
(integer) 4

  求集合交集

  sinter key [key ...

127.0.0.1:6379> sinter set:1 set:2
1) "javascript"
2) "python"

  求集合的並集

  sunion key [key ...]

127.0.0.1:6379> sunion set:1 set:2
1) "python"
2) "java"
3) "javascript"
4) "redis"
5) "mysql"

求集合的差集

sdiff key [key ...]

127.0.0.1:6379> sdiff set:1 set:2
1) "java"
127.0.0.1:6379> sdiff set:2 set:1
1) "mysql"
2) "redis"

將交集,並集,差集的結果保存

  sinterstore target key [key ...]

sunionstore target key [key ...]

  sdiffstore target key [key ...]

127.0.0.1:6379> sdiffstore set:1:2:diff set:1 set:2
(integer) 1
127.0.0.1:6379> smembers set:1:2:diff
1) "java"


有序集合, 它保留了集合不能有重復成員的特性,但有序集合中的元素可以排序。比較特別的是,有序集合並不像列表那樣采用索引下標作為排序依據,而是給每個元素設置一個分數作為排序的依據。不同元素的分數可以相同。有序集合可以應用於排行榜系統,社交等。

常用命令

集合內

  添加成員

  zadd key score member [score member ...]

  score必須是數字,否則會報錯

127.0.0.1:6379> zadd zset:1 99 math 100 english 98 art
(integer) 3
127.0.0.1:6379> zadd zset:1 name lyh
(error) ERR value is not a valid float

當首次添加member時,會返回成功添加的個數,而如果member已經存在,此時使用zadd命令,則會更新 member,返回值為0,表示沒有添加新member

127.0.0.1:6379> zadd zset:1 999.9999 lyh
(integer) 1
127.0.0.1:6379> zadd zset:1 100 lyh
(integer) 0
127.0.0.1:6379> zadd zset:1 100 lyh100
(integer) 1
127.0.0.1:6379> zscore zset:1 lyh
"100"

在redis 3.2版本以後,zadd命令添加了nx, xx, ch, incr 四個選項

nx: member 必須不存在,才可以設置成功,用於添加。

127.0.0.1:6379> zadd zset:1 nx 200 lyh100
(integer) 0
127.0.0.1:6379> zscore zset:1 lyh100
"100"
127.0.0.1:6379> zadd zset:1 nx 200 lyh200
(integer) 1
127.0.0.1:6379> zscore zset:1 lyh200
"200"

xx: member必須存在,才可以設置成功,用於更新。

127.0.0.1:6379> zadd zset:1 xx 300 lyh300
(integer) 0
127.0.0.1:6379> zscore zset:1 lyh300
(nil)
127.0.0.1:6379> zadd zset:1 nx 200 lyh300
(integer) 1
127.0.0.1:6379> zscore zset:1 lyh300
"200"
127.0.0.1:6379> zadd zset:1 xx 300 lyh300
(integer) 0
127.0.0.1:6379> zscore zset:1 lyh300
"300"

ch: 返回此次操作後,有序集合元素和分數發生變化的個數

incr: 對score做增加,相當於後面介紹的zincrby

127.0.0.1:6379> zadd zset:1 incr 1 lyh300
"301"
127.0.0.1:6379> zscore zset:1 lyh300
"301"
127.0.0.1:6379> zadd zset:1 ch 300 lyh300
(integer) 1
127.0.0.1:6379> zscore zset:1 lyh300
"300"

計算成員個數

zcard key

127.0.0.1:6379> zscore zset:1 lyh300
"300"
127.0.0.1:6379> zcard zset:1
(integer) 7

計算某個成員的分數

zscore key member

127.0.0.1:6379> zscore zset:1 lyh300
"300"

計算成員的排名(排名從0開始計算)

zrank key member

zrevrank key member

zrank 是分數從低到高排名,zrevrank反之。

127.0.0.1:6379> zrank zset:1 lyh300
(integer) 6
127.0.0.1:6379> zrevrank zset:1 lyh300
(integer) 0

刪除成員

zrem key member [member ...]

返回結果為成功刪除的個數

127.0.0.1:6379> zrem zset:1 lyh300
(integer) 1
127.0.0.1:6379> zrem zset:1 lyh300
(integer) 0

增加成員的分數

zincrby key increment member

127.0.0.1:6379> zincrby zset:1 88 lyh
"188"

返回指定排名範圍的成員

zrange key start end [withscores]

zrevrange key start end [withscores]

排名按照分值高低進行,zrange是從低到高返回,zrevrange反之。加上withscores選項,會同時返回成員的分數。

127.0.0.1:6379> zrange zset:1 0 100
1) "art"
2) "math"
3) "english"
4) "lyh100"
5) "lyh"
6) "lyh200"
127.0.0.1:6379> zrange zset:1 0 100 withscores
1) "art"
2) "98"
3) "math"
4) "99"
5) "english"
6) "100"
7) "lyh100"
8) "100"
9) "lyh"
10) "188"
11) "lyh200"
12) "200"
127.0.0.1:6379> zrevrange zset:1 0 100 withscores
1) "lyh200"
2) "200"
3) "lyh"
4) "188"
5) "lyh100"
6) "100"
7) "english"
8) "100"
9) "math"
10) "99"
11) "art"
12) "98"

  

  返回指定分數範圍的成員

  zrangebyscore key min max [withscores] [limit offset count]

  zrevrangebyscore key min max [withscores] [limit offset count]

  zrangebyscore 按照分數從低到高返回,zrevrangebyscore反之。withscores選項會同時返回每個成員的個數。[limit offset count]選項可以限制輸出的起始位置和個數。

127.0.0.1:6379> zrangebyscore zset:1 0 100 withscores
1) "art"
2) "98"
3) "math"
4) "99"
5) "english"
6) "100"
7) "lyh100"
8) "100"
127.0.0.1:6379> zrangebyscore zset:1 0 100 withscores limit 1 1
1) "math"
2) "99"
127.0.0.1:6379> zrangebyscore zset:1 0 100 withscores limit 0 1
1) "art"
2) "98"
127.0.0.1:6379> zrangebyscore zset:1 0 100 withscores limit 0 2
1) "art"
2) "98"
3) "math"
4) "99"

min和max還支持開區間(小括號)和閉區間(中括號),-inf 和 +inf分別代表無限小和無限大。

127.0.0.1:6379> zrangebyscore zset:1 (88 +inf withscores
1) "art"
2) "98"
3) "math"
4) "99"
5) "english"
6) "100"
7) "lyh100"
8) "100"
9) "lyh"
10) "188"
11) "lyh200"
12) "200"
127.0.0.1:6379> zrangebyscore zset:1 [88 +inf withscores
(error) ERR min or max is not a float

返回指定分數範圍成員個數

zcount key min max

127.0.0.1:6379> zcount zset:1 100 200
(integer) 4

刪除指定排名內的升序元素

zremrangebyrank key start end

127.0.0.1:6379> zrangebyscore zset:1 -inf +inf
1) "art"
2) "math"
3) "english"
4) "lyh100"
5) "lyh"
6) "lyh200"
127.0.0.1:6379> zremrangebyrank zset:1 0 1
(integer) 2
127.0.0.1:6379> zrangebyscore zset:1 -inf +inf
1) "english"
2) "lyh100"
3) "lyh"
4) "lyh200"

刪除指定分數範圍的成員

zremrangebyscores key min max

127.0.0.1:6379> zrangebyscore zset:1 -inf +inf withscores
1) "english"
2) "100"
3) "lyh100"
4) "100"
5) "lyh"
6) "188"
7) "lyh200"
8) "200"
127.0.0.1:6379> zremrangebyscore zset:1 100 199
(integer) 3
127.0.0.1:6379> zrangebyscore zset:1 -inf +inf withscores
1) "lyh200"
2) "200"

集合間的操作

首先準備兩個有序集合

127.0.0.1:6379> zadd zset:subject:1 8 english 12 chinese 11 c 20 python 30 redis
(integer) 5
127.0.0.1:6379> zadd zset:subject:2 88 english 120 chinese 119 c 200 python 300 redis
(integer) 5

127.0.0.1:6379> zrangebyscore zset:subject:1 -inf +inf withscores
1) "english"
2) "8"
3) "c"
4) "11"
5) "chinese"
6) "12"
7) "python"
8) "20"
9) "redis"
10) "30"
127.0.0.1:6379> zrangebyscore zset:subject:2 -inf +inf withscores
1) "english"
2) "88"
3) "c"
4) "119"
5) "chinese"
6) "120"
7) "python"
8) "200"
9) "redis"
10) "300"

  交集

  zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

  destination: 交集計算結果保存到這個鍵

  numkes: 需要做交集計算鍵的個數

  key [key ...] : 需要做交集計算的鍵

  weights weight [weight ...] : 每個鍵的權重,在做交集運算的時候,每個鍵中的每個member會將自己分數乘以這個權重,每個鍵的權重默認是1。

  aggergate sum|min|max : 計算成員交集後,分值可以按照sum(和),min(最小值),max(最大值)做匯總,默認值是sum。

  

127.0.0.1:6379> ZINTERSTORE result:1 2 zset:subject:1 zset:subject:2
(integer) 5
127.0.0.1:6379> zrange result:1 0 -1 withscores
1) "english"
2) "96"
3) "c"
4) "130"
5) "chinese"
6) "132"
7) "python"
8) "220"
9) "redis"
10) "330"

將第二個有序集合權重變為2,並且聚合效果采用max

127.0.0.1:6379> ZINTERSTORE result:2 2 zset:subject:1 zset:subject:2 weights 1 2 aggregate max
(integer) 5
127.0.0.1:6379> zrange result:2 0 -1 withscores
1) "english"
2) "176"
3) "c"
4) "238"
5) "chinese"
6) "240"
7) "python"
8) "400"
9) "redis"
10) "600"

並集

zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

該命令參數和交集效果是一樣的。


鍵管理

單個鍵管理

  鍵重命名

  rename key newkey

  註意:如果newkey已存在,newkey原來的值會被覆蓋

127.0.0.1:6379> exists rename:test
(integer) 0
127.0.0.1:6379> set rename:test test
OK
127.0.0.1:6379> get rename:test
"test"
127.0.0.1:6379> rename rename:test rename:ok
OK
127.0.0.1:6379> get rename:test
(nil)
127.0.0.1:6379> get rename:ok
"test"

newkey不存在時,允許重命名鍵

renamenx key newkey

返回結果為0時代表沒有完成重命名。

127.0.0.1:6379> set rename:ok ok
OK
127.0.0.1:6379> set rename:notok notok
OK
127.0.0.1:6379> renamenx rename:notok rename:ok
(integer) 0

特別註意:如果重命名涉及到的鍵值比較大,而rename機制會執行del命令刪除舊鍵,導致阻塞Redis

隨機返回一個鍵

randomkey

127.0.0.1:6379> randomkey
"result:2"
127.0.0.1:6379> randomkey
"not:exists"
127.0.0.1:6379> randomkey
"fuck2"

鍵過期

設置鍵過期

expire key seconds #鍵在seconds秒後過期刪除

expireat key timestamp #鍵在秒級時間戳後過期 如 >expireat hello 1469980800

pexpire key millseconds #Redis 2.6之後,鍵在millseconds毫秒後過期

pexpireat key millseconds-timestamp #Redis之後,鍵在毫秒級時間戳timestamp後過期

有兩點需要註意:

1 如果expire key的鍵不存在,返回結果為0

2 如果過期時間為負值,鍵會立即被刪除,效果如同del命令一樣

查看鍵過期剩余時間
ttl #精度為秒

pttl #精度為毫秒

ttl和pttl都可以查看鍵過期時間,返回值有以下三種情況

1 返回大於等於0的整數,表示鍵剩余的過期時間(ttl是秒,pttl是毫秒)

2 返回-1,表示鍵沒有設置過期時間

3 返回-2,表示鍵不存在

清除鍵過期時間

persist key

另外,對於字符串類型鍵,執行set命令會去掉過期時間。

127.0.0.1:6379> setex mykey 60 ok
OK
127.0.0.1:6379> get mykey
"ok"
127.0.0.1:6379> ttl mykey
(integer) 50
127.0.0.1:6379> ttl mykey
(integer) 48
127.0.0.1:6379> set mykey notok
OK
127.0.0.1:6379> ttl mykey
(integer) -1

Redis不支持二級數據結構(哈希,列表等)內部元素的過期功能,例如不能對列表類型的一個元素做過期時間設置。

技巧,setex 可作為set + expire組合的替代,能以原子執行,並且減少一次網絡通信的事件。

SETEX key seconds value
summary: Set the value and expiration of a key
since: 2.0.0
group: string

遷移鍵

遷移鍵功能實現將部分數據從一個Redis遷移到另一個Redis,Redis提供了move,dump+restore,migrate三組遷移鍵的方法。

1 move key db

Redis內部允許有多個數據庫,彼此在數據上是相互隔離的,move key db就是把指定的鍵從源數據庫移動到目標數據庫中。僅支持同一個Redis實例內不同數據庫的鍵進行遷移

2 dump+restore

該方式分為兩步:

dump key # 源Redis 上,dump命令會將鍵值序列化,格式采用的是RDB格式

restore key ttl value #在目標Redis上,restore命令會將上面序列化的值進行復原,其中ttl參數代表過期時間,如果ttl=0代表沒有過期時間

127.0.0.1:6379> get mykey
"notok"
127.0.0.1:6379> dump mykey
"\x00\x05notok\x06\x00\"\xc5dC\xc7m\xb5`"
127.0.0.1:6379> select 1 # 切換到Redis數據庫1
OK
127.0.0.1:6379[1]> restore key 0 "\x00\x05notok\x06\x00\"\xc5dC\xc7m\xb5`"
OK
127.0.0.1:6379[1]> get key
"notok"

3 migrate

migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]

host: 目標Redis的IP地址

port: 目標Redis的端口

key|"":在Redis 3.0.6版本之前,migrate只允許遷移一個鍵,key就代表了要遷移的鍵。在Redis3.0.6版本之後,允許遷移多個鍵,這裏就為空字符串""

destination-db:目標Redis的數據庫索引,例如要遷移到0號數據庫,這裏就寫0

timeout:遷移的超時時間

[copy]:表示遷移後並不刪除源鍵

[replace]:如果添加此選項,migrate不管目標Redis是否存在該鍵都會正常遷移進行數據覆蓋

[keys key [key ...] ]:遷移多個鍵,例如要遷移key1,key2,key3,此處應填寫為"keys key1 key2 key3"

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> migrate 127.0.0.1 8000 "" 00 5000 keys k1 k2 k3
OK
127.0.0.1:6379>

$ redis-cli -p 8000
127.0.0.1:8000> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:8000>

註意,migrate是原子操作的,不需要在多個Redis實例上開啟客戶端,只需要在源Redis上執行migrate命令即可。

遍歷鍵

  Redis提供了兩個命令遍歷所有的鍵,分別是keys和scan

  全量遍歷鍵

  keys patterns

  keys支持pattern匹配

127.0.0.1:8000> keys k*
1) "k1"
2) "k2"
3) "k3"

pattern使用glob風格的通配符:

* 代表匹配任意字符

? 代表匹配一個字符

[] 代表匹配部分字符,例如[1,3]代表匹配1,3,

\x 用來轉義,如轉義星號\* ,轉義問號\?

註意,key命令容易造成Redis阻塞,尤其在Redis包含了大量的鍵時。

漸進式遍歷

scan cursor [match pattern] [count number]

cursor:cursor是一個遊標,第一次遍歷從0開始,每次scan遍歷完都會返回當前遊標的值,直到遊標的值為0,表示遍歷結束。

match pattern 是可選參數,作模式匹配,使用glob風格的通配符。

count number是可選參數,表明每次要遍歷的鍵的個數,默認值是10,此參數可以適當增大。

127.0.0.1:8000> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:8000> mset n1 v1 n2 v2 n3 v3
OK
127.0.0.1:8000> keys *
1) "n3"
2) "k1"
3) "n2"
4) "k3"
5) "n1"
6) "k2"
127.0.0.1:8000> scan 0
1) "0"
2) 1) "n2"
2) "k2"
3) "n3"
4) "k1"
5) "n1"
6) "k3"
127.0.0.1:8000> scan 0 match n*
1) "0"
2) 1) "n2"
2) "n3"
3) "n1"
127.0.0.1:8000> scan 0 match n* count 1
1) "6"
2) 1) "n2"

註意:

1 除了scan以外,Redis還提供了面向哈希類型,集合類型,有序集合的掃描遍歷命令,分別是hscan,sscan,zscan,他們的用法和scan基本類似。

2 scan並不能保證能夠完整的遍歷出來所有的鍵,因為scan過程中,Redis的鍵會發生增加或者刪除。

數據庫管理

  Redis提供了dbsize,select,flushdb/flushall等命令用來操作數據庫。

  dbsize

  返回當前數據庫鍵的總數

  select dbIndex

  dbIndex :表示同一個Redis實例中不同的數據庫,默認有16個

  

  flushdb/flushall

  以上兩個命令都是用來清除數據庫,flushdb只清除當前數據庫,flushall會清除所有數據庫。

Redis 常用數據結構及其控制命令整合