# Redis键(Key)

概念

Redis 的 键(Key) 是用于唯一标识存储在数据库中的数据的字符串。每个键对应一个 值(Value) ,而值可以是字符串、哈希、列表、集合等多种数据类型。键在Redis中扮演了数据访问的“入口”角色,通过键可以快速定位和操作对应的值。

在一个单独的Redis库中,键必须是唯一的。

# 作用

Redis 键是数据存储的核心标识符,承担以下核心作用:

  • 数据定位:通过唯一键名快速访问关联的字符串、哈希、列表等数据结构。
  • 生命周期管理:控制数据的过期时间,实现自动数据清理。
  • 数据归类:通过命名规范建立层级关系,提升可维护性。
  • 权限控制:基于键名实现细粒度的访问权限管理。

# 语法

通用命令格式:

COMMAND [KEY_NAME] [PARAM]
组成部分 说明 示例
COMMAND 操作指令(区分大小写) SETGETDEL, EXISTS
KEY_NAME 目标键名(最长512MB) name
PARAM 参数,附加操作条件或数据 EX 60NX

# 示例

# 1.创建与读取键

127.0.0.1:6379> SET name FEIXIANG
OK
127.0.0.1:6379> GET name
"FEIXIANG"

在上面的例子中,SET是创建命令,name是键,FEIXIANG是设置的值,创建成功会返回“OK”提示。之后用GET读取命令即可得到设置的值。

# 1.1 多次设置会覆盖原来的值

127.0.0.1:6379> SET name AOXIANG
OK
127.0.0.1:6379> GET name
"AOXIANG"
127.0.0.1:6379> SET name FEIXIANG
OK
127.0.0.1:6379> GET name
"FEIXIANG"

# 1.2 Redis的键是大小写敏感的

127.0.0.1:6379> SET NAME FEIXIANG.NET
OK
127.0.0.1:6379> GET name
"FEIXIANG"
127.0.0.1:6379> GET NAME
"FEIXIANG.NET"

可以看到,同一单词但大小写不同,Redis会当成不同的键处理,分别对应不同的值,并不会覆盖,且互不影响。在 Redis 中,正常设置的键默认没有过期时间。

# 1.3 创建一个带过期时间的键

127.0.0.1:6379> SET exname EXFEIXIANG EX 60		# 设置过期时间为60秒
OK
127.0.0.1:6379> GET exname		# 创建完成后直接获取
"EXFEIXIANG"
127.0.0.1:6379> GET exname		# 等待60秒后再获取
(nil)

EX 60参数表示过期时间,单位为秒。显然,如果要设置过期时间为1小时,则参数为EX 3600。在 Redis 中,(nil)是一个特殊响应标识,用于表示 数据不存在 或 空值状态。

# 1.4 查询键的过期时间

127.0.0.1:6379> SET name FEIXIANG
OK
127.0.0.1:6379> TTL name
(integer) -1
127.0.0.1:6379> SET NAME AOXIANG EX 60
OK
127.0.0.1:6379> TTL NAME
(integer) 57

-1表示键name不过期,57表示键NAME还有57秒过期。

# 1.5 设置值时不允许覆盖

127.0.0.1:6379> SET name AOXIANG NX		# 如果键name不存在,则设置为“AOXIANG”,否则不设置
(nil)
127.0.0.1:6379> GET name		# name值未被改变
"FEIXIANG"

如果你并不想覆盖一个已经存在的键,那么加上NX参数,可以避免原值丢失。

# 2.删除与验证

# 2.1 删除并验证NAME

127.0.0.1:6379> EXISTS NAME		# 验证是否存在键NAME
(integer) 1
127.0.0.1:6379> DEL NAME		# 删除键NAME
(integer) 1
127.0.0.1:6379> EXISTS NAME
(integer) 0
127.0.0.1:6379> DEL NAME
(integer) 0

EXISTS NAME命令用来检查键NAME是否存在,返回值是1,表示存在。DEL NAME命令删除了键NAME,返回值是1,表示删除成功。之后再次执行EXISTS NAME,返回值是0,说明键NAME不存在。又执行了一次DEL NAME,返回值是0,表示删除失败,因为键NAME已经不存在了。

# 3.键的其它操作

# 3.1 返回键存储的数据类型

127.0.0.1:6379> TYPE name
string

string表示键name的值是字符串类型的。

# 3.2 强制重命名键(覆盖已存在)

127.0.0.1:6379> RENAME name myname
OK
127.0.0.1:6379> GET name
(nil)
127.0.0.1:6379> GET myname
"FEIXIANG"

命令RENAME将键name重命名为myname,值不变,相当于删除原来的键并将值设置到新键上。

# 3.3 安全重命名(仅当新键不存在时)

127.0.0.1:6379> SET NAME AOXIANG
OK
127.0.0.1:6379> RENAMENX NAME myname
(integer) 0
127.0.0.1:6379> GET NAME
"AOXIANG"
127.0.0.1:6379> GET myname
"FEIXIANG"

RENAMENX命令尝试把键NAME重命名为myname,返回值是0,重命名失败。原因是目标键名myname已经存在,RENAMENX命令要求目标键名必须不存在。再用GET命令获取数据,发现两者都没被更改。

记忆:RENAME->重命名,N->Not(不),X->EXISTS(存在)

# 4.查询当前已存在的键

在 Redis 中查看当前数据库中的键有多种方法,但需要根据数据量和生产环境谨慎选择操作方式。以下是可选的解决方案:

# 4.1 KEYS命令(⚠️ 生产环境慎用)

KEYS 键的通配符模式

通过通配符匹配键名:

127.0.0.1:6379> KEYS *		# 查询所有的键
1) "NAME"
2) "myname"
127.0.0.1:6379> SET user:name FEIXIANG
OK
127.0.0.1:6379> SET user:web www.feixiang.net
OK
127.0.0.1:6379> SET user:city guangzhou
OK
127.0.0.1:6379> KEYS user:*			# 查询所有以 "user:" 开头的键
1) "user:name"
2) "user:web"
3) "user:city"

风险:该命令会遍历整个键空间,若数据库键数量较大(如百万级),可能导致 Redis 短暂阻塞(单线程特性),影响生产环境性能。

# 4.2 SCAN命令(✅ 生产推荐)

SCAN cursor [MATCH 键的模板] [COUNT 总数]

功能:分批次安全遍历键,无阻塞风险。参数介绍如下:

参数 作用
cursor 迭代游标(起始为 0,结束为 0)
MATCH 匹配键名的通配符模式
COUNT 每次遍历的数量(默认 10,可调整)

分批次查询以 "user:" 开头的键:

127.0.0.1:6379> KEYS *		# 先显示所有的键
1) "NAME"
2) "myname"
3) "user:name"
4) "user:web"
5) "user:city"
# 第一次迭代
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 2		# 从游标0开始查询以 "user:" 开头的键
1) "1"
2) 1) "user:web"
   2) "user:city"
# 继续迭代(使用返回的新游标)
127.0.0.1:6379> SCAN 1 MATCH user:* COUNT 2		# 从游标1开始查询以 "user:" 开头的键
1) "7"
2) 1) "user:name"
# 第三次迭代(使用返回的新游标)
127.0.0.1:6379> SCAN 7 MATCH user:* COUNT 2
1) "0"						 # 游标归 0 表示遍历完成
2) (empty list or set)

特点:可能返回重复键,需客户端去重;适合编写脚本自动化遍历。

游标是 Redis 内部哈希表结构的遍历进度标识。Redis 使用哈希表存储键,SCAN 命令通过游标记录当前遍历到哈希表的哪个位置。游标可以表示当前遍历的进度状态,但不一定是连续的值,也非简单的序号或索引。

# 键的命名规范

# 1.组成元素

Redis键是二进制安全的字符串,理论上支持任意字符(包括空格、特殊符号等)。但为了可读性和管理方便,建议使用以下字符:

  • 字母和数字:a-zA-Z0-9
  • 分隔符:使用冒号 : 或短横线 - 作为层级分隔符(如 user:id:001)。
  • 避免的字符:空格、换行符、不可见控制字符(如 \n, \t),以及需要转义的字符(如 ", ', *, ?),以免在命令行或客户端操作时引发问题。

# 2.键的长度

  • 最大长度:512 MB(理论上),但实际应用中应尽量简短。
  • 建议长度:不超过 100 字符,以节省内存和网络开销,同时保持可读性。

# 3.命名建议

  • 层级化结构:使用分隔符组织键名,例如:
service:entity:id:field(如 shop:cart:1000:items)
  • 一致性:统一命名风格(如全小写、短横线分隔)。
  • 可读性:使用有意义的单词而非随机字符串(如 user:1000:email 优于 abcd )。
  • 标识过期时间:对临时数据添加前缀(如 temp:session:1000 )。
  • 避免过长哈希值:如 user:3a7b2c8f6d9g7h... 会影响维护效率。

# 命令集

在 Redis 客户端(如 redis-cli )可以通过help @generic查找所有与键相关的命令,效果如下:

127.0.0.1:6379> help @generic

  DEL key [key ...]
  summary: Delete a key
  since: 1.0.0

  DUMP key
  summary: Return a serialized version of the value stored at the specified key.
  since: 2.6.0

  EXISTS key
  summary: Determine if a key exists
  since: 1.0.0
  
  ……
  

为了方便学习,这里直接给出 Redis-x64-3.0.504 版本的键命令集:

命令 说明 版本
DEL key [key ...] 删除一个或多个键 1.0.0+
DUMP key 返回指定键存储值的序列化版本 2.6.0+
EXISTS key 判断键是否存在 1.0.0+
EXPIRE key seconds 设置键的存活时间(秒) 1.0.0+
EXPIREAT key timestamp 设置键的过期时间(UNIX时间戳) 1.2.0+
KEYS pattern 查找匹配给定模式的所有键 1.0.0+
MIGRATE host port key ... 原子化地将键从Redis实例转移到另一个实例 2.6.0+
MOVE key db 将键移动到另一个数据库 1.0.0+
OBJECT subcommand ... 检查Redis对象的内部信息 2.2.3+
PERSIST key 移除键的过期时间 2.2.0+
PEXPIRE key milliseconds 设置键的存活时间(毫秒) 2.6.0+
PEXPIREAT key milliseconds-ts 设置键的过期时间(毫秒级UNIX时间戳) 2.6.0+
PTTL key 获取键的剩余存活时间(毫秒) 2.6.0+
RANDOMKEY 随机返回一个键 1.0.0+
RENAME key newkey 重命名键 1.0.0+
RENAMENX key newkey 仅当新键不存在时重命名键 1.0.0+
RESTORE key ttl serialized... 使用序列化值创建键(需先通过DUMP获取) 2.6.0+
SCAN cursor ... 增量迭代键空间 2.8.0+
SORT key ... 对列表、集合或有序集合的元素进行排序 1.0.0+
TTL key 获取键的剩余存活时间(秒) 1.0.0+
TYPE key 判断键存储的数据类型 1.0.0+



微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。