Redis - 大厂程序员是怎么用的 | 青训营笔记

50 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

Redis 是什么

为什么需要 Redis

随着互联网的发展,数据读写的压力不断增加,web服务从最初的单库单表到分库分表,从单机到集群。

这个时候就需要 Redis 来缓存一些数据,加快数据读写。

Redis 基于内存运行,性能极高,同时也可以持久化到磁盘上,避免重启造成的数据丢失。

Redis 基本工作原理

image.png

Redis 的数据储存在内存中,同时数据保存到硬盘上防止重启导致的数据丢失。

增量数据保存到AOF文件中,全量数据储存在RDB文件中。

AOF文件是可读的,一行一条语句

Redis 是单线程的

Redis 应用案例

案例代码:gitee.com/wedone/redi…

1. 连续签到

可以通过设置过期时间来实现连续签到的功能

使用的 Redis 数据类型为 sds (Simple Dynamic Strings)

image.png

image.png

2. 消息通知

3. 计数

4. 排行榜

5. 限流

6. 分布式锁

Redis 使用注意事项

1. 大 key

数据类型标准
Stringvalue字节数大于10KB即为大 key
Hash/Zset/Set/List等结构元素个数大于5000或者总字节数大于10MB即为大 key

大 key 的读取成本高,容易造成慢查询,阻塞服务。

解决办法:

  1. 拆分大 key, 例如将一个 String 类型的数据拆分成两个 String 类型的数据
  2. 压缩,将value压缩后存入redis, 读取时解压出来

2. 热 key

热key:访问比较频繁的 key, 例如 QPS 超过500

解决办法:

  1. 在业务侧使用Localcache, 降低访问redis。例如goland的Bigcache
  2. 将value复制好几份,存入不同的key中。缺点是,更新时需要通过更新多个key,可能导致短期内数据不一致
  3. 通过使用 Redis 代理,发现和存储热 key

image.png

3. 慢查询

容易造成慢查询的操作:

  1. 批量操作一次传入过多的 key/value
  2. 操作的单个value过大
  3. 对大key的 delete/expire 操作

4. 缓存穿透

缓存穿透:指数据查询绕过缓存,直接查询数据库

例如查询一个不存在的key,这类查询就有可能直接打到db。

解决办法:

  1. 如果一个值在缓存和数据库中都不存在,下次请求可以直接返回空值
  2. 使用bloom filter 算法来储存合法key,只需要很小的空间就能存储大量 key

5. 缓存雪崩

缓存雪崩:大量缓存同时过期

解决办法:

  1. 将缓存过期时间分散开,对于热点数据,缓存时间尽量设置长一点,冷门数据短一些
  2. 使用缓存集群