服务端缓存思考

本文讨论了服务端缓存的设计,包括LocalCache和分布式Cache(如Redis)。缓存主要用于存储热点key,减轻DB压力,提高服务响应速度。文章提到了缓存穿透和雪崩问题,以及对应的解决方案。对于缓存穿透,建议使用非法key LocalCache来临时存储,避免流量直接打到DB。而面对缓存雪崩,可以通过设置分布式配置开关,及时限流和调整LocalCache超时时间来缓解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存设计

首先缓存设计。我们怎么设计一套缓存呢。大致的套路基本上都是一个LocalCache,一个分布式Cache (Redis) ,大体的架构图将像下面所示。

LocalCache Redis DB kafka LocalCache Miss 访问Redis,拿到了key Redis Miss Key 访问DB 获取数据 将DB数据更新到Redis中 消费类似Binlog的文件,将更新key写到kafka集群 Local Cache 的后台线程消费kafka 将DB 更新的key 写到 LocalCache 和 Redis LocalCache Redis DB kafka

缓存前提

缓存主要来缓存热点的key。所以有热key才行,但是基本上对于一般的app,活跃用户基本在固定的人群,所以大部分这个套路都是有用的。但是缓存不是DB,它的定位是热点数据而不是全量数据,所以一般100GB 足以。

缓存好处

好处就是将DB的压力转化到了Redis上,这样可以降低服务的延时,降低DB的压力。

缓存穿透

缓存穿透指的是有相关的非法key导致 分布式缓存根本没有命中这个key,这个时候大量的流量打到了DB。对于缓存穿透在工作中我碰到了一个case,db 下游返回了一个非法的数据,因为是非法的数据后,应用没有把它写到Redis 和 LocalCache中。导致每次这个key 的请求都会穿透到DB ,导致DB 压力变大。
个人理解为了处理缓存穿透,这里需要对非法key进行处理。可以建立一个非法key的LocalCache,这个非法LocalCache的每个key的超时时间要尽可能的小比如10s,20s。这个时候我们从Redis Miss 后先去 非法Cache 检查一遍,没有的话再去读db。

缓存雪崩

缓存雪崩指线上服务有大量的key Miss,这个时候导致大量的流量打到DB。
雪崩发生可能的场景

  1. Redis集群大量的服务挂了
  2. DB 大量的服务挂了,这个时候大多数 Redis key Miss 后,会有大量的流量打到DB。

第二个case,我遇到过有一次下游DB服务做了相关服务鉴权方面的事情,这个时候线上服务打到DB后连接被拒绝掉。这个时候如果没及时发现,等Redis的大量key超时后,就会发生雪崩
针对缓存血崩我个人感觉处理的方法步骤如下:

  1. 设置一个分布式的配置key 写到 etcd 里面 或者 zk 里面。如果及时发现的话,开启开关。这个时候服务将不再访问访问下游,并且这个时候将LocalCache超时时间设置为永久或者很长时间。
  2. 及时限流,丢弃大部分对下游的请求流量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值