Redis 缓存问题及解决方案

1. 缓存穿透

    指查询一个不存在的对象,缓存层和存储层都不会命中,可以采用缓存空对象或者bloom filter解决,两者的解决典型场景不同,bloom filter适用于数据相对固定实时性低的场景。

2. 无底洞优化

    无底洞问题指水平扩展,性能没有提升甚至会下降,这是因为客户端一次批量操作会涉及很多网络操作,随着节点增多,耗时会变大,网络节点多对节点性能也有影响。优化方式是减少io,一个是使用hash_tag把mget的key放在一个节点,另一个方式是客户端根据key,slot,node 对应关系进行归类批量访问同一个node的数据。

3. 缓存雪崩

    指缓存挂掉,不能提供服务,所有的流量瞬间打到存储层,有可能造成存储层宕机。

    解决方法是:

    3.1. 保证缓存层的高可用,使用集群方案

    3.2. 做组件隔离和限流降级,隔离是指像redis mysql hbase这些资源要独立部署或使用独立资源(机器或者线程池资源),限流是使用队列等技术做限流,降级是使用替代资源。资源依赖隔离可以使用Hystrix(github有)。

    3.3. 做预案和提前演练

4. 热点key重建

   当前key是热点key,重建缓存不能短时间内完成,可能会导致同时大量的线程重建索引。

   4.1 分布式锁

   数据设置过期时间,若数据过期,分布式锁(redis的setnx命令就可以实现),保证只有一个线程更新数据,没有拿到分布式锁的线程阻塞。

   4.2 数据永不过期

   数据不过期,但是会逻辑过期,即给数据加一个内部过期属性,服务逻辑上每次检查是否过期,如果过期时间到,则使用分布式锁保证有一个线程更新数据和设置新的逻辑过期时间,其他线程返回老数据

   两种方案各有优劣,分布式锁思路简单但是可能会阻塞线程池或者死锁风险;永不过期能基本杜绝热点key但是不保证一致性以及代码维护成本更高

猜你喜欢

转载自ballenlee.iteye.com/blog/2410452