在本地缓存解决方案中,Caffeine是常见的选择,它具备自动刷新机制——我们可以设置一个刷新间隔(比如30秒),让缓存定期从Redis同步数据。不过在这种机制下,刷新时间窗口内依然会存在数据不一致的情况。如果业务场景对数据的强一致性要求不高,那么这种方案值得考虑,因为它实现起来非常简单,不需要额外开发数据一致性的功能。
高并发场景下,我们通常依赖Redis来抵御流量冲击。但众所周知,Redis单实例的写入瓶颈约在2万/秒左右,读取瓶颈约10万/秒,当并发量超过这个范围时,单一Redis实例就无法支撑了。因此我们引入多级缓存架构来应对,如下图所示的多级缓存原理:
图片
在多级缓存架构中,如果应用部署在多台服务器上,本地缓存就会存在多份,如何确保这些本地缓存数据的一致性呢?下面我们介绍几种常用的保证本地缓存数据一致性的方案。
1、MQ同步方案
图片
当数据库数据完成同步到Redis后,系统会发送一条MQ消息用于清理本地缓存数据。此时每个部署了本地缓存的应用服务在接收到MQ消息后,都会处理本地的缓存数据,从而实现数据的最终一致性。
MQ同步方案是企业级开发中确保多级缓存数据最终一致性使用最广泛的方案,因为它能够快速同步数据;同时MQ可以保证所有节点都能收到消息通知,进而处理本地缓存数据。不过这种方案需要引入第三方MQ组件,增加了系统复杂度,而且对于实时性要求高的场景并不适用。
2、采用Redis的订阅/发布同步方案
图片
Redis本身就具备订阅/发布功能,我们可以利用这个功能来替代MQ组件。采用Redis订阅/发布的方案不仅实现简单(直接使用Redis原生功能),而且更加轻量,不需要依赖第三方MQ组件。
不过Redis订阅/发布方案的缺点也比较明显:一方面是可靠性不如MQ方案(订阅者离线时会丢失消息),另一方面是消息不做持久化保存。因此这种方案一般不推荐使用。
3、版本号校验方案
图片
在本
