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、模拟测试
启动服务后,直接调用删除用户接口,可以看到,监听逻辑中收到了一条消息,然后调用本地缓存工具类删除本地缓存即可
文章插图
文章插图
六、解决方案四:使用消息队列实现缓存同步
了解了redis发布订阅这种方式实现原理后,如果再更换为消息中间件来实现就不难理解了,其实现的大致思路如下:
- 调用删除接口删除用户;
- 向特定的队列推送一条删除消息;
- 在消息监听逻辑中接收消息,并清理本地缓存
以rabbitmq为例,其核心实现如下:
@RabbitHandlerpublic void process(String msg) {System.out.println("topicMessageReceiver 接收到了消息 : " +msg);//执行本地缓存的删除操作关于rabbitmq的相关实现感兴趣的同学可以参考:rabbbitmq 技术全解
七、总结关于后3三种的实现,不仅可以解决缓存一致性问题,同时适用于分布式应用的场景,算是比较通用的解决方案,但这样一来,引入了第三方组件,也增加了系统整体的复杂性,这一点需要在架构设计中进行综合考量,结合小编本人的一些实践经验,比较推荐使用redis的发布订阅模式,这种方式简单高效,同时兼顾了避免引入更多的外部组件,可酌情参考 。【springboot 缓存一致性常用解决方案】
推荐阅读
- AMD|AMD RX 7000显卡最终规格定了!无限缓存缩水一半
- AMD|100MB缓存天下无敌!AMD锐龙7 5800X3D要第一次大降价
- SpringBoot的六边形架构案例
- AMD|AMD Zen4三级缓存带宽暴涨近60%:最多3倍碾压12代酷睿
- 「SpringBoot」 Java中如何封装Http请求
- 教你怎么清除浏览器缓存 如何删除浏览器缓存
- iPhone正确清理缓存的方法 苹果手机如何删除
- 深入浅出理解分布式一致性Paxos算法
- 如何保证数据库与缓存数据一致性?
- springboot 外部配置文件的引入
