当前位置: 代码网 > it编程>数据库>Redis > 使用Redis防止重复发送RabbitMQ消息的方法详解

使用Redis防止重复发送RabbitMQ消息的方法详解

2025年01月21日 Redis 我要评论
问题今天遇到一个问题,发送mq消息的时候需要保证不会重复发送,注意不是可靠到达(可靠到达可以通过消息确认机制和回调接口保证),这里保证的是不会生产多条一样的消息。方法综合讨论下来决定使用redis缓存

问题

今天遇到一个问题,发送mq消息的时候需要保证不会重复发送,注意不是可靠到达(可靠到达可以通过消息确认机制和回调接口保证),这里保证的是不会生产多条一样的消息。

方法

综合讨论下来决定使用redis缓存来解决,因为相比于将记录插入数据库redis更为高效和便捷。

检验是否已经发送

在发送消息之前根据相关信息组合成keyredis中查找,找到后检测值是否为存在并且是否为设定的值,若存在且与设定的值一样,则返回false,说明该消息已经发送过了。

    public boolean issend(string messagetype, long bizid, int hashcode) {
        // 根据消息类型、业务id和哈希值组合成key
        string key = this.genkey(messagetype, bizid, hashcode);
        long value = super.get(key);

        if (value != null && value.equals(default_value)) {
            return false;
        }

        return true;
    }
   
   /**get方法*/
    public v get(k key) {
        if (key == null) {
            return null;
        } else {
            try {
                // 在key前添加前缀和名字,并将原来的key进行json序列化
                string realkey = this.genrealkey(key);
                string content = (string)this.redistemplate.opsforvalue().get(realkey);
                // 若get到的值不为null则进行json反序列化
                return content == null ? null : this.valueserializer.deserialize(content);
            } catch (exception e) {
                cache.error("", key.tostring(), "", "0", e);
                return null;
            }
        }
    }

以上就是检验消息是否重复的方法,需要注意的是json序列化,因为redis默认使用的是jdk序列化,这种序列化后的内容不仅多而且不易于阅读,因此将其改为json序列化。

发送后添加缓存

在发送消息的时候会先在redis中put一个以相关信息组合为key,value为默认值的记录,过期时间为5min。

    public void sendmessage(string messagetype, long bizid, int hashcode) {
        super.put(genkey(messagetype, bizid, hashcode), default_value);
    }
    
    /**put方法*/
    public void put(k key, v value) {
        try {
            if (key != null && null != value) {
                // 进行json序列化
                string content = this.valueserializer.serialize(value);
                this.redistemplate.opsforvalue().set(this.genrealkey(key), content, this.expires, this.timeunit);
            }
        } catch (throwable e) {
            e.printstacktrace();
        }
    }

发送消息方法

最后的发送消息方法大致代码如下:

    public void sendmqmessage(long bizid, string messagetemplatecode, string msg, int msghashcode, string exchange, string routingkey) {
        //加入缓存
        boolean send = true;
        //string messagetype = messagetypeutil.getmessagetype(messagetemplatecode);
        if (bizid != null) {
            // 检测是否已经发送
            send = sendmessagecache.issend(messagetemplatecode, bizid, msghashcode);
        }

        //发送mq消息
        if (send) {
            if (bizid != null) {
                // 加入缓存
                sendmessagecache.sendmessage(messagetemplatecode, bizid, msghashcode);
            }
            // 发送消息
            messagesender.send(exchange, routingkey, msg);
        }
    }

到此这篇关于使用redis防止重复发送rabbitmq消息的方法详解的文章就介绍到这了,更多相关redis防止重复发送rabbitmq内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Redis主从复制的原理分析

    Redis主从复制的原理分析

    redis主从复制的原理主从复制概述在现代分布式系统中,redis作为一款高性能的内存数据库,其主从复制功能是确保数据高可用性和扩展性的关键技术之一。通过主从复... [阅读全文]
  • Redis中跳表的实现原理分析

    Redis中跳表的实现原理分析

    redis中跳表的实现原理跳表: 主要通过多重链表实现,最底层包含所有元素,上层都是底层元素的跳跃索引,每一层的元素是从下一层中随机选择的,通常使用概率算法来决... [阅读全文]
  • Canal入门使用小结

    说明:canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 mysql 数据库增量日志解析,提供增量数据订阅和消费(官方介绍)。一言以蔽之,…

    2025年02月08日 数据库
  • Redis缓存异常之缓存雪崩问题解读

    缓存异常:缓存雪崩、击穿、穿透当发生缓存雪崩或击穿时,数据库中还是保存了应用要访问的数据。缓存击穿,缓存更数据库中都没有应用要访问的数据。1.缓存雪崩1.1了解缓存雪崩是指大量的应…

    2025年01月16日 数据库
  • Redis哨兵机制的使用详解

    一.哨兵机制基本解读主库发生故障了,如何不间断的服务?哨兵模式:有效的解决主从库自动切换的关键机制在redis中如果从库发生故障了,客户端可以继续向主库和其他从库发消息,进行相关操…

    2025年01月16日 数据库
  • Redis中切片集群详解

    一.切片集群redis中,数据增多了,是该加内存还是加实例?采用云主机来运行 redis 实例,那么,该如何选择云主机的内存容量呢?用 redis 保存 5000 万个键值对,每个…

    2025年01月16日 数据库

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

发表评论

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