更多特训营笔记详见个人主页【面试鸭特训营】专栏
250107
1. 如何解决 Redis 中的热点 key 问题?
- 将
访问频率占比过大 或 宽带占比过大
的 key 定义为热点 key - 由于 Redis 的读写操作是单线程进行,热点 key 可能会占用大量 CPU 资源,在集群环境下导致流量不均衡
如何发现热点 key
解决方案 | 优点 | 缺点 |
---|---|---|
根据业务经验 | 简单省事 | 经验判断不一定准确 |
redis 集群监控 | 使用简单 | 每次发生状况都需要进行排查 |
hotkey监控 | 4.0版本后 redis 自带 | 需要扫描整个ketspace ,且实时性不好 |
monitor 命令 | redis1.0 自带功能 | 非常消耗性能 |
客户端收集 | 性能损耗低 | 成本较大,需要聚合计算平台查看计算后的结果 |
代理层收集 | 客户端使用方便 | 构建代理的成本不低,且转发有性能损耗 |
如何解决热点 key
- 多级缓存
- 一级缓存
- 一般时候应用程序本地缓存(JVM 内存中的缓存)
- 二级缓存
- Redis 缓存
- 当数据不存在于一级缓存中时,才会请求二级缓存
- 可以有效减低 Redis 的访问次数
- 一级缓存
- 拆分热点 key
- 可以将
test
这个缓存拆分成test1
test2
test3
,他们三个各缓存一部分数据,不同用户仅需访问不同数据 - 当热度降低下来时,再访问替换数据
- 可以将
2. Redis 集群的实现原理是什么?
- 主要方案是分片集群 + 主从复制
分片集群方案
- 总共有 16384 个哈希槽
- 将 16384 个哈希槽平均分配给不同的实例
- 读写数据时,通过哈希算法计算有效值,该值对 16384 取余,通过余数判断其所属实例
主从复制方案
- Redis 集群中有多个主节点,每个主节点都可以进行写操作,提高并发写能力
- 每个主节点都可以有多个从节点,且从节点数据信息与主节点保持全量一致,保证并发读能力
- 不同主节点间会定期向其他主节点发送心跳包,以检测主节点的健康状况,如果某个主节点死亡,集群会通过选举机制选择一个新的主节点,并重新分配哈希值
3. Redis 中的 Big Key 问题是什么?如何解决?
- Big Key 是指一个内存空间占用较大的 key
Big Key 的危害
- 内存分布不均匀导致查询效受影响
- Redis 单线程执行,操作大 key 时间较长,可能造成阻塞
- 网络传输时大 key 占用较多资源,可能导致客户端超时
Big Key 的解决方案
- 开发方面
- 将存储对象压缩后再存储
- 将一个大 key 拆成多个小 key
- 选取更加合适的数据结构进行存储
- 业务方面
- 仅存储必要数据,不存储不常用信息
- 选择性展示信息,而非全部进行展示
- 数据分布方面
- 将大 key 拆散分布到 Redis 集群中不同的服务器上