springboot 缓存一致性常用解决方案( 五 )

6、RedisMessageListener 改造
添加删除本地缓存逻辑
@Overridepublic void onMessage(Message message, byte[] pattern) {CaffeineCacheUtils caffeineCacheUtils = new CaffeineCacheUtils();// 获取消息byte[] messageBody = message.getBody();// 使用值序列化器转换Object msg = redisTemplate.getValueSerializer().deserialize(messageBody);// 获取监听的频道byte[] channelByte = message.getChannel();// 使用字符串序列化器转换Object channel = redisTemplate.getStringSerializer().deserialize(channelByte);// 渠道名称转换String patternStr = new String(pattern);System.out.println(patternStr);System.out.println("---频道---: " + channel);System.out.println("---消息内容---: " + msg);caffeineCacheUtils.evict("dbUser",patternStr);7、模拟测试
启动服务后,直接调用删除用户接口,可以看到,监听逻辑中收到了一条消息,然后调用本地缓存工具类删除本地缓存即可

springboot 缓存一致性常用解决方案

文章插图
 
springboot 缓存一致性常用解决方案

文章插图
 
六、解决方案四:使用消息队列实现缓存同步
了解了redis发布订阅这种方式实现原理后,如果再更换为消息中间件来实现就不难理解了,其实现的大致思路如下:
 
  1. 调用删除接口删除用户;
  2. 向特定的队列推送一条删除消息;
  3. 在消息监听逻辑中接收消息,并清理本地缓存
 
以rabbitmq为例,其核心实现如下:
@RabbitHandlerpublic void process(String msg) {System.out.println("topicMessageReceiver 接收到了消息 : " +msg);//执行本地缓存的删除操作
关于rabbitmq的相关实现感兴趣的同学可以参考:rabbbitmq 技术全解
七、总结
关于后3三种的实现,不仅可以解决缓存一致性问题,同时适用于分布式应用的场景,算是比较通用的解决方案,但这样一来,引入了第三方组件,也增加了系统整体的复杂性,这一点需要在架构设计中进行综合考量,结合小编本人的一些实践经验,比较推荐使用redis的发布订阅模式,这种方式简单高效,同时兼顾了避免引入更多的外部组件,可酌情参考 。

【springboot 缓存一致性常用解决方案】


推荐阅读