Redis 4.x系列(六):Redis Key(键)管理

  Redis Keys 是二进制安全的,可以使用任何二进制序列作为键,例如”foo“字符串到 JPEG文件内容字符串也是有效键。

  Key 的定义应长度适当,易读易理解;超长字节的键会大大降低性能,若确实有大值存在,可以使用它的 HASH 值。

  Redis Keys 是字符串类型,允许最大是 512 MB。

二进制安全

Redis Keys 是二进制安全的,理解二进制安全概念。

  1. Binary-safe
    英:Binary-safe is a computer programming term mainly used in connection with string manipulating functions. A binary-safe function is essentially one that treats its input as a raw stream of data without any specific format. It should thus work with all 256 possible values that a character can take (assuming 8-bit characters).
    译:二进制安全是一种计算机编程术语,主要用于字符串操作功能。 二进制安全功能(函数)本质上是一种将其输入视为原始的、无任何特定格式的数据流。 其在操作上应包含一个字符所能有的256种可能的值(假设为8位字符)。
  2. Special characters
    英:Special characters:Most functions are not binary safe when using any special or markup characters, such as escape codes or those that expect null-terminated strings. A possible exception would be a function whose explicit purpose is to search for a certain character in a binary string.
    译:特殊字符,使用任何特殊字符或标记字符时,大多数函数都不是二进制安全的,例如转义码或期望以null结尾的字符串。 可能的例外是一个函数,其明确目的是在二进制字符串中搜索某个字符。
  3. Data format
    英:Binary safe functions are required when working with data of unknown format (otherwise the format would not be preserved) such as arbitrary files, encrypted data, and the like. The length of the data must be known by the function in order to operate on the entirety of the data.
    译:当处理未知格式的数据(否则将不保留格式)时,例如任意文件,加密数据等,二进制安全功能是必须的。函数必须知道数据的长度,以便对整个数据进行操作。
  4. 基于以上描述,个人理解的二进制安全指以以输入作为源始数据,对源始数据不做特定格式处理,不会对特殊字符进行转义或替换等操作,取出的数据与输入的数据完全一致(长度)。

Redis keys

  1. Redis 中的键管理相对简单,主要有以下命令:
    • dbsize:查看键的个数。
    • **keys * **:一次列出所有的键。
    • scan:使用游标列出指定个数的键,起始游标是 0,返回键列表和一个游标,返回的游标用于下次查询。
    • del:删除多个键。
    • unlink:删除键, Redis 4.0及以上版本引入,用于执行大 KEY 的异步删除。
    • exists:判断键是否存在。
    • type:获取键的数据类型。
    • rename:对键重命名。
  2. 当 Redis 中存在大量的键时,调用KEYS命令会导致 Redis 服务器阻塞一段时间直到所有键返回完,这会是一个危险的操作,官方是不建议在生产环境中使用此命令,仅在测试环境中使用,在后续版本中可能舍弃该命令。建议使用SCAN类命令,如SCANSSCAN,使用游标来遍历键而不会阻塞服务器。
  3. 使用DEL命令需特别注意,当删除的键是字符串以外的数据类型,而键中的元素数量很大时可能会遭遇服务器延迟。应该使用UNLINK代替,UNLINK会在另一个线程而不是主事件循环线程中执行删除操作(异步删除操作),而不会阻塞事件的处理,UNLINK只是从键空间中取消链接,实际删除操作在以后异步执行。
  4. RENAME对键重命名,当键中的元素量很大时,可能会像 DEL样导致高延迟(不确定内部的处理逻辑,此描述不确定正确,官方未找到更详细说明)。

dbsize

查看键的个数。

示例:

1
2
127.0.0.1:6379> dbsize
(integer) 19

keys

一次列出所有的键。

语法:keys pattern
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
127.0.0.1:6379> keys *
1) "ranking:film1"
2) "out2"
3) "ranking:film"
4) "fruit"
5) "offical"
6) "fruit_count"
7) "shop3"
8) "union_shop"
9) "zset1"
10) "counting:olive Garden"
11) "diff_shop"
12) "zset2"
13) "newshop"
14) "out0"
15) "totalfilm"
16) "people"
17) "out3"
18) "out5"
19) "out6"

127.0.0.1:6379> keys out*
1) "out2"
2) "out0"
3) "out3"
4) "out5"
5) "out6"

scan

使用游标列出指定个数的键,起始游标是 0,返回键列表和一个游标,返回的游标用于下次查询。

语法:scan cursor [MATCH pattern] [COUNT count]
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
127.0.0.1:6379> scan 0
1) "9"
2) 1) "ranking:film1"
2) "out2"
3) "offical"
4) "out3"
5) "out5"
6) "out6"
7) "totalfilm"
8) "people"
9) "ranking:film"
10) "counting:olive Garden"
127.0.0.1:6379> scan 9
1) "0"
2) 1) "diff_shop"
2) "zset2"
3) "fruit_count"
4) "shop3"
5) "union_shop"
6) "fruit"
7) "newshop"
8) "out0"
9) "zset1"
127.0.0.1:6379> scan 0 match out*
1) "9"
2) 1) "out2"
2) "out3"
3) "out5"
4) "out6"
127.0.0.1:6379> scan 9 match out*
1) "0"
2) 1) "out0"

del

删除指定的键,可以指定多个键,不存在的 key 会被忽略

语法:del key [key ...]
示例:

1
2
127.0.0.1:6379> del out0
(integer) 1

大 KEY 时异步删除键

语法:unlink key arg ...options...
示例:

1
2
127.0.0.1:6379> unlink out2
(integer) 1

exists

判断键是否存在

语法:exists key [key ...]
示例:

1
2
3
4
127.0.0.1:6379> exists fruit
(integer) 1
127.0.0.1:6379> exists fruit newshop
(integer) 2

type

获取键的数据类型

语法:type key
示例:

1
2
127.0.0.1:6379> type fruit
string

rename

对键重命名, 成功返回OK,如果重命名到的目标键已存在,则会被覆盖;为了孩子强制 rename, Redis 提供了 renamenx命令,确保只有在 newKey 不存在会才会重命名。
重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞的可能,这点需要注意。

语法:rename key newkey
示例:

1
2
127.0.0.1:6379> rename fruit new_fruit
OK

randomkey

从库中随机返回一个键的值。

Redis 4.x系列(六):Redis Key(键)管理

http://blog.gxitsky.com/2018/10/04/Redis-6-key-manage/

作者

光星

发布于

2018-10-04

更新于

2022-08-14

许可协议

评论