这是我参与「第五届青训营 」伴学笔记创作活动的第18天
PPT: bytedance.feishu.cn/file/boxcni…
案例仓库: gitee.com/wedone/redi…
讲师: 王星星
01 Redis是什么
1 为什么需要Redis?
数据分冷热
将热数据存储到内存
MySQL和Redis同步示意图见PPT
2 Redis基本工作原理
数据从内存中读写
数据保存到硬盘上防止重启数据丢失
增量数据保存到AOF文件
全量数据RDB文件
单线程处理所有操作命令
AOF(Append Only File)
02 Redis应用案例
Redis广泛使用的字符串结构SDS(Simple Dynamic String)
List数据结构Quicklist: 由一个双向链表和listpack实现
zset数据结构zskiplist
之后可以去了解了解⭐
1 连续签到
2 消息通知
3 计数
4 排行榜
5 限流
6 分布式锁
03 Redis使用注意事项
1 大Key, 热Key
大Key定义:
String类型 value的字节数大于10KB即为大Key
Hash/Set/Zset/list等复杂数据结构类型 元素个数大于5000个或总value字节数大于10MB即为大Key
危害:
读取成本高
容易导致慢查询
主从复制异常, 服务阻塞
无法正常响应请求
业务侧使用大Key的表现:
请求Redis超时报错
解决:
1 拆分
2 压缩
热Key的定义:
用户访问一个Key的QPS特别高, 导致Server实例出现CPU负载突增或不均的情况
热Key没有明确的标准, QPS超过500就有可能被识别为热Key
解决方法:
1 设置Localcache: 业务服务侧设置Localcache, 降低访问Redis的QPS
2 拆分: 将一个热Key复制写入多份如Key1: value, Key2: value. 将qps分散到不同实例, 代价时更新时存在数据短暂不一致的风险
3 使用Redis代理的热Key承载能力: 结合了热Key发现, LocalCache
2 慢查询场景
容易导致redis慢查询的操作
1 批量一次性传入过多的key/value, 如mset/hmset/sadd/zadd等O(n)操作
建议单批次不要超过100, 超过100之后性能下降明显
2 zset大部分命令都是O(log(n)), 当大小超过5k以上时, 简单的zadd/zrem也可能导致慢查询
3 操作的单个value过大, 超过10KB, 应避免使用大Key
4 对大Key的delete/expire操作
3 缓存穿透, 缓存雪崩
缓存穿透: 热点数据查询绕过缓存, 直接查询数据库
缓存雪崩: 大量缓存同时过期
缓存穿透的危害:
1 查询一个一定不存在的数据
通常不会缓存不存在的数据, 这类查询请求都会直接打到db, 如果有系统bug或人为攻击, 那么容易导致db响应慢甚至宕机
2 缓存过期时
在高并发场景下, 一个热key如果过期, 会有大量请求同时击穿db, 容易影响db性能和稳定
同一时间有大量key集中过期时, 也会导致大量请求落到db上, 导致查询变慢
如何减少缓存穿透:
1 缓存空值
2 布隆过滤器: 通过bloom filter算法挨存储合法key, 该算法有超高压缩率, 只需极小的空间就能存储大量key值
有时间去了解一下bloom filter⭐
如何避免缓存雪崩:
1 将缓存失效时间分散开
2 使用缓存集群, 避免单机宕机造成的缓存雪崩