【redis】键的全局命令

Redis提供了一系列用于管理和操作键的全局命令。这些命令允许你查看、删除、迁移键,以及执行其他与键相关的操作。

有关全局通用类型的命令可以通过help @generic命令来查看。有关命令的使用可以通过help 命令来查看,例如help keys

KEYS

keys:查找所有符合给定模式的键。

语法:

shell 复制代码
KEYS pattern

使用:KEYS *查找所有键。

shell 复制代码
127.0.0.1:6379> keys *
1) "a6"
2) "a3"
3) "a2"
4) "a5"
5) "a4"
6) "a1"

127.0.0.1:6379> keys *6
1) "a6"

注意:在生产环境中应谨慎使用KEYS命令,因为它会扫描整个数据库,可能导致性能问题,推荐使用下面的SCAN命令。

SCAN

与KEYS命令不同,SCAN命令不会一次性返回数据库中的所有键,而是返回一个游标和一批键的列表,允许客户端分批处理键,这对于大型数据库非常有用,因为它可以防止服务器因一次性返回过多数据而过载。

SCAN命令的基本语法如下:

shell 复制代码
SCAN cursor [MATCH pattern] [COUNT count]

命令选项说明:

  • cursor:游标是一个基于64位整数的字符串(在Redis的实现中通常是一个字符串形式的整数),用于指示迭代过程中的当前位置。第一次调用SCAN时,游标应该是"0"。每次SCAN命令返回后,都会提供一个新的游标值,应该在下一次调用时使用。当游标返回为"0"时,表示迭代完成。

  • MATCH pattern:可选参数,用于指定一个模式,只有匹配该模式的键才会被返回。模式匹配遵循glob风格,其中*表示任意数量的字符,?表示单个字符,[]用于指定字符集。

  • COUNT count:可选参数,提示Redis希望每次迭代返回的键的数量。然而,这是一个提示,而不是一个严格的命令,因为 Redis可能会返回比请求的更少或更多的键,具体取决于内部实现和数据集的大小。

SCAN命令返回一个包含两个元素的数组:

  • 一个字符串表示的游标,用于下一次迭代。
  • 一个数组,包含本次迭代返回的键。

以下是一个使用SCAN命令的示例:

shell 复制代码
127.0.0.1:6379> scan 0 match a* count 3
1) "6"
2) 1) "a6"
   2) "a4"
   3) "a2"
   4) "a5"

127.0.0.1:6379> scan 6 match a* count 3
1) "0"
2) 1) "a3"
   2) "a1"

这个命令请求从游标"0"开始迭代,返回所有以"a"开头的键,每次迭代最多返回3个键。Redis将返回一个游标和一个键的列表,客户端应该使用返回的游标进行下一次迭代,直到游标返回为"0"。

注意:由于SCAN命令是基于游标的迭代命令,因此它不能保证在迭代过程中键集合的不变性。如果在迭代过程中有键被添加或删除,这些变化可能会反映在迭代结果中。因此,SCAN命令通常用于非阻塞的、近实时的键集合遍历场景。

EXISTS

exists:检查一个键是否存在。如果存在,返回1;否则,返回0。

语法:

shell 复制代码
EXISTS key [key ...]

使用:

shell 复制代码
127.0.0.1:6379> exists a1
(integer) 1

127.0.0.1:6379> exists b1
(integer) 0

DEL

del:删除一个或多个键。返回被删除的键的数量。

语法:

shell 复制代码
DEL key [key ...]

使用:

shell 复制代码
127.0.0.1:6379> del a5 a6
(integer) 2

TYPE

type:返回键所存储的值的类型。

语法:

shell 复制代码
TYPE key

使用:

shell 复制代码
127.0.0.1:6379> type a1
string

RENAME

rename:将键重命名为新的键名。如果新键名已存在,则覆盖旧值。

语法:

shell 复制代码
RENAME key newkey

使用:

shell 复制代码
127.0.0.1:6379> rename a1 c1
OK

RENAMENX

renamenx:仅在新键名不存在时,将键重命名为新的键名。如果操作成功,返回1;如果新键名已存在,返回0。

语法:

shell 复制代码
RENAMENX key newkey

使用:

shell 复制代码
127.0.0.1:6379> renamenx c1 a2
(integer) 0

127.0.0.1:6379> renamenx c1 a1
(integer) 1

EXPIRE

expire:为键设置一个过期时间(以秒为单位)。当过期时间到达时,键会被自动删除。

语法:

shell 复制代码
EXPIRE key seconds

使用:

shell 复制代码
127.0.0.1:6379> expire a1 60
(integer) 1

PEXPIRE

pexpire:为键设置一个过期时间(以毫秒为单位)。

语法:

shell 复制代码
PEXPIRE key milliseconds

使用:

shell 复制代码
127.0.0.1:6379> pexpire a1 6000
(integer) 1

EXPIREAT

expireat:指定键在何时过期(以秒级UNIX时间戳表示)。

语法:

shell 复制代码
EXPIREAT key timestamp

使用:

shell 复制代码
127.0.0.1:6379> expireat a1 1736500968
(integer) 1

PEXPIREAT

pexpireat:指定键在何时过期(以毫秒级UNIX时间戳表示)。

语法:

shell 复制代码
PEXPIREAT key milliseconds-timestamp

使用:

shell 复制代码
127.0.0.1:6379> pexpireat a1 1736501168000
(integer) 1

TTL

ttl:获取键的剩余生存时间(以秒为单位)。如果键不存在或没有设置过期时间,返回-2或-1。

语法:

shell 复制代码
TTL key

使用:

shell 复制代码
127.0.0.1:6379> ttl a1
(integer) 152

127.0.0.1:6379> ttl a2
(integer) -1

127.0.0.1:6379> ttl x1
(integer) -2

PTTL

pttl:获取键的剩余生存时间(以毫秒为单位)。

语法:

shell 复制代码
PTTL key

使用:

shell 复制代码
127.0.0.1:6379> pttl a1
(integer) 109988

127.0.0.1:6379> pttl a2
(integer) -1

127.0.0.1:6379> pttl x1
(integer) -2

PERSIST

persist:移除键的过期时间,使其变为永久存储。

语法:

shell 复制代码
PERSIST key

使用:

shell 复制代码
127.0.0.1:6379> persist a1
(integer) 1

127.0.0.1:6379> ttl a1
(integer) -1

MOVE

move:将键移动到另一个数据库。如果操作成功,返回1;如果键不存在或移动失败(如目标数据库key已存在),返回0。Redis默认支持16个逻辑数据库(编号从0到15),你可以通过SELECT命令来选择当前操作的数据库。

语法:

shell 复制代码
MOVE key db

使用:

shell 复制代码
127.0.0.1:6379> move a1 15
(integer) 1

127.0.0.1:6379> select 15
OK

127.0.0.1:6379[15]> get a1
"aa"

DUMP

dump:返回一个序列化后的值,该值包含键的类型和值本身。可以使用RESTORE命令来恢复该值。

语法:

shell 复制代码
DUMP key

使用:

shell 复制代码
127.0.0.1:6379> dump a1
"\x00\x020a\t\x00\xcb\x0e\xdaX\xef\x82$\b"

RESTORE

restore:使用DUMP命令返回的序列化值来恢复键。ttl参数指定键的过期时间(以毫秒为单位),如果TTL为0,则键没有过期时间。

语法:

shell 复制代码
RESTORE key ttl serialized-value

使用:

shell 复制代码
127.0.0.1:6379> restore z1 0 "\x00\x020a\t\x00\xcb\x0e\xdaX\xef\x82$\b"
OK

COPY

copy:复制一个key。

语法:

shell 复制代码
COPY source destination [DB destination-db] [REPLACE]

使用:

shell 复制代码
127.0.0.1:6379> set k1 v1
OK

127.0.0.1:6379> copy k1 k2 db 1
(integer) 1

127.0.0.1:6379> copy k1 k2 db 1
(integer) 0

127.0.0.1:6379> copy k1 k2 db 1 replace
(integer) 1

OBJECT

object:允许用户从内部查看给定key的Redis对象的信息。这个命令通常用于调试、了解为了节省空间而对key使用特殊编码的情况,或者在将Redis用作缓存程序时,通过OBJECT命令中的信息来决定key的驱逐策略(eviction policies)。

语法:

shell 复制代码
OBJECT subcommand [arguments [arguments ...]]

OBJECT命令的子命令:

  1. OBJECT REFCOUNT
  • 功能:返回给定key引用所储存的值的次数。这个命令主要用于调试。
  • 返回值:整数,表示引用计数。
  1. OBJECT ENCODING
  • 功能:返回给定key所储存的值所使用的内部表示(即编码方式)。
  • 返回值:字符串,表示编码类型。例如,字符串可以被编码为raw(常规字符串)或int(用字符串表示64位整数以节约空间);列表可以被编码为ziplist(为节约空间而设计的特殊表示)或linkedlist等。
  1. OBJECT IDLETIME
  • 功能:返回给定key自储存以来的空闲时间(即没有被读取也没有被写入的时间),以秒为单位。这个命令对于了解key的活跃程度很有帮助。
  • 返回值:整数,表示空闲时间(秒)。需要注意的是,虽然返回值以秒为单位,但这个计时器的实际精度可能是10秒级别(这取决于Redis的实现和配置)。
  • 注意:只有当maxmemory-policy被设置为LRU(Least Recently Used)或noeviction时,该子命令才可以使用。

使用:

shell 复制代码
127.0.0.1:6379> object encoding k1
"embstr"

RANDOMKEY

randomkey:随机返回一个key。

语法:

shell 复制代码
RANDOMKEY -

使用:

shell 复制代码
127.0.0.1:6379> randomkey
"k9"

TOUCH

touch:用于修改指定键的最后访问时间。这个命令不会改变键的值,但会更新键的LRU(Least Recently Used,最近最少使用)时间戳,这对于实现LRU缓存淘汰策略非常有用。

语法:

shell 复制代码
TOUCH key [key ...]

使用:

shell 复制代码
127.0.0.1:6379> touch k1
(integer) 1

127.0.0.1:6379> object idletime k1
(integer) 3

unlink:用于异步删除一个或多个键的命令。

语法:

shell 复制代码
UNLINK key [key ...]

特点与优势:

  • 异步删除:UNLINK命令的主要特点是它是非阻塞的,它会在后台异步地删除键值对,而不会阻塞服务器的正常操作。这使得UNLINK命令非常适合于删除大量键值对或者删除耗时较长的键值对,因为它可以在后台完成删除操作,而不会对其他操作产生影响。

  • 内存释放:虽然UNLINK命令会立即从Redis的字典中删除键,但实际的内存释放是在后台的一个线程中完成的。这样,UNLINK命令可以在不阻塞主线程的情况下,有效地释放内存资源。

  • 性能优化:对于大对象(例如大列表、大集合、大哈希等),UNLINK命令相比DEL命令具有更好的性能。因为UNLINK命令不会阻塞主线程,所以它可以更高效地处理大量数据的删除操作。

使用:

shell 复制代码
127.0.0.1:6379> unlink k1
(integer) 1

127.0.0.1:6379> exists k1
(integer) 0

WAIT

wait:是一个同步复制的命令,它用于阻塞当前客户端,直到所有先前的写入命令成功传输并被至少指定数量的从节点确认。

语法:

shell 复制代码
WAIT numreplicas timeout

使用:

shell 复制代码
127.0.0.1:6379> set k1 v1
OK

127.0.0.1:6379> wait 1 2000
(integer) 0
(2.03s)

MIGRATE

migrate:用于在Redis实例间进行数据迁移的命令。它将一个或多个键从一个Redis数据库实例迁移到另一个Redis数据库实例。MIGRATE命令实际上是将DUMP、RESTORE、DEL三个命令的组合,从而简化了操作流程。

语法:

shell 复制代码
MIGRATE host port key| destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key]

参数说明

  • host:目标Redis实例的IP地址。

  • port:目标Redis实例的端口号。

  • key|"":要迁移的键名。在Redis 3.0.6及以后的版本中,如果要迁移多个键,此处应为空字符串"",并使用KEYS参数指定要迁移的键列表。

  • destination-db:目标Redis实例的数据库索引。

  • timeout:迁移操作的超时时间,单位为毫秒。

  • COPY:如果添加此选项,迁移后不会删除源键。

  • REPLACE:如果添加此选项,MIGRATE命令会覆盖目标Redis实例中已存在的同名键。如果不提供此参数且目标Redis实例中存在同名键,则命令会抛出异常。

  • AUTH password:用于向目标Redis实例进行身份验证的密码。

  • AUTH2 username password:指定用于身份验证的用户名和密码(如果目标Redis实例使用了ACL进行访问控制)。

  • KEYS key ...:在Redis 3.0.6及以后的版本中,用于指定要迁移的多个键。

使用:

shell 复制代码
127.0.0.1:6379> migrate 127.0.0.1 6379 "" 1 2000 COPY KEYS k1

SORT

Redis的SORT命令是一个功能强大的工具,用于对列表(List)、集合(Set)或有序集合(Sorted Set)中的元素进行排序。

以下是对Redis SORT命令的详细解释:

基本语法

shell 复制代码
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
  • key:要排序的源键。
  • BY pattern:可选参数,指定一个模式来获取实际用来比较的值。如果使用了这个参数,Redis会根据这个模式找到对应的值来进行排序。
  • LIMIT offset count:可选参数,用于限制返回的结果数量,类似于SQL中的LIMIT子句。offset表示起始位置,count表示数量。
  • GET pattern:可选参数,允许基于排序后的元素去获取其他键中的值。可以指定多个GET参数。
  • ASC|DESC:可选参数,指定排序顺序。默认是升序(ASC),可以使用DESC来指定降序。
  • ALPHA:可选参数,当需要按字典顺序而不是数值顺序排序时使用。
  • STORE destination:可选参数,将排序后的结果存储在指定的键中,而不是直接返回给客户端。

使用示例

基本排序

假设有一个名为users的列表,其中包含用户ID:

shell 复制代码
127.0.0.1:6379> rpush users 3 5 2 8 7
(integer) 5

按默认方式排序:

shell 复制代码
127.0.0.1:6379> sort users
1) "2"
2) "3"
3) "5"
4) "7"
5) "8"

按降序排序

shell 复制代码
127.0.0.1:6379> sort users desc
1) "8"
2) "7"
3) "5"
4) "3"
5) "2"

按字典顺序排序

虽然数字默认按数值排序,但字符串默认按字典顺序排序。对于数字列表,若希望按字典顺序(即逐字符比较)排序,可使用ALPHA选项:

shell 复制代码
127.0.0.1:6379> sort users alpha
1) "2"
2) "3"
3) "5"
4) "7"
5) "8"

对于纯数字列表,结果与默认排序结果相同,但用于字符串时会有区别。

使用BY参数

假设有一个用户信息表:

uid name level

1 admin 9999

2 jack 10

3 peter 25

4 mary 70

假设有另一个哈希表user:details,其中每个用户ID对应一个年龄。

首先,设置哈希表:

shell 复制代码
127.0.0.1:6379> lpush uid 1 2 3 4
(integer) 4

127.0.0.1:6379> hmset user_info_1 name admin level 9999
OK

127.0.0.1:6379> hmset user_info_2 name jack level 10
OK

127.0.0.1:6379> hmset user_info_3 name peter level 25
OK

127.0.0.1:6379> hmset user_info_4 name mary level 70
OK

可以根据用户的level来排序用户ID:

shell 复制代码
127.0.0.1:6379> sort uid by user_info_*->level
1) "2"
2) "3"
3) "4"
4) "1"

user_level_*是一个占位符,它先取出uid中的值,然后再用这个值来查找相应的键。

比如在对uid列表进行排序时,程序就会先取出uid的值1、2、3、4,然后使用user_level_1、user_level_2、user_level_3和user_level_4的值作为排序uid的权重。

使用GET参数

如果我们想要返回用户的level而不是用户ID,可以使用GET参数:

shell 复制代码
127.0.0.1:6379> sort uid by user_info_*->level get user_info_*->level
1) "10"
2) "25"
3) "70"
4) "9999"

返回用户ID、name、level:

shell 复制代码
127.0.0.1:6379> sort uid by user_info_*->level get # get user_info_*->name get user_info_*->level
 1) "2"
 2) "jack"
 3) "10"
 4) "3"
 5) "peter"
 6) "25"
 7) "4"
 8) "mary"
 9) "70"
10) "1"
11) "admin"
12) "9999"

限制结果数量

shell 复制代码
127.0.0.1:6379> sort users limit 0 3
1) "2"
2) "3"
3) "5"

这里的LIMIT 0 3表示从索引0开始返回3个元素。

存储排序结果

shell 复制代码
127.0.0.1:6379> sort users store users_sorted
(integer) 5

127.0.0.1:6379> lrange users_sorted 0 -1
1) "2"
2) "3"
3) "5"
4) "7"
5) "8"

结果不会直接返回给客户端,但排序后的结果会存储在users_sorted键中。

相关推荐
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU5 小时前
三大范式和E-R图
数据库