这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
Redis 是什么
为什么需要 Redis
随着互联网的发展,数据读写的压力不断增加,web服务从最初的单库单表到分库分表,从单机到集群。
这个时候就需要 Redis 来缓存一些数据,加快数据读写。
Redis 基于内存运行,性能极高,同时也可以持久化到磁盘上,避免重启造成的数据丢失。
Redis 基本工作原理
Redis 的数据储存在内存中,同时数据保存到硬盘上防止重启导致的数据丢失。
增量数据保存到AOF文件中,全量数据储存在RDB文件中。
AOF文件是可读的,一行一条语句
Redis 是单线程的
Redis 应用案例
1. 连续签到
可以通过设置过期时间来实现连续签到的功能
使用的 Redis 数据类型为 sds (Simple Dynamic Strings)
2. 消息通知
3. 计数
4. 排行榜
5. 限流
6. 分布式锁
Redis 使用注意事项
1. 大 key
| 数据类型 | 标准 |
|---|---|
| String | value字节数大于10KB即为大 key |
| Hash/Zset/Set/List等结构 | 元素个数大于5000或者总字节数大于10MB即为大 key |
大 key 的读取成本高,容易造成慢查询,阻塞服务。
解决办法:
- 拆分大 key, 例如将一个 String 类型的数据拆分成两个 String 类型的数据
- 压缩,将value压缩后存入redis, 读取时解压出来
2. 热 key
热key:访问比较频繁的 key, 例如 QPS 超过500
解决办法:
- 在业务侧使用Localcache, 降低访问redis。例如goland的Bigcache
- 将value复制好几份,存入不同的key中。缺点是,更新时需要通过更新多个key,可能导致短期内数据不一致
- 通过使用 Redis 代理,发现和存储热 key
3. 慢查询
容易造成慢查询的操作:
- 批量操作一次传入过多的 key/value
- 操作的单个value过大
- 对大key的 delete/expire 操作
4. 缓存穿透
缓存穿透:指数据查询绕过缓存,直接查询数据库
例如查询一个不存在的key,这类查询就有可能直接打到db。
解决办法:
- 如果一个值在缓存和数据库中都不存在,下次请求可以直接返回空值
- 使用bloom filter 算法来储存合法key,只需要很小的空间就能存储大量 key
5. 缓存雪崩
缓存雪崩:大量缓存同时过期
解决办法:
- 将缓存过期时间分散开,对于热点数据,缓存时间尽量设置长一点,冷门数据短一些
- 使用缓存集群