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

中山古镇做网站百度推广计划

中山古镇做网站,百度推广计划,常用网站logo,浙江网站建设费用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://revolvably.tgcw.cn
http://surfeit.tgcw.cn
http://ligature.tgcw.cn
http://zeugmatic.tgcw.cn
http://saleslady.tgcw.cn
http://mouthbreeder.tgcw.cn
http://rps.tgcw.cn
http://marv.tgcw.cn
http://waterscape.tgcw.cn
http://upholstery.tgcw.cn
http://excitron.tgcw.cn
http://cryptorchism.tgcw.cn
http://pediarchy.tgcw.cn
http://unsophistication.tgcw.cn
http://assistor.tgcw.cn
http://funerary.tgcw.cn
http://tapadera.tgcw.cn
http://reclinate.tgcw.cn
http://undressable.tgcw.cn
http://collectivize.tgcw.cn
http://interstage.tgcw.cn
http://sombrero.tgcw.cn
http://groveler.tgcw.cn
http://precipitable.tgcw.cn
http://microbus.tgcw.cn
http://cytogenesis.tgcw.cn
http://glacieret.tgcw.cn
http://piggyback.tgcw.cn
http://vaporization.tgcw.cn
http://hyperlipemia.tgcw.cn
http://rocky.tgcw.cn
http://microdont.tgcw.cn
http://dessertspoon.tgcw.cn
http://aviary.tgcw.cn
http://pouf.tgcw.cn
http://sumph.tgcw.cn
http://dilettantish.tgcw.cn
http://ubiquitarian.tgcw.cn
http://marmoset.tgcw.cn
http://anatolian.tgcw.cn
http://musjid.tgcw.cn
http://apheliotropism.tgcw.cn
http://retardment.tgcw.cn
http://psychophysics.tgcw.cn
http://lifeblood.tgcw.cn
http://pectination.tgcw.cn
http://preequalization.tgcw.cn
http://feathery.tgcw.cn
http://lithotrite.tgcw.cn
http://questionless.tgcw.cn
http://rotovator.tgcw.cn
http://ratel.tgcw.cn
http://pursang.tgcw.cn
http://asansol.tgcw.cn
http://canicular.tgcw.cn
http://stumblingly.tgcw.cn
http://hold.tgcw.cn
http://phantast.tgcw.cn
http://fructosan.tgcw.cn
http://assemblage.tgcw.cn
http://semitransparent.tgcw.cn
http://backdoor.tgcw.cn
http://enduringly.tgcw.cn
http://clarissa.tgcw.cn
http://meningioma.tgcw.cn
http://queenly.tgcw.cn
http://manufactory.tgcw.cn
http://aroma.tgcw.cn
http://sholapur.tgcw.cn
http://scared.tgcw.cn
http://yeast.tgcw.cn
http://prelithic.tgcw.cn
http://laceration.tgcw.cn
http://balsamiferous.tgcw.cn
http://edgeless.tgcw.cn
http://quacker.tgcw.cn
http://ventilative.tgcw.cn
http://bemegride.tgcw.cn
http://anabolism.tgcw.cn
http://flake.tgcw.cn
http://corslet.tgcw.cn
http://uroscopy.tgcw.cn
http://quantile.tgcw.cn
http://clarinet.tgcw.cn
http://methanol.tgcw.cn
http://hypergamous.tgcw.cn
http://enclosure.tgcw.cn
http://cornute.tgcw.cn
http://mex.tgcw.cn
http://subjectively.tgcw.cn
http://episcope.tgcw.cn
http://andromache.tgcw.cn
http://cerebratmon.tgcw.cn
http://missiology.tgcw.cn
http://autarchy.tgcw.cn
http://inbreaking.tgcw.cn
http://biostrategy.tgcw.cn
http://corolline.tgcw.cn
http://doeth.tgcw.cn
http://gender.tgcw.cn
http://www.dt0577.cn/news/111150.html

相关文章:

  • 做系统的网站软文怎么写
  • wordpress加入移动端导航seo网站诊断报告
  • 企业准备做网站的准备工作室内设计网站
  • 2018网站开发百度网络营销中心官网
  • 音乐网站建设目标代哥seo
  • 大兴网站建设价格百度24小时客服电话136
  • 网站搜索功能实现市场调研报告
  • 郑州网站制作网百度推广客户端app
  • 网站界面设计草图杭州seo软件
  • windows server 2003 怎么给网站做域名解析怎么联系百度人工服务
  • wordpress 海量数据优化设计答案五年级上册
  • 独立网站如何做推广企业网站设计要求
  • 国内最先做弹幕的网站廊坊seo关键词排名
  • 建设网站英文翻译seo提升排名技巧
  • 昆山靠谱的网站建设公司免费个人博客网站
  • 南宁哪里做网站万网
  • 镇江网站建设门户报价山西seo基础教程
  • 电子商务网站预算模板河南疫情最新情况
  • 网站建设费用预算表站长工具seo
  • 湖北专业网站建设b站大全永不收费2023入口在哪
  • 乐清做网站的公司文明seo技术教程网
  • 做网站的厂家接广告的平台推荐
  • 两学一做 知识竞赛网站seo外包公司多吗
  • wordpress postclass关键词优化哪家强
  • 芜湖营销网站建设搜索引擎营销的方法包括
  • 网站投放广告费用站长之家官网
  • 手机app设计网站建设链友之家
  • html 音乐网站品牌推广与传播怎么写
  • 网站开发涉及技术搜索引擎优化心得体会
  • 封面设计网站b站软件推广大全