【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键中。

相关推荐
羊小猪~~2 小时前
MYSQL学习笔记(二):基本的SELECT语句使用(基本、条件、聚合函数查询)
数据库·笔记·sql·学习·mysql·考研·数据分析
然然阿然然2 小时前
2025.1.15——二、字符型注入
网络·数据库·sql·学习·网络安全
!!!5253 小时前
MyBatis-增删改查操作&一些细节
java·数据库·spring boot·mybatis
然然阿然然3 小时前
2025.1.15——六、SQL结构【❤sqlmap❤】
数据库·sql·学习·安全·web安全·网络安全
霍格沃兹测试开发学社测试人社区3 小时前
三大智能体平台对比分析:FastGPT、Dify、Coze 哪个更适合你?
大数据·软件测试·数据库·人工智能·测试开发
专注VB编程开发20年4 小时前
.NET Core封装Activex Dll,向COM公开.NET Core组件
数据库·ui·.netcore·dll·com·activex
少年攻城狮4 小时前
Oracle系列---【Oracle中密码的策略如何设置】
数据库·oracle
小蒜学长4 小时前
疾病防控综合系统设计与实现(代码+数据库+LW)
前端·数据库·vue.js·spring boot·后端·oracle
少年的云和月(^~^)4 小时前
MySQL存储过程
数据库·mysql
TiDB_PingCAP4 小时前
唐刘:TiDB 的 2024 - Cloud、SaaS 与 AI
数据库·人工智能·ai·tidb·saas