外观
Redis 是做什么的
字数
1024 字
预计阅读
4 分钟
一句话理解
Redis 是一个存在内存里的键值存储。 你可以把它理解成"服务端的 localStorage",但有三个关键区别:
localStorage | Redis | |
|---|---|---|
| 在哪里 | 每个用户的浏览器里 | 服务器上,所有请求共用 |
| 速度 | 快 | 非常快(数据都在内存里) |
| 过期 | 不会自动过期 | 每个键都可以设置过期时间,到期自动删除 |
MySQL 适合存"要长期保存、要做复杂查询"的数据;Redis 适合存"临时的、需要频繁读取、需要自动过期"的数据。
项目里用 Redis 做什么
| 用途 | 键的样子 | 为什么用 Redis |
|---|---|---|
| 登录令牌 | qw:auth:at:… | 每个请求都要查一次,必须快;到期要自动失效 |
| 在线用户列表 | qw:auth:online | 频繁变化 |
| 权限版本号 | qw:auth:permver:… | 每个请求都要比对 |
| 登录失败次数 | qw:auth:fail:… | 10 分钟后自动清零 |
| 验证码答案 | qw:captcha:… | 2 分钟后自动过期,只能用一次 |
| 短信发送频率限制 | qw:sms:limit:… | 按天自动重置 |
| 字典和参数缓存 | qw:dict:… qw:param:… | 读取次数远多于修改次数 |
| 防重复提交 | qw:idem:… | 3 秒后自动过期 |
| 定时任务锁 | qw:job:lock:… | 防止同一个任务同时运行两次 |
项目的规矩
所有的键都必须通过 core/redis/cache-namespaces.ts 生成,不能在代码里直接写字符串:
- 所有的键都带
qw:前缀,所以可以和其他项目共用一个 Redis; - 所有的键前缀都登记在一个文件里,"系统监控 → 缓存列表"页面就是按这份登记来展示和清理的;
- 以后要做多租户,只需要修改这一个地方。
项目有检查脚本,发现直接用字符串写 Redis 键会报错。
缓存要注意什么
"读数据库太慢,那就放一份到 Redis",这就是缓存。缓存最难的地方是:数据库的数据改了,缓存里的旧数据怎么办?
项目的做法是:修改字典或参数后,立即删除对应的缓存,下次读取时再从数据库重新加载。如果你给自己的模块加缓存,也要遵守这个原则:写数据库的地方,同时让缓存失效。
大部分情况下不需要缓存
MySQL 查询一张有索引的表,通常只需要几毫秒。先不要加缓存,等真的遇到性能问题、并且确认瓶颈在这里时再加。
查看 Redis 里的数据
bash
redis-cli -n 13 --user qiwu --askpasspowershell
memurai-cli -n 13 --user qiwu --askpass按提示输入 Redis 密码后,你应该看到 127.0.0.1:6379[13]> 的提示符。如果 Redis 没有设置密码,去掉 --user qiwu --askpass,只保留 -n 13;只设置了密码(.env.local 的 REDIS_USERNAME 为空)时,去掉 --user qiwu,保留 --askpass;配置了 ACL 用户时,--user 后面的用户名要和 REDIS_USERNAME 一致。Windows 找不到 memurai-cli 时,按安装页的说明,在实际安装目录中用 .\memurai-cli.exe 替代它。
然后在 Redis 客户端中逐行输入(两种系统相同,不要复制提示符):
text
SCAN 0 MATCH qw:dict:* COUNT 100
GET qw:param:xxx
TTL qw:captcha:xxxSCAN 按前缀查找键,返回游标和键列表;GET 查看值,TTL 查看还剩几秒过期。后两行的键名要替换成实际查到的键。
-n 13 是开发环境使用的库号(REDIS_DB)。
注意
不要用 KEYS *,键很多时它会让 Redis 卡住。用 SCAN 代替。也不要在共用的 Redis 上执行 FLUSHDB,它会清空这个库里所有项目的数据。
后台页面 系统监控 → 缓存列表 也可以按类别查看和清理缓存。