springboot2.0整合redis_灰度发布的方式

springboot2.0整合redis_灰度发布的方式一、简介1、发布订阅SUBSCRIBE,UNSUBSCRIBE和PUBLISH实现了发布/订阅消息范例,发送者(publishers)不用编程就可以向特定的接受者发送消息(subscribers).Rather,发布的消息进入通道,不需要知道有没有订阅者.订阅者发表感兴趣的一个或多个通道,并且只接受他们感兴趣的消息,不管发布者是不是存在.发布者和订阅者的解耦可以允许更大的伸缩性和更多动态的网络拓扑。2、说明本篇文章是继:【SpringBoot】三十四、SpringBoot

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、简介

二、注入消息发布/订阅

  • 1、添加消息监听器
/** * 消息监听 * <p> * 可以传入多个 MessageListenerAdapter */
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, MessageListenerAdapter messageListenerAdapter) { 
   
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    // 监听所有库的key过期事件
    container.setConnectionFactory(connectionFactory);
    // 可以添加多个 messageListener,配置不同的通道
    container.addMessageListener(messageListenerAdapter, new PatternTopic("user"));
    return container;
}

所有的订阅消息,都需要在这里进行注册绑定,new PatternTopic(“user”),表示发布的主题信息

  • 小插曲
    前面我们学习了监听 key 过期事件,如果我们只需要监听当前库的 key 过期事件,可以这样写:
@Value("${spring.redis.database}")
public String redisDatabaseIndex;

先拿到我们项目中使用的 Redis 的库索引

// 监听当前库的key过期
container.addMessageListener(messageListenerAdapter, new PatternTopic("__keyevent@" + redisDatabaseIndex + "__:expired"));

然后使用发布/订阅模式,订阅主题为:keyevent@0:expired 的消息,则表示订阅数据库索引为 0 的 key 过期事件,监听所有的库则为:keyevent@*:expired

  • 2、绑定消息处理器
/** * 消息监听器适配器,绑定消息处理器 * <p> * 可以配置多个 listenerAdapter,监听不同的通道 */
@Bean
MessageListenerAdapter listenerAdapter(RedisMessageListener receiver) { 
   
    return new MessageListenerAdapter(receiver, "onMessage");
}

也就是说,当我们订阅的频道,当有消息进来时,指定它的处理类以及处理方法

三、注入消息处理器

上面我们已经注入了 RedisMessageListener 消息处理器,并指定了处理方法 onMessage(),代码如下:

package com.zyxx.common.redis;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;

/** * Redis 消息接收 * * @Author Lizhou **/
@Slf4j
@Component
public class RedisMessageListener implements MessageListener { 
   

    @Override
    public void onMessage(Message message, byte[] pattern) { 
   
        // 接收的topic
        log.info("channel:" + new String(pattern));
        // 消息的POJO
        log.info("message:" + message.toString());
    }
}

需要实现 MessageListener 接口,重写 onMessage() 方法,然后就可以获取到通道以及消息了,从而进行我们的一些业务逻辑处理

四、操作API

在 RedisUtils 中,我们增加一个操作方法

/** * 向通道发布消息 */
public boolean convertAndSend(String channel, Object message) { 
   
    if (StringUtils.isBlank(channel)) { 
   
        return false;
    }
    try { 
   
        template.convertAndSend(channel, message);
        log.info("发送消息成功,channel:{},message:{}", channel, message);
        return true;
    } catch (Exception e) { 
   
        log.info("发送消息失败,channel:{},message:{}", channel, message);
        e.printStackTrace();
    }
    return false;
}

这里的 channel 相当于 我们存入数据的时候的 key,如果该通道不存在,则会新建一个通道

五、测试

  • 1、测试用例
package com.zyxx.redistest;

import com.zyxx.redistest.common.RedisUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class RedisTestApplicationTests { 
   

    @Autowired
    private RedisUtils redisUtil;

    @Test
    void contextLoads() { 
   
        String message = "Hello World!";
        // 发送消息
        redisUtil.convertAndSend("user", message);
    }
}

我们向通道 user 发送了一条 “Hello World!” 的消息

  • 2、测试结果
    发送消息
    可以看出,我们的消息发送成功,再看控制台
    接收消息
    我们接收到通道 user 发送了一条 “Hello World!” 的消息

如您在阅读中发现不足,欢迎留言!!!

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190640.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 少儿编程mta证书_少儿编程项目计划书

    少儿编程项目计划书未来30年是人工智能的伟大时代,学编程会让孩子的未来充满更多可能性。此项目是针对小学生,主要是以培养学习兴趣,接受最基本的编程概念,并能够通过学到的知识完成一些小的课题,激发和培养学生的编程思维。在学习的过程中,主要通过实体的编程玩具,学会构建自己的作品,比如学习编程语言,机器人等课程。本项目提供多维度的少儿编程培训服务,包括编辑机器人研发、在线编程教育培训、线下培训等。一、线下…

    2022年4月8日
    40
  • java获取当前日期时间的方法_java比较日期大小

    java获取当前日期时间的方法_java比较日期大小本文主要简单的介绍一下获取当前日期时间的方法,并不涉及其他~~java中获取当前日期的方法一般有3种1、通过java.util包下的Calendar类获取。2、通过java.util包下的Date类获取。3、通过java.time包下的API。一、通过Calendar获取 Calendarc=Calendar.getInstance(); intyear=

    2022年10月29日
    0
  • IntelliJ IDEA 2021.10 激活码【2021免费激活】「建议收藏」

    (IntelliJ IDEA 2021.10 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

    2022年3月27日
    508
  • pytorch的安装及其在pycharm中的使用「建议收藏」

    pytorch的安装及其在pycharm中的使用「建议收藏」1.首先配置Anaconda虚拟环境在AnacondaPrompt中输入condacreate-npytorchpython==3.72.在该环境中安装pytorch因为前面已经安装了cuda10.0.130和cudnn,安装与之匹配的pytorch版本,官网中寻找,但是官网的貌似不太对,最后看的是这个回答pipinstalltorch==1.2.0torchvision==0.4.0-fhttps://download.pytorch.org/whl/torch_stab

    2022年8月25日
    4
  • mysql子查询和连接查询(大数据联合计算)

    大圣网络2017-01-3109:19连接查询连接查询:将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。连接查询的意义:在用户查看数据的时候,需要显示的数据来自多张表.连接查询:join,使用方式:左表join右表;左表:在join关键字左边的表;右表:在join关键字右边的表连接查询分类:SQL中将连接查询分成

    2022年4月15日
    34
  • linux nginx启动停止命令_重启后没有nginx

    linux nginx启动停止命令_重启后没有nginx目录一、启动/usr/local/nginx/sbin/nginx-c/usr/local/nginx/conf/nginx.conf二、停止1、从容停止(1)查看进程号:ps-ef|grepnginx(2)杀死进程:kill-quitxxxx2、快速停止(1)查看进程号:ps-ef|grepnginx(2)杀死进程:kill-termxxxx/kill-intxxxx3、强制停止:pkill-9nginx三、重启1…

    2022年10月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号