Redis
常见问题
| 问题 | 出现原因 | 处理方案 |
|---|---|---|
| 缓存击穿 | 1. 热点数据过期 2. 并发访问集中在同一时刻 | 1. 分布式锁控制并发,防止同一时间大量请求穿透到数据库 2. 设置热点数据永不过期,避免频繁失效 3. 缓存预热,设置随机过期时间,减少同一时刻失效的概率 |
| 缓存穿透 | 1. 恶意请求不存在的键 2. 系统参数校验问题 | 1. 合理化参数校验,过滤非法请求 2. 对查询结果为空的key设置空值,防止反复查询数据库 3. 使用布隆过滤器拦截不存在的key(实现复杂,优先级较低) |
| 缓存雪崩 | 1. 大面积缓存失效 2. 宕机 | 1. 缓存过期时间分散化,避免同一时间大量key失效 2. 增加多级缓存(如本地缓存+Redis),提升容错能力 3. 使用熔断、限流机制保护系统 4. 部署Redis高可用,减少单点故障风险 |
说明:
- 缓存击穿:指某个热点数据在缓存失效后,短时间内大量请求直接访问数据库,导致数据库压力骤增。
- 缓存穿透:指请求的数据在缓存和数据库中都不存在,导致每次请求都要访问数据库。
- 缓存雪崩:指大量缓存同一时间失效,导致大量请求直接访问数据库,可能引发系统崩溃。
参数配置建议
blockWhenExhausted = false:连接池耗尽时直接抛出异常,避免线程阻塞。若设置为true,需保证maxIdle大于0。- 连接数
maxTotal和maxIdle建议设置为同一数量级,推荐最大连接数4096。 - 建议使用
jedis作为客户端,因其支持拓扑刷新、xreadgroup等功能,且基于Netty异步实现,长连接可复用。 - 合理设置超时时间:建立连接时间建议1000-5000毫秒;单次操作时间建议1000-5000毫秒。
- 高可用部署建议:
- 单实例哨兵模式:一主二从,三哨兵,跨两个机房,三台物理机。
- 集群模式:三主三从,两个机房,每个机房六台物理机。
- 写数据时,建议先更新数据库再删除缓存,或采用延迟双删策略,保证数据一致性。
补充说明:
- 高可用部署建议跨机房、跨物理机器,确保独立电力和网络,提升容灾能力。