最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis+Caffeine多級(jí)緩存數(shù)據(jù)一致性解決方案

 更新時(shí)間:2024年12月04日 11:53:05   作者:YAnalytics  
兩級(jí)緩存Redis+Caffeine可以解決緩存雪等問題也可以提高接口的性能,但是可能會(huì)出現(xiàn)緩存一致性問題,如果數(shù)據(jù)頻繁的變更,可能會(huì)導(dǎo)致Redis和Caffeine數(shù)據(jù)不一致的問題,所以本文給大家介紹了Redis+Caffeine多級(jí)緩存數(shù)據(jù)一致性解決方案,需要的朋友可以參考下

問題分析

通過Redis+Caffeine,似乎可以完成一級(jí)、二級(jí)緩存中數(shù)據(jù)的同步,如果在單節(jié)點(diǎn)項(xiàng)目中是沒有問題的,但是,在分布式場(chǎng)景下是有問題的,看下圖:

說明:

  • 部署了2個(gè)transport-info微服務(wù)節(jié)點(diǎn),每個(gè)微服務(wù)都有自己進(jìn)程級(jí)的一級(jí)緩存,都共享同一個(gè)Redis作為二級(jí)緩存
  • 假設(shè),所有節(jié)點(diǎn)的一級(jí)和二級(jí)緩存都是空的,此時(shí),用戶通過節(jié)點(diǎn)1查詢運(yùn)單物流信息,在完成后,節(jié)點(diǎn)1的caffeine和Redis中都會(huì)有數(shù)據(jù)
  • 接著,系統(tǒng)通過節(jié)點(diǎn)2更新了數(shù)據(jù),此時(shí)節(jié)點(diǎn)2中的caffeine和Redis都是更新后的數(shù)據(jù)
  • 用戶還是進(jìn)行查詢動(dòng)作,依然是通過節(jié)點(diǎn)1查詢,此時(shí)查詢到的將是舊的數(shù)據(jù),也就是出現(xiàn)了一級(jí)緩存與二級(jí)緩存之間的數(shù)據(jù)不一致的問題

解決方案

如何解決該問題呢?可以通過消息的方式解決,就是任意一個(gè)節(jié)點(diǎn)數(shù)據(jù)更新了數(shù)據(jù),發(fā)個(gè)消息出來,通知其他節(jié)點(diǎn),其他節(jié)點(diǎn)接收到消息后,將自己caffeine中相應(yīng)的數(shù)據(jù)刪除即可。

關(guān)于消息的實(shí)現(xiàn),可以采用RabbitMQ,也可以采用Redis的消息訂閱發(fā)布來實(shí)現(xiàn),在這里為了應(yīng)用技術(shù)的多樣化,所以采用Redis的訂閱發(fā)布來實(shí)現(xiàn)。

方案概述

Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息

當(dāng)有新消息通過 publish 命令發(fā)送給頻道 channel1 時(shí), 這個(gè)消息就會(huì)被發(fā)送給訂閱它的三個(gè)客戶端。

Redis的訂閱發(fā)布功能與傳統(tǒng)的消息中間件(如:RabbitMQ)相比,相對(duì)輕量一些,針對(duì)數(shù)據(jù)準(zhǔn)確和安全性要求沒有那么高的場(chǎng)景可以直接使用。

代碼實(shí)現(xiàn)

  • 在RedisConfig增加訂閱的配置:
	/**
     * 配置訂閱,用于解決Caffeine一致性的問題
     *
     * @param connectionFactory 鏈接工廠
     * @param listenerAdapter 消息監(jiān)聽器
     * @return 消息監(jiān)聽容器
     */
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                   MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new ChannelTopic(CHANNEL_TOPIC));
        return container;
    }
  • 編寫RedisMessageListener用于監(jiān)聽消息,刪除caffeine中的數(shù)據(jù)。
/**
 * redis消息監(jiān)聽,解決Caffeine一致性的問題
 */
@Slf4j
@Component
public class RedisMessageListener extends MessageListenerAdapter {

    @Resource
    private Cache<String, TransportInfoDTO> transportInfoCache;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 獲取到消息中的運(yùn)單id
        String transportOrderId = Convert.toStr(message);
        log.info("redis消息監(jiān)聽緩存變更,運(yùn)單id:{}", transportOrderId);
        // 將本jvm中的緩存刪除掉
        this.transportInfoCache.invalidate(transportOrderId);
    }
}
  • 更新數(shù)據(jù)后向redis發(fā)送消息:
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    @CachePut(value = "transport-info", key = "#p0")
    public TransportInfoEntity saveOrUpdate(String transportOrderId, TransportInfoDetail infoDetail) {
		// 省略代碼
 
        // 清除緩存中的數(shù)據(jù)
        // this.transportInfoCache.invalidate(transportOrderId);
        // Caffeine本地緩存一致性,發(fā)布訂閱消息到redis,通知訂閱者更新緩存
        this.stringRedisTemplate.convertAndSend(RedisConfig.CHANNEL_TOPIC, transportOrderId);
        // 保存/更新到MongoDB
        return this.mongoTemplate.save(transportInfoEntity);
    }

總結(jié)

本文主要講解了在使用Redis和Caffeine多級(jí)緩存時(shí)使用Redis的發(fā)布訂閱模式來保證兩級(jí)緩存的數(shù)據(jù)一致性。本地緩存是基于服務(wù)本地內(nèi)存的,分布式系統(tǒng)中當(dāng)緩存更新時(shí),可能造成多個(gè)實(shí)例間的本地緩存不一致問題??梢允褂肦abbitMQ或者Redis的發(fā)布訂閱來解決本地緩存不一致的問題。

以上就是Redis+Caffeine多級(jí)緩存數(shù)據(jù)一致性解決方案的詳細(xì)內(nèi)容,更多關(guān)于Redis Caffeine緩存數(shù)據(jù)一致性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Redis使用認(rèn)證密碼登錄

    詳解Redis使用認(rèn)證密碼登錄

    本篇文章主要介紹了詳解Redis使用認(rèn)證密碼登錄 。啟用Redis的認(rèn)證密碼可以增加Redis服務(wù)器的安全性。有興趣的可以了解下
    2017-06-06
  • Redis哨兵模式實(shí)現(xiàn)一主二從三哨兵

    Redis哨兵模式實(shí)現(xiàn)一主二從三哨兵

    本文主要介紹了Redis哨兵模式實(shí)現(xiàn)一主二從三哨兵,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis實(shí)現(xiàn)短信登錄的企業(yè)實(shí)戰(zhàn)

    Redis實(shí)現(xiàn)短信登錄的企業(yè)實(shí)戰(zhàn)

    本文主要介紹了Redis實(shí)現(xiàn)短信登錄的企業(yè)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 淺析Redis?切片集群的數(shù)據(jù)傾斜問題

    淺析Redis?切片集群的數(shù)據(jù)傾斜問題

    如果?Redis?中的部署,采用的是切片集群,數(shù)據(jù)是會(huì)按照一定的規(guī)則分散到不同的實(shí)例中保存,比如,使用?Redis?Cluster?或?Codis,這篇文章主要介紹了Redis?切片集群的數(shù)據(jù)傾斜分析,需要的朋友可以參考下
    2022-06-06
  • Redis中redis-shake實(shí)現(xiàn)數(shù)據(jù)遷移同步

    Redis中redis-shake實(shí)現(xiàn)數(shù)據(jù)遷移同步

    在業(yè)務(wù)環(huán)境中使用Redis進(jìn)行跨區(qū)域數(shù)據(jù)遷移和同步的挑戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Linux中設(shè)置Redis開機(jī)啟動(dòng)的方法

    Linux中設(shè)置Redis開機(jī)啟動(dòng)的方法

    這篇文章主要給大家介紹了關(guān)于Linux中設(shè)置Redis開機(jī)啟動(dòng)的方法,主要包括在CentOS7.0系統(tǒng)和Debian 8.0系統(tǒng)下實(shí)現(xiàn)方法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Redis教程(十五):C語言連接操作代碼實(shí)例

    Redis教程(十五):C語言連接操作代碼實(shí)例

    這篇文章主要介紹了Redis教程(十五):C語言連接操作代碼實(shí)例,本篇博客是該系列博客中的最后一篇,在這里將給出基于Redis客戶端組件訪問并操作Redis服務(wù)器的代碼示例,需要的朋友可以參考下
    2015-05-05
  • Redis?布隆過濾器命令的使用詳解

    Redis?布隆過濾器命令的使用詳解

    這篇文章主要介紹了Redis?布隆過濾器的相關(guān)命令的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Redis實(shí)現(xiàn)多級(jí)緩存

    Redis實(shí)現(xiàn)多級(jí)緩存

    這篇文章主要為大家詳細(xì)介紹了Redis實(shí)現(xiàn)多級(jí)緩存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Redis可視化工具Redis?Desktop?Manager的具體使用

    Redis可視化工具Redis?Desktop?Manager的具體使用

    本文主要介紹了Redis可視化工具Redis?Desktop?Manager的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論

泊头市| 望奎县| 新化县| 高唐县| 仙桃市| 成都市| 石家庄市| 商洛市| 揭东县| 崇阳县| 迁安市| 镇巴县| 建阳市| 浮山县| 资兴市| 新疆| 镇江市| 康定县| 交城县| 清镇市| 南木林县| 温泉县| 维西| 乐陵市| 莱西市| 塘沽区| 甘泉县| 富平县| 绥德县| 留坝县| 沈丘县| 淮安市| 梅河口市| 大厂| 右玉县| 金寨县| 枝江市| 闽清县| 鄄城县| 革吉县| 且末县|