在业务开发过程中,对于数量较少且访问频繁的数据,需要使用本地缓存;对于本地缓存的失效策略,通常是超时被动失效;然后再次访问时,通过回表,reload数据,将最新版本的数据更新至缓存中;
但是在某些场景下,需要主动刷新缓存中的内容(失效或者刷新),虽然我们可以通过设置较短的过期时间达到相同的目的,但是开销相对较高;如何实现类似于分布式缓存监听MQ消息,及时失效缓存呢?
类比分布式缓存的解决方案在分布式缓存中,我们通常采用的是监听消息队列及时失效缓存;多实例服务的任一实例,监听到消息后及时更新缓存,其他实例也能读取到最新的数据;但是对于本地缓存就大不一样,每个实例在自己的内存维护一份数据,当消息被其中一个实例消费后,就无法被其他实例感知到,所以需要解决一条消息如何被多实例消费的问题;
本地缓存主动失效策略 a
本地缓存主动失效策略 b
在这个方案中,存在两种角色,本地缓存MQ适配器和本地缓存MQ处理器;
适配器:将MQ消息转发成多实例消息,发送至处理器监听的MQ中;
处理器:调用指定服务缓存更新接口,更新本地缓存;
这种方案存在的问题是
- 服务的实例可能发生宕机或者其他特殊情况,指定ip进行调用时可能出现调用失败的情况,需要存在重试机制,保证服务重新连接后能正常更新缓存;
- 无论是策略a还是策略b都存在放大效应,M条消息最终会产生M*N次调用,同时本地缓存实现方需要实现特定的缓存失效接口,接入成本较高;
鉴于上面的方案存在种种问题,所以需要采用一种更佳的方案,实现本地缓存的及时失效;目前市面上的配置中心都有推送的功能,对于配置发生变化时,可以及时地推送至所有实例中,因此,可以采用对配置中心指定key进行写操作,然后监听key进行缓存的失效;
读写配置中心失效本地缓存
该方案仅适用于支持推送的配置中心,对于只支持定时拉取的配置中心,此方案的更新时间可能存在一定的延迟,效果未必优于定时任务主动失效缓存;
,