[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| exists | v. | /ɪɡˈzɪsts/ | 存在(EXISTS key 判断键是否存在,1=存在,0=不存在) |
| unlink | v. | /ˌʌnˈlɪŋk/ | 解除链接(UNLINK key 异步删除,不阻塞主线程,适合删大键) |
| expire | v. | /ɪkˈspaɪə(r)/ | 过期(EXPIRE key 秒数 为键设置过期时间) |
| ttl | n. | /ˌtiː tiː ˈel/ | 剩余生存时间(TTL key 返回剩余秒数,-1 永不过期,-2 已过期) |
| pattern | n. | /ˈpætn/ | 模式(KEYS pattern 支持 * 匹配多个、? 匹配单个字符) |
| eviction | n. | /ɪˈvɪkʃn/ | 驱逐(内存超限时删除键释放内存的行为) |
| scan | v./n. | /skæn/ | 扫描(SCAN 游标式遍历键,避免 KEYS 阻塞) |
Lecture02-Redis-通用命令与键管理
1、数据库(DB)操作
Redis 默认有 16 个逻辑数据库(配置项 databases 16),相当于 16 个独立的 Map<String, value> 空间,索引从 0 到 15。
理解:16 个库共享一份数据文件/内存,只是逻辑上隔离,不用于多租户隔离(生产一般只用 0 号库,库号更多用于教学分隔)。
1、切换数据库
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379>
2、查看当前库键的数量
127.0.0.1:6379> dbsize
(integer) 3
3、清空当前库【危险】
127.0.0.1:6379> flushdb
4、清空所有库【危险】
127.0.0.1:6379> flushall
提示:
flushall也会触发一次 RDB 持久化,生成一个空的 dump.rdb(第 9 讲说明)。
2、Key 操作
1、Key 命名规范
- 见名知意:
user:token:session:xxx。 - 同一项目统一规范,多单词用
:分隔(这是 Redis 社区惯例,方便按前缀分组)。 - Key 区分大小写,命令不区分大小写。
- Key 不宜过长(超过 1024 字节会消耗过多内存、降低查询效率)。
2、命令列表
| 语法 | 功能说明 |
|---|---|
keys pattern | 按 pattern 查看键。* 匹配多个字符,? 匹配单个字符。⚠️ 生产禁用:会阻塞主线程 |
exists key [key ...] | 判断键是否存在,返回存在个数 |
type key | 查看键对应 value 的类型 |
del key [key ...] | 同步删除键,客户端要等删除完才返回 |
unlink key [key ...] | 异步删除,先删元数据、真正删除后台执行,删大键不阻塞 |
expire key 秒数 | 为键设置过期时间(单位秒) |
ttl key | 查看剩余过期时间:-1 永不过期,-2 已过期 |
persist key | 取消键的过期时间,转为永久 |
rename old new | 重命名键 |
scan cursor [MATCH p] | 游标式遍历键,不阻塞(生产替代 keys) |
3、操作演示
# 批量造几个键
127.0.0.1:6379> mset name tom age 20 city shenzhen
OK
# 按模式查键
127.0.0.1:6379> keys *
1) "age"
2) "city"
3) "name"
127.0.0.1:6379> keys n*
1) "name"
# 判断存在
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists name age xyz
(integer) 2
# 查看类型
127.0.0.1:6379> type name
string
# 设置过期时间
127.0.0.1:6379> expire name 60
(integer) 1
127.0.0.1:6379> ttl name
(integer) 59
127.0.0.1:6379> ttl notexist
(integer) -2
# 异步删除
127.0.0.1:6379> unlink city
(integer) 1
3、过期机制(TTL)与淘汰策略
1、过期时间的作用
给键设置过期时间,到期后 Redis 自动删除。典型应用:
- 验证码:
SET verify:code 123456 EX 120(2 分钟有效) - 登录 Token:
SET token:xxx <值> EX 7200(2 小时有效) - 限流计数器、临时标记等
2、设置过期的几种写法
# 方式一:set 时带 EX 参数
127.0.0.1:6379> set verify:code 123456 ex 120
OK
127.0.0.1:6379> ttl verify:code
(integer) 118
# 方式二:单独 expire
127.0.0.1:6379> set token:abc "value"
OK
127.0.0.1:6379> expire token:abc 7200
(integer) 1
# 方式三:毫秒级 PEXPIRE / SET PX
127.0.0.1:6379> pttl verify:code
(integer) 107000
3、过期键如何被删除(够用版)
Redis 对过期键采用主动 + 被动两种方式回收:
| 机制 | 说明 |
|---|---|
| 惰性删除(被动) | 访问到已过期键时,先删除再返回空,懒到"用到才删" |
| 定期删除(主动) | 后台每 100ms 抽样删除一批已过期键,避免过期键堆积占用内存 |
记忆口诀:"用到才删 + 后台定时抽删"。但这两种都可能让键"稍晚一点才消失",所以不要依赖 TTL 精确到毫秒。
4、内存淘汰(Maxmemory)
当内存写满(配置 maxmemory)时,按 maxmemory-policy 决定删除哪些键。第 12 讲会详细展开 8 种策略,这里先记住最常见的:
maxmemory-policy allkeys-lru # 淘汰"最近最少使用"的键(缓存首选)
4、生产注意:不要用 KEYS
KEYS * 会遍历全部键并阻塞主线程,生产环境数据量大时会卡死服务。替代方案用 SCAN:
# 游标式分批扫描,不阻塞
127.0.0.1:6379> scan 0 match user:* count 100
1) "1536" # 下次游标位置,返回 0 表示遍历结束
2) 1) "user:1"
2) "user:2"
运维排查用
SCAN,业务代码里不要用 KEYS。
5、本讲小结
- Redis 默认 16 个库,
select切换,生产一般只用 0 号库。 - Key 操作重点是:
exists / type / del / unlink / expire / ttl。 - TTL 过期 = 惰性删除 + 定期删除,别依赖精确过期时间。
- 生产禁用
KEYS,用SCAN。
6、课堂练习
- 在 0 号库设置 5 个键(含
user:1~user:3),用keys user:*查看。 - 给
user:1设置 30 秒过期,观察ttl变化,等过期后用exists确认已删。 - 用
unlink删除一个大键(先set bigkey一个大字符串),观察与del的返回差异。 - 用
scan 0 match user:* count 100遍历出所有user:*键。
7、本节验证
- 会切换数据库、查看当前库键数量、清空库 ✅
- 掌握 key 常用命令(exists/type/unlink/expire/ttl)与命名规范 ✅
- 理解 TTL 语义(-1 永不过期、-2 已过期)与过期键删除机制(够用版)✅
- 知道生产禁用 KEYS,改用 SCAN 游标分批遍历 ✅