redis缓存失效、竞争加载引发的性能问题

redis缓存失效时,众所周知,如果不做保护自己放任请求去并发重新加载缓存,会导致大量请求直接打到数据库上,即出现缓存击穿问题。

项目组为了解决这个问题,使用了竞争获取锁刷新缓存的方式,应对缓存失效。

比如A B两个请求到达,在redis进行锁竞争,获取锁的线程开始查表刷缓存。获取不到锁的线程则开始通过循环sleep的方式,查询缓存是否刷新完毕,如果循环等待时间超过一定1秒,就放弃。

这样看起来很完美,实际上引起了Redis的性能问题

生产环境中,发现redis 的请求延迟和请求量均在2小时左右周期性出现波峰。

 生产环境的服务器数量大概在两百台左右,对单key对象的接口请求qps大概峰值在1万,重新加载缓存需要的实际并不短,假如超过了1秒,理论上会带来10000*20的redis单key qps,已经超过了redis的单节点性能上线。

这个问题的启发:不要在请求中去把请求量放大。

### Redis多级缓存的设计与实现 #### 1. 多级缓存架构概述 多级缓存是一种分层存储策略,旨在通过不同层次的缓存来提高系统的性能和可靠性。Redis作为主流的内存数据库,在构建多级缓存体系中扮演重要角色。常见的多级缓存架构可以分为本地缓存、分布式缓存以及持久化存储三个主要部分[^1]。 #### 2. 层次划分及其功能 - **本地缓存** 使用进程内的缓存工具(如Caffeine),由于其低延迟特性,适合高频访问的小型数据集。它利用`ConcurrentHashMap`提供高效的并发支持,减少对外部服务的依赖[^2]。 - **分布式缓存 (Redis)** Redis作为核心组件,负责承载全局共享的数据。它的高吞吐量和丰富的数据结构使其成为理想的选择。然而需要注意的是,尽管Redis提供了多个数据库编号的功能,但在实际生产环境中并不推荐将其用于隔离不同的业务逻辑,因为这可能导致资源竞争和线程干扰[^3]。 - **持久化存储** 数据库充当最终的事实来源,当上层缓存失效时可以从这里重新加载数据。为了防止大规模请求直接冲击后台DB,需采取诸如布隆过滤器等预筛选手段来降低查询压力。 #### 3. 关键问题及应对措施 以下是几种典型场景下的解决方案: - **缓存穿透** 当不存在的目标对象被频繁尝试获取时会发生此现象。可以通过引入布隆过滤器提前拦截非法请求,从而保护下游系统免受无效调用的影响。 - **缓存雪崩** 如果大量热门条目几乎同时过期,则可能引发瞬时流量高峰压垮后端服务器。为此建议设置随机化的TTL值或者采用异步刷新机制预先填充即将到期的内容。 - **热点Key重建失败** 针对特别活跃却容易丢失的信息单元,应该建立专门的任务队列来进行优先恢复;另外还可以考虑部署带有备用副本的集群模式以增强可用性。 - **数据库双写一致性维护** 在更新记录的同时同步修改对应的高速缓冲区存在时间差风险。一种可行办法是先标记旧版本为不可见状态再执行后续动作,并借助消息中间件协调两者的变更流程。 #### 4. 性能考量因素 除了上述提到的技术要点之外,还需要关注以下几个方面来进一步提升整体表现: - 合理分配各级别的容量配额; - 定义清晰的淘汰算法比如LRU/LFU; - 调整网络参数优化传输效率; - 应用压缩技术节省空间占用等等。 ```python import redis from caffeine import Cache local_cache = Cache() distributed_redis_client = redis.StrictRedis(host='localhost', port=6379, db=0) def get_data(key): value = local_cache.get_if_present(key) if not value: value = distributed_redis_client.get(key) if value is None: # Fallback to DB and populate caches accordingly. pass else: local_cache.put(key, value.decode('utf-8')) return value def set_data(key, value): success = distributed_redis_client.set(key, value) if success: local_cache.invalidate(key) # Invalidate stale entry immediately after update. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值