Redis相关key操作的常用的命令 第二章

园码生活

共 6857字,需浏览 14分钟

 · 2022-01-17

Redis相关key操作的常用的命令 第二章

KEYS pattern

Redis KEYS 命令用于查找所有匹配给定模式 pattern 的 key 。

尽管这个操作的时间复杂度是 O(N),但是常量时间相当小。

例如,在一个普通笔记本上跑 Redis,扫描 100 万个 key 只要40毫秒。

Warning: 生产环境使用 KEYS 命令需要非常小心。在大的数据库上执行命令会影响性能。

这个命令适合用来调试和特殊操作,像改变键空间布局。

不要在你的代码中使用 KEYS 。如果你需要一个寻找键空间中的key子集,考虑使用 SCAN 或 sets。

匹配模式:

h?llo 匹配 hello, hallo 和 hxllo h*llo 匹配 hllo 和 heeeello h[ae]llo 匹配 hello and hallo, 不匹配 hillo h[^e]llo 匹配 hallo, hbllo, ... 不匹配 hello h[a-b]llo 匹配 hallo 和 hbllo 使用 \ 转义你想匹配的特殊字符。

语法 redis KEYS 命令基本语法如下:

redis 127.0.0.1:6379> KEYS PATTERN 返回值 数组: 以数组的形式返回匹配模式 pattern 的 key 的列表。

*例子

# 创建一些 key 并赋值
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
# 查找含有 name 的 key
redis> KEYS *name*
1"lastname"
2"firstname"
# 查找以 a 为开头长度为 3 的 key
redis> KEYS a??
1"age"
# redis 获取所有的 key 使用 *。
redis> KEYS *
1"age"
2"lastname"
3"firstname"
redis> 

MIGRATE host port key|"" destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key [key ...]]

将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 会出现在目标实例上,而当前实例上的 key 会被删除。

MIGRATE 命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。

Redis 3.2 以上版本支持一个命令迁移多个 key,通过使用空的双引号 ”” 替换 key,并在命令结尾增加 KEYS 命令,匹配要迁移的多个key

命令的内部实现是这样的:它在当前实例对给定 key 执行 DUMP 命令 ,将它序列化,然后传送到目标实例,目标实例再使用 RESTORE 对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到 RESTORE 命令返回 OK ,它就会调用 DEL 删除自己数据库上的 key 。

timeout 参数以毫秒为格式,指定当前实例和目标实例进行传输的最大间隔时间。这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 。

MIGRATE 命令需要在给定的时间规定内完成 IO 操作。如果在传送数据时发生 IO 错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误:IOERR 。当 IOERR 出现时,有以下两种可能的结果

可能存在于两个实例。可能只存在于源实例。超时不会导致 key 丢失。但是如果一个客户端执行 MIGRATE 命令,并且不幸遇上超时,需要检查 key 是否出现在目的实例上。

如果有其它错误发生,那么 MIGRATE 保证 key 只会出现在当前实例中。(当然,目标实例的给定数据库上可能有和 key 同名的键,不过这和 MIGRATE 命令没有关系)。

如果源实例中没有要迁移的key,返回NOKEY 。比如键过期的情况,NOKEY并不是一个错误。

一次迁移多个 key Redis 3.0.6 起MIGRATE 支持批量迁移。需要使用 KEYS 选项,使用空字符串替换 key,要迁移的 key 列在 KEYS 命令之后:

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

当所有 key 都不存在时返回 NOKEY ,即使只有一个key存在也执行成功。

Options COPY -- 复制,不删除源实例中的 key。REPLACE -- 替换,替换目标实例中的存在的 key。KEYS -- 如果 key 参数是一个空字符串,会迁移 KEYS 命令后所有的 key 。AUTH -- 使用密码访问目标数据库。AUTH2 -- 使用用户名和密码对访问数据库。(Redis 6 以上 ACL auth )。历史

= 3.0.0: 增加 COPY 和REPLACE 选项。= 3.0.6: 增加 KEYS 选项。= 4.0.7: 增加 AUTH 选项。= 6.0.0: 增加 AUTH2 选项。返回值 字符串: 迁移成功时返回 OK ,如果在源实例中找不到 key 返回 NOKEY 。

MOVE key db

Redis MOVE 命令用于将当前数据库的 key 移动到选定的数据库 db 当中。

如果 key 在目标数据库中已存在,或者 key 在源数据库中不存,则key 不会被移动。

语法 redis Move 命令基本语法如下:

redis 127.0.0.1:6379> MOVE KEY_NAME DESTINATION_DATABASE

返回值 整数, : 1 如果 key 被移动。0 如果 key 没有被移动。

key 存在于当前数据库

redis默认使用数据库 0,为了清晰起见,这里再显式指定一次。

redis> SELECT 0                             
OK

redis> SET song "secret base - Zone"
OK

# 将 song 移动到数据库 1
redis> MOVE song 1                         
(integer) 1

# song 已经被移走
redis> EXISTS song                          
(integer) 0

# 使用数据库 1
redis> SELECT 1                            
OK

# 证实 song 被移到了数据库 1 
(注意命令提示符变成了"redis:1",表明正在使用数据库 1)
redis:1> EXISTS song                        
(integer) 1


# 当 key 不存在的时候

redis:1> EXISTS fake_key
(integer) 0

# 试图从数据库 1 移动一个不存在的 key 到数据库 0,失败
redis:1> MOVE fake_key 0                    
(integer) 0

# 使用数据库0
redis:1> select 0                          
OK

# 证实 fake_key 不存在
redis> EXISTS fake_key                     
(integer) 0


# 当源数据库和目标数据库有相同的 key 时

# 使用数据库0
redis> SELECT 0                             
OK
redis> SET favorite_fruit "banana"
OK

# 使用数据库1
redis> SELECT 1                             
OK
redis:1> SET favorite_fruit "apple"
OK

# 使用数据库0,并试图将 favorite_fruit 移动到数据库 1
redis:1> SELECT 0                          
OK

# 因为两个数据库有相同的 key,MOVE 失败
redis> MOVE favorite_fruit 1               
(integer) 0

# 数据库 0 的 favorite_fruit 没变
redis> GET favorite_fruit                   
"banana"

redis> SELECT 1
OK

# 数据库 1 的 favorite_fruit 也是
redis:1> GET favorite_fruit                 
"apple"

OBJECT subcommand [arguments [arguments ...]]

OBJECT 命令允许从内部察看给定 key 的 Redis 对象, 它通常用在除错(debugging)或者了解为了节省空间而对 key 使用特殊编码的情况。当将Redis用作缓存程序时,你也可以通过 OBJECT 命令中的信息,决定 key 的驱逐策略(eviction policies)。

OBJECT 命令有多个子命令:

OBJECT REFCOUNT返回给定 key 引用所储存的值的次数。此命令主要用于除错。OBJECT ENCODING返回给定 key 锁储存的值所使用的内部表示(representation)。OBJECT IDLETIME返回给定 key 自储存以来的空闲时间(idle, 没有被读取也没有被写入),以秒为单位。对象可以以多种方式编码:

字符串可以被编码为 raw (一般字符串)或 int (为了节约内存,Redis 会将字符串表示的 64 位有符号整数编码为整数来进行储存)。列表可以被编码为 ziplist 或 linkedlist 。ziplist 是为节约大小较小的列表空间而作的特殊表示。集合可以被编码为 intset 或者 hashtable 。intset 是只储存数字的小集合的特殊表示。哈希表可以编码为 zipmap 或者 hashtable 。zipmap 是小哈希表的特殊表示。有序集合可以被编码为 ziplist 或者 skiplist 格式。ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。假如你做了什么让 Redis 没办法再使用节省空间的编码时(比如将一个只有 1 个元素的集合扩展为一个有 100 万个元素的集合),特殊编码类型(specially encoded types)会自动转换成通用类型(general type)。

语法 redis OBJECT 命令基本语法如下:

redis 127.0.0.1:6379> OBJECT subcommand [arguments [arguments]] 
返回值
REFCOUNT 和 IDLETIME 返回数字。ENCODING 返回相应的编码类型。

Subcommands refcount and idletime return integers.
Subcommand encoding returns a bulk reply.
例子
redis> lpush mylist "Hello World"
(integer) 4
redis> object refcount mylist
(integer) 1
redis> object encoding mylist
"ziplist"
redis> object idletime mylist
(integer) 10
In the following example you can see how the encoding changes once Redis is no longer able to use the space saving encoding.

redis> set foo 1000
OK
redis> object encoding foo
"int"
redis> append foo bar
(integer) 7
redis> get foo
"1000bar"
redis> object encoding foo
"raw"

PERSIST key

Redis PERSIST 命令用于删除给定 key 的过期时间,使得 key 永不过期。

Redis PERSIST 命令用于删除给定 key 的过期时间,使得 key 永不过期。

语法 redis PERSIST 命令基本语法如下:

redis 127.0.0.1:6379> PERSIST KEY_NAME
返回值
整数, specifically:

1 当过期时间移除成功时
0 如果 key 不存在或 key 没有设置过期时间
例子
redis> SET mykey "Hello"
"OK"
# 为 key 设置生存时间
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
# 移除 key 的生存时间
redis> PERSIST mykey
(integer) 1
redis> TTL mykey
(integer) -1
redis> 

PEXPIRE key milliseconds

PEXPIRE 跟 EXPIRE 基本一样,只是过期时间单位是毫秒。

语法 redis PEXPIRE 命令基本语法如下:

PEXPIRE key milliseconds

返回值 整数, specifically:

1 过期设置成功。0 key 不存在或设置失败。例子

redis> SET mykey "Hello"
"OK"
redis> PEXPIRE mykey 1500
(integer) 1
redis> TTL mykey
(integer) 1
redis> PTTL mykey
(integer) 1498
redis> 

PEXPIREAT key milliseconds-timestamp

Redis PEXPIREAT 命令用于设置 key 的过期时间,时间的格式是uinx时间戳并精确到毫秒。

Redis PEXPIREAT 命令用于设置 key 的过期时间,时间的格式是uinx时间戳并精确到毫秒。

语法 redis PEXPIREAT 命令基本语法如下:

redis 127.0.0.1:6379> PEXPIREAT KEY_NAME TIME_IN_MILLISECONDS_IN_UNIX_TIMESTAMP

返回值 整数:

1 设置成功返回 0 如果 key 不存在

例子

# 创建一个 key 并赋值
redis> SET rediscomcn "Hello"
"OK"
# 为 key 设置过期时间
redis> PEXPIREAT rediscomcn 1555555555005
(integer) 1
redis> TTL rediscomcn
(integer) -2
redis> PTTL rediscomcn
(integer) -2
redis> 

PTTL key

Redis PTTL 命令以毫秒为单位返回 key 的剩余过期时间。

语法 redis PTTL 命令基本语法如下:

redis 127.0.0.1:6379> PTTL KEY_NAME

Redis 2.6 之前的版本如果 key 不存在或者 key 没有关联超时时间则返回 -1 。

Redis 2.8 起:

key 不存在返回 -2 key 存在但是没有关联超时时间返回 -1 返回值 整数: 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以毫秒为单位,返回 key 的剩余生存时间。

例子

redis> SET mykey "Hello"
"OK"
# key 存在,但没有设置剩余生存时间
redis> PTTL mykey
(integer) -1
redis> EXPIRE mykey 1
(integer) 1
# 有剩余生存时间的 key
redis> PTTL mykey
(integer) 1000
redis>   


浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报