使用Redis作为缓存层,将频繁访问的数据预先存入Redis中,当用户查询时直接从Redis中读取数据,避免了每次都查询慢速的数据库,从而极大提升查询速度。核心步骤:1. 识别热点数据;2. 数据写入时同步更新Redis;3. 查询时先查Redis,miss再查DB并回写Redis;4. 设置合理过期时间防止缓存雪崩。
缓存穿透、缓存击穿、缓存雪崩的解决方案
缓存穿透:查询不存在的数据,使用布隆过滤器预判或缓存空值。缓存击穿:热点key失效时,使用互斥锁或逻辑过期。缓存雪崩:设置不同过期时间、熔断降级、多级缓存。提升系统性能的关键是合理配置这些策略,避免缓存失效导致数据库压力暴增。
Redis数据结构选择对性能的影响
String适合简单KV,Hash节省内存存储对象,List用于队列,Set去重集合,Sorted Set排行榜。选择合适结构能减少序列化开销,提升序列化/反序列化速度,进而提高整体响应效率。例如,用Hash代替多个String key,能减少网络RTT。
Redis集群与哨兵模式提升高可用
单机Redis有单点故障风险,使用哨兵模式实现主从自动切换,集群模式分片支持海量数据和高并发。分片后查询负载分散,响应时间稳定在毫秒级。通过Pipeline批量操作减少网络往返,提升吞吐量。
连接池和序列化优化
使用连接池如JedisPool或Lettuce,避免频繁创建连接。选择Kryo或Protostuff代替JDK序列化,速度提升5-10倍。设置合理的maxTotal、maxIdle参数,监控连接使用率,确保高并发下不阻塞。
本地缓存与Redis二级缓存
Guava Cache或Caffeine作为L1本地缓存,Redis作为L2。热点数据命中本地缓存,减少网络IO,冷数据回源Redis。双写一致性用canal订阅binlog异步更新,提升99.9%命中率下响应效率。
FAQ
Q: Redis缓存命中率低怎么提升?
A: 增加缓存容量、延长TTL、预热热点数据、优化key设计避免热点key倾斜。
Q: 如何防止缓存与数据库不一致?
A: 写操作先删缓存后更新DB,或用延迟双删、最终一致性方案如binlog订阅。
Q: Redis内存不足怎么办?
A: 配置内存淘汰策略如allkeys-lru,监控used_memory,考虑分片或业务分库。
Q: 大key怎么拆分?
A: Hash/List分片存储,拆成小key如user:1:info、user:1:orders。