当前位置: 代码网 > it编程>数据库>Redis > 监听Redis实时数据变化实现过程

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

2025年10月22日 Redis 我要评论
前言监听redis的value实时变化。一、实现思路最简单粗暴的方式,首先遍历一遍数据存到map,然后不断遍历redis判断value是否跟已有的map值相等即可。二、实现步骤1. 定义缓存map假设

前言

监听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)

相关文章:

  • Redis批量查询的四种方式详解

    引言在高并发场景下,巧妙地利用缓存批量查询技巧能够显著提高系统性能。在笔者看来,熟练掌握细粒度的缓存使用是每位架构师必备的技能。因此,在本文中,我们将深入探讨 redis 中批量查…

    2025年10月16日 数据库
  • Redis主从+哨兵集群部署详解

    Redis主从+哨兵集群部署详解

    一、 哨兵模式介绍在一主多从的 redis 架构中,从节点可以起到数据冗余备份和读写分离的作用。如果主节点遇到故障导致无法提供服务时,可以采用手动方式将其一个从... [阅读全文]
  • Redis中的配置与优化过程

    Redis中的配置与优化过程

    一、 redis 介绍1. 关系型数据库与非关系型数据库数据库按照数据库的结构可以分为关系型数据库与其他数据库,而这些其他数据库我们将其统称为非关系型数据库。(... [阅读全文]
  • redis的主从模式复制的具体步骤

    redis的主从模式复制的具体步骤

    在分布式系统中,希望使用多个服务器来部署redis,存在以下几种redis的部署方式:1.主从模式 2.主从模式+哨兵模式 3.集群模式主从模式的优点:可以实现... [阅读全文]
  • Nginx分布式部署流程分析

    Nginx分布式部署流程分析

    分布式部署分布式部署也叫集群或机群(多台电脑整合在一起,都运行相同的项目)。nginxnginx是做代理的,且nginx是反向代理。(vpn是 正向代理)jav... [阅读全文]
  • Redis 实现消息队列实际案例

    Redis 实现消息队列实际案例

    一、为什么选择 redis 做消息队列?1.1 redis 消息队列的核心优势轻量级部署:无需单独部署 rabbitmq、kafka 等消息队列服务,可以直接复... [阅读全文]

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

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com