# Redis键(Key)
概念
Redis 的 键(Key) 是用于唯一标识存储在数据库中的数据的字符串。每个键对应一个 值(Value) ,而值可以是字符串、哈希、列表、集合等多种数据类型。键在Redis中扮演了数据访问的“入口”角色,通过键可以快速定位和操作对应的值。
在一个单独的Redis库中,键必须是唯一的。
# 作用
Redis 键是数据存储的核心标识符,承担以下核心作用:
- 数据定位:通过唯一键名快速访问关联的字符串、哈希、列表等数据结构。
- 生命周期管理:控制数据的过期时间,实现自动数据清理。
- 数据归类:通过命名规范建立层级关系,提升可维护性。
- 权限控制:基于键名实现细粒度的访问权限管理。
# 语法
通用命令格式:
COMMAND [KEY_NAME] [PARAM]
组成部分 | 说明 | 示例 |
---|---|---|
COMMAND | 操作指令(区分大小写) | SET , GET , DEL , EXISTS |
KEY_NAME | 目标键名(最长512MB) | name |
PARAM | 参数,附加操作条件或数据 | EX 60 , NX |
# 示例
# 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-z
,A-Z
,0-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交流群
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。