当前位置: 首页 > news >正文

温州 建网站的公司 新上海排名优化推广工具

温州 建网站的公司 新,上海排名优化推广工具,我想在购物网站做代理,做电子芯片的有那些交易网站RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战,文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能,但是可能会出现缓存一致性问题。如果数据频繁的变更,可能会导…

Redis+Caffeine 多级缓存数据一致性解决方案

背景

之前写过一篇文章Redis+Caffeine 实现两级缓存实战,文章提到了两级缓存Redis+Caffeine可以解决缓存雪等问题也可以提高接口的性能,但是可能会出现缓存一致性问题。如果数据频繁的变更,可能会导致Redis和Caffeine数据不一致的问题。

最近正好学习了一个项目,项目里也用到的Redis+Caffeine实现多级缓存,并且在项目中给出了解决多级缓存数据不一致问题的解决方案,今天正好给大家分享一下。

问题分析

通过Redis+Caffeine,似乎可以完成一级、二级缓存中数据的同步,如果在单节点项目中是没有问题的,但是,在分布式场景下是有问题的,看下图:

在这里插入图片描述

说明:

  • 部署了2个transport-info微服务节点,每个微服务都有自己进程级的一级缓存,都共享同一个Redis作为二级缓存
  • 假设,所有节点的一级和二级缓存都是空的,此时,用户通过节点1查询运单物流信息,在完成后,节点1的caffeine和Redis中都会有数据
  • 接着,系统通过节点2更新了数据,此时节点2中的caffeine和Redis都是更新后的数据
  • 用户还是进行查询动作,依然是通过节点1查询,此时查询到的将是旧的数据,也就是出现了一级缓存与二级缓存之间的数据不一致的问题

解决方案

如何解决该问题呢?可以通过消息的方式解决,就是任意一个节点数据更新了数据,发个消息出来,通知其他节点,其他节点接收到消息后,将自己caffeine中相应的数据删除即可。

关于消息的实现,可以采用RabbitMQ,也可以采用Redis的消息订阅发布来实现,在这里为了应用技术的多样化,所以采用Redis的订阅发布来实现。

方案概述

在这里插入图片描述

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

在这里插入图片描述

当有新消息通过 publish 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端。

Redis的订阅发布功能与传统的消息中间件(如:RabbitMQ)相比,相对轻量一些,针对数据准确和安全性要求没有那么高的场景可以直接使用。

代码实现

  • 在RedisConfig增加订阅的配置:
	/*** 配置订阅,用于解决Caffeine一致性的问题** @param connectionFactory 链接工厂* @param listenerAdapter 消息监听器* @return 消息监听容器*/@Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.addMessageListener(listenerAdapter, new ChannelTopic(CHANNEL_TOPIC));return container;}
  • 编写RedisMessageListener用于监听消息,删除caffeine中的数据。
/*** redis消息监听,解决Caffeine一致性的问题*/
@Slf4j
@Component
public class RedisMessageListener extends MessageListenerAdapter {@Resourceprivate Cache<String, TransportInfoDTO> transportInfoCache;@Overridepublic void onMessage(Message message, byte[] pattern) {// 获取到消息中的运单idString transportOrderId = Convert.toStr(message);log.info("redis消息监听缓存变更,运单id:{}", transportOrderId);// 将本jvm中的缓存删除掉this.transportInfoCache.invalidate(transportOrderId);}
}
  • 更新数据后向redis发送消息:
    @Resourceprivate StringRedisTemplate stringRedisTemplate;@Override@CachePut(value = "transport-info", key = "#p0")public TransportInfoEntity saveOrUpdate(String transportOrderId, TransportInfoDetail infoDetail) {// 省略代码// 清除缓存中的数据// this.transportInfoCache.invalidate(transportOrderId);// Caffeine本地缓存一致性,发布订阅消息到redis,通知订阅者更新缓存this.stringRedisTemplate.convertAndSend(RedisConfig.CHANNEL_TOPIC, transportOrderId);// 保存/更新到MongoDBreturn this.mongoTemplate.save(transportInfoEntity);}

总结

本文主要讲解了在使用Redis和Caffeine多级缓存时使用Redis的发布订阅模式来保证两级缓存的数据一致性。本地缓存是基于服务本地内存的,分布式系统中当缓存更新时,可能造成多个实例间的本地缓存不一致问题。可以使用RabbitMQ或者Redis的发布订阅来解决本地缓存不一致的问题。

http://www.hengruixuexiao.com/news/44738.html

相关文章:

  • 响应式网站是个坑免费自媒体网站
  • 影视文化网站建设网站搜索引擎优化诊断
  • 可以做卷子的网站网站推广排名
  • 做视频网站用什么云盘好创建网址快捷方式
  • 设计师网页设计寄生虫seo教程
  • 做网站0基础写代码百度快照没有了用什么代替了
  • 知名网站制作公司seo排名第一
  • 电脑销售网站开发论文百度竞价排名服务
  • 南京电子商务网站建设招商外包
  • 公司做网站应记入哪个会计科目个人网站设计欣赏
  • 北湖区网站建设哪个好湖南优化电商服务有限公司
  • 南京产品网站建设收费百度推广费用怎么算
  • 旅游网站建设和实现软文代写平台有哪些
  • 广东网站建设加工黄石seo诊断
  • 做煤的网站app全球疫情最新数据
  • 哪个网站可以接程序项目来做网站测速工具
  • 如何建立一个购物网站冯站长之家
  • 济南网站优化seo竞价托管 微竞价
  • 林业局网站建设方案网站seo诊断报告
  • 维护网站费用怎么做会计凭证广告联盟有哪些平台
  • wordpress 测试北京seo案例
  • 贵阳网站建设制作公司泰州网站建设优化
  • 温州建设网站培训机构如何招生营销
  • discuz网站开发百度首页优化排名
  • 网站制作上海市百度搜索推广登录入口
  • 专业网站建设是哪家好天津百度推广开户
  • 关于旅行的网站怎样做网页开发公司
  • 山东青岛网站建设公司排名营销做得好的品牌
  • 手机图片编辑器广州网站优化价格
  • 织梦网站后台模版更换注册网站流程