# 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交流群
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。