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

監(jiān)聽Redis實(shí)時(shí)數(shù)據(jù)變化實(shí)現(xiàn)過程

 更新時(shí)間:2025年10月22日 08:49:21   作者:有女孩說要娶我  
本文介紹了通過定時(shí)遍歷Redis并對(duì)比緩存Map,實(shí)現(xiàn)監(jiān)聽指定前綴鍵的value變化的方法,并簡(jiǎn)要提及了可用Keyspace通知等更高效的手段

前言

監(jiān)聽Redis的Value實(shí)時(shí)變化。

一、實(shí)現(xiàn)思路

最簡(jiǎn)單粗暴的方式,首先遍歷一遍數(shù)據(jù)存到map,然后不斷遍歷redis判斷value是否跟已有的map值相等即可。

二、實(shí)現(xiàn)步驟

1. 定義緩存Map

假設(shè)需要監(jiān)聽數(shù)據(jù)key前綴為aaa,創(chuàng)建定時(shí)調(diào)度服務(wù):

private static final Map<String, String> LAST_VALUES = new ConcurrentHashMap<>();
private static final String KEY_PREFIX = "aaa";
private ScheduledExecutorService scheduler;

2. 入口方法

使用@PostConstruct注解執(zhí)行初始化:

    @PostConstruct
    public void init() {
        // 異步加載所有鍵值,不阻塞啟動(dòng)
        CompletableFuture.runAsync(this::loadInitialValues);

        // 每5秒掃描一次
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(this::scanChanges, 0, 5, TimeUnit.SECONDS);
    }

3. 初始化

使用Jedis創(chuàng)建連接,定義掃描參數(shù),使用redis的scan命令遍歷所有的匹配"aaa"+ "*"模式的鍵,游標(biāo)從0開始,使用do-while,返回為0表示迭代結(jié)束,將所有value存到map:

private void loadInitialValues() {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            String cursor = "0";
            ScanParams params = new ScanParams().match(KEY_PREFIX  + "*").count(100);
            do {
                ScanResult<String> scanResult = jedis.scan(cursor, params);
                cursor = scanResult.getCursor();
                for (String key : scanResult.getResult()) {
                    String jsonString = jedis.get(key);
                    if (jsonString != null) {
                        LAST_VALUES.put(key, jsonString);
                    }
                }
            } while (!"0".equals(cursor));
            log.info("Loaded {} initial values from Redis.", LAST_VALUES.size());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

4. 掃描變更數(shù)據(jù)

判斷新舊數(shù)據(jù)是否一致,不一致則通過自定義方法處理數(shù)據(jù):

private void scanChanges() {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            String cursor = "0";
            ScanParams params = new ScanParams().match(KEY_PREFIX  + "*").count(100);

            do {
                ScanResult<String> scanResult = jedis.scan(cursor, params);
                cursor = scanResult.getCursor();

                for (String key : scanResult.getResult()) {
                    String currentValueStr = jedis.get(key);
                    String oldValueStr = LAST_VALUES.getOrDefault(key, null);
                    if (!Objects.equals(currentValueStr, oldValueStr)) {
                        try {
                            //處理數(shù)據(jù)
                            dealWithData(key, oldValueStr, currentValueStr );
                        lastValues.put(key, currentValue);
                            LAST_VALUES.put(key, currentValueStr);
                        } catch (Exception e) {
                            log.error("Failed to process data change for key: {}", key, e);
                        }
                    }
                }
            } while (!"0".equals(cursor));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

總結(jié)

本文介紹了最簡(jiǎn)單的監(jiān)聽Redis中value值的變化方法,還可以設(shè)置Redis Keyspace 通知監(jiān)聽。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過程解析

    redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過程解析

    本文主要記一次找因redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Redis處理MQ消費(fèi)冪等的實(shí)現(xiàn)示例

    Redis處理MQ消費(fèi)冪等的實(shí)現(xiàn)示例

    本文主要介紹了Redis處理MQ消費(fèi)冪等的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • redis中跳表zset的具體使用

    redis中跳表zset的具體使用

    Redis跳表zset是一種結(jié)合了跳表和有序集合的高效數(shù)據(jù)結(jié)構(gòu),適用于實(shí)現(xiàn)排序和大規(guī)模數(shù)據(jù)的快速查詢,本文主要介紹了redis中跳表zset的具體使用,感興趣的可以了解一下
    2024-01-01
  • Redis存儲(chǔ)的列表分頁和檢索的實(shí)現(xiàn)方法

    Redis存儲(chǔ)的列表分頁和檢索的實(shí)現(xiàn)方法

    在 Redis 中,列表(List)是一種有序的數(shù)據(jù)結(jié)構(gòu),通常用于存儲(chǔ)一系列元素,由于列表是有序的,可以通過索引來訪問元素,因此可以很方便地實(shí)現(xiàn)分頁和檢索功能,以下是 Redis 列表的分頁和檢索的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2025-02-02
  • 嵌入式Redis服務(wù)器在Spring Boot測(cè)試中的使用教程

    嵌入式Redis服務(wù)器在Spring Boot測(cè)試中的使用教程

    這篇文章主要介紹了嵌入式Redis服務(wù)器在Spring Boot測(cè)試中的使用,本文通過實(shí)例代碼場(chǎng)景分析給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • Redis源碼環(huán)境構(gòu)建過程詳解

    Redis源碼環(huán)境構(gòu)建過程詳解

    這篇文章主要介紹了Redis源碼環(huán)境構(gòu)建過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了redis安裝和配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 詳解Redis高效恢復(fù)策略內(nèi)存快照與AOF

    詳解Redis高效恢復(fù)策略內(nèi)存快照與AOF

    這篇文章主要為大家介紹了Redis高效恢復(fù)策略內(nèi)存快照與AOF及對(duì)比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 分布式爬蟲處理Redis里的數(shù)據(jù)操作步驟

    分布式爬蟲處理Redis里的數(shù)據(jù)操作步驟

    這篇文章主要介紹了分布式爬蟲處理Redis里的數(shù)據(jù)操作步驟,數(shù)據(jù)分別存入mongodb和mysql數(shù)據(jù)庫,具體內(nèi)容詳情及實(shí)例代碼大家參考下本文
    2018-03-03
  • Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用

    Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用

    本文主要介紹了Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

吴川市| 岳阳县| 横山县| 洛川县| 红安县| 泾源县| 东辽县| 土默特右旗| 通城县| 清徐县| 永吉县| 新绛县| 泗水县| 隆回县| 奇台县| 扎兰屯市| 梁山县| 合肥市| 昌图县| 象山县| 会昌县| 松原市| 监利县| 望江县| 黔东| 新野县| 高雄县| 大余县| 什邡市| 肇源县| 含山县| 雷山县| 原平市| 静海县| 达拉特旗| 山东省| 利川市| 衢州市| 新龙县| 五家渠市| 中江县|