it编程 > 数据库 > Redis

监听Redis实时数据变化实现过程

11人参与 2025-10-22 Redis

前言

监听redis的value实时变化。

一、实现思路

最简单粗暴的方式,首先遍历一遍数据存到map,然后不断遍历redis判断value是否跟已有的map值相等即可。

二、实现步骤

1. 定义缓存map

假设需要监听数据key前缀为aaa,创建定时调度服务:

private static final map<string, string> last_values = new concurrenthashmap<>();
private static final string key_prefix = "aaa";
private scheduledexecutorservice scheduler;

2. 入口方法

使用@postconstruct注解执行初始化:

    @postconstruct
    public void init() {
        // 异步加载所有键值,不阻塞启动
        completablefuture.runasync(this::loadinitialvalues);

        // 每5秒扫描一次
        scheduler = executors.newsinglethreadscheduledexecutor();
        scheduler.scheduleatfixedrate(this::scanchanges, 0, 5, timeunit.seconds);
    }

3. 初始化

使用jedis创建连接,定义扫描参数,使用redis的scan命令遍历所有的匹配"aaa"+ "*"模式的键,游标从0开始,使用do-while,返回为0表示迭代结束,将所有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. 扫描变更数据

判断新旧数据是否一致,不一致则通过自定义方法处理数据:

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 {
                            //处理数据
                            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);
        }
    }

总结

本文介绍了最简单的监听redis中value值的变化方法,还可以设置redis keyspace 通知监听。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

查看tomcat并发连接数实现方式

10-21

Nginx 基本使用和高级用法示例详解

10-21

Redis搭建一主多从的实现步骤

10-23

Redis集群数据清理的操作指南

10-21

Redis设置开机自启动全过程

10-24

Redis中Lua脚本的常见场景

10-20

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论