java实现 redis的发布订阅(简单易懂),大厂 HR 如何面试

JAVA 实现 Redis 发布订阅 原文地址 https://blog.youkuaiyun.com/tttttt521/article/details/118612526?ops_request_misc=&request_id=&biz_id=102&utm_term=java%20%20%20%20redis%20%E6%B6%88%E6%81%AF%E5%8F%91%E5%B8%83%E8%AE%A2%E9%98%85&utm_medium=distribute.pc_search_result.none-task 阅读详情


写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫码加微信好友进【程序员面试学习交流群】,免费领取。也欢迎各位一起在群里探讨技术。

 

redis的应用场景实在太多了,现在介绍一下它的几大特性之一 发布订阅(pub/sub)。

 

特性介绍:

什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。熟悉设计模式的朋友应该了解这与23种设计模式中的观察者模式极为相似。

同样,Redis的pub/sub是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合, Redis作为一个pub/sub的server, 在订阅者和发布者之间起到了消息路由的功能。

如果没听懂上述的专业解释,没关系,其实我也没太听懂。

简单来讲,这里面还有个channel的概念,这里就是频道的意思,比如你订阅了银行的频道,当你的资金发生变动时,银行就会通过它的频道给你发送信息,在这里,你是属于被动接收的,而不是向银行索要信息,这个例子中,你就是sub(订阅者),而银行就是pub(发布者)。

项目运用场景:

一直都认为你会一样技术之前,都必须先明白这样一种技术在哪些地方会被用到,不能盲目的学东西。

看到发布订阅的特性,用来做一个简单的实时聊天系统再适合不过了。这是其中之一,当然这样的东西,我们开发中很少涉及到。再举一个常用的,在我们的分布式架构中,常常会遇到读写分离的场景,在写入的过程中,就可以使用redis发布订阅,使得写入值及时发布到各个读的程序中,就保证数据的完整一致性。再比如,在一个博客网站中,有100个粉丝订阅了你,当你发布新文章,就可以推送消息给粉丝们拉。总之场景很多,需要去挖掘。。

回顾java如何操作redis:

redis是一种缓存数据库,它也是C/S的结构,也就是客户端和服务端,一般来说,在java中,我们通常使用 jedis(客户端)去操作redis(服务端),这其中操作的时候,两者之间肯定要建立连接,就像数据库链接一样,在关系型数据库中,我们一般都维护一个连接池,以达到链接的复用,来省去建立连接和关闭连接的时间。所以在jedis中,同样也存在一个jedispool(jedis连接池)的概念,我们都是从池中去取连接使用。

上代码:

想使用jedis先引入依赖

 

<dependency>

    <groupId>redis.clients</groupId>

    <artifactId>jedis</artifactId>

    <version>2.9.0</version>

</dependency>

 

建立一个Publisher (发布者)

 

public class Publisher extends Thread{

    private final JedisPool jedisPool;

    public Publisher(JedisPool jedisPool) {

        this.jedisPool = jedisPool;

    }

    

    @Override

    public void run() {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        Jedis jedis = jedisPool.getResource();   //连接池中取出一个连接

        while (true) {

            String line = null;

            try {

                line = reader.readLine();

                if (!"quit".equals(line)) {

                    jedis.publish("mychannel", line);   //从 mychannel 的频道上推送消息

                } else {

                    break;

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}

 

再建立一个订阅者

 

public class Subscriber extends JedisPubSub {

    public Subscriber(){}

    @Override

    public void onMessage(String channel, String message) {       //收到消息会调用

        System.out.println(String.format("receive redis published message, channel %s, message %s", channel, message));

    }

    @Override

    public void onSubscribe(String channel, int subscribedChannels) {    //订阅了频道会调用

        System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",

                channel, subscribedChannels));

    }

    @Override

    public void onUnsubscribe(String channel, int subscribedChannels) {   //取消订阅 会调用

        System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",

                channel, subscribedChannels));

    }

}

 

这里订阅者需要继承JedisPubSub,来重写它的三个方法。用途 注释上已经写了,很简单。

我们这里只是定义了一个订阅者,下面去订阅频道。

 

public class SubThread extends Thread {

    private final JedisPool jedisPool;

    private final Subscriber subscriber = new Subscriber();

    private final String channel = "mychannel";

    public SubThread(JedisPool jedisPool) {

        super("SubThread");

        this.jedisPool = jedisPool;

    }

    @Override

    public void run() {

        System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));

        Jedis jedis = null;

        try {

            jedis = jedisPool.getResource();   //取出一个连接

            jedis.subscribe(subscriber, channel);    //通过subscribe 的api去订阅,入参是订阅者和频道名

        } catch (Exception e) {

            System.out.println(String.format("subsrcibe channel error, %s", e));

        } finally {

            if (jedis != null) {

                jedis.close();

            }

        }

    }

}

 

最后,再写一个测试类去跑一下。键盘输入消息,订阅者就会触发onMessage方法

 

public class PubSubDemo {

    public static void main( String[] args )

    {

        // 连接redis服务端

        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);

        

        System.out.println(String.format("redis pool is starting, redis ip %s, redis port %d", "127.0.0.1", 6379));

        SubThread subThread = new SubThread(jedisPool);  //订阅者

        subThread.start();

        Publisher publisher = new Publisher(jedisPool);    //发布者

        publisher.start();

    }

}

 

看打印结果

 


转载:https://www.cnblogs.com/xinde123/p/8489054.html

推荐内容:
java中equals,hashcode和==的区别
JAVA工程师面试常见问题集锦
java基础面试题
Java面试题考点全面总结
Java_集合面试题
2019 Java面试题
Java文件上传细讲
100道Java基础面试题收集整理(附答案)
知名互联网公司校招 Java 开发岗面试知识点解析
Java面试通关要点汇总集

 

carsim与simulink联合仿真学习笔记(二)——使用C-class车模做driver model仿真(5 driver sensors) Driver model 在carsim的Simulink库中自带外部驾驶员模型,打开后如图所示: 然后打开carsim中对应的数据集,如图所示: 具体仿真步骤不在赘述,注意到这里选择的是E-Class车模,那么如果我想选择C-Class车型进行仿真呢?点三角选择车型可以看到: 马赛克部分是我后来建的,如过没有使用过是没有马赛克部分的。那么既然这里没有C-class,又该怎么办呢? 创建C-... 阅读详情

相关推荐

三极管自激升压电路设计 - 从参数计算到实践验证

本文详细解析了三极管自激升压电路(焦耳小偷电路)的设计原理与实践方法。通过剖析自激振荡机制与三极管电流关系,指导读者完成从核心参数计算、关键元件选型到面包板搭建调试的全过程。文章重点阐述了如何利用电感、三极管等基础元件实现低压直流到高压的转换,是理解开关电源与电磁能量转换的绝佳实践项目。

weixin_29250573的博客 366

Java实现Redis的发布和订阅

java代码实现Redis的发布和订阅

weixin_42614150的博客 4637

从指令到坐标:深度解析307系列基站定位的AT指令实战与排错

本文深度解析了ML307系列模组基站定位的AT指令实战应用与排错方法。重点剖析了AT+MLBSCFG和AT+MLBSLOC两条核心指令的配置、执行流程及异步响应机制,并针对高德与OneOs两种主流定位服务提供了完整的配置指南。文章结合常见错误码(如126、127)和硬件注意事项,分享了确保定位成功的实战经验与稳健的程序框架。

weixin_29057695的博客 487

发布订阅模式实现 java_Redis发布订阅原理以及java实现

一、Redis发布订阅原理 Redis的架构包括两个部分:Redis Client和Redis Server,即客户端和服务端。客户端负责向服务器端发送请求并接受来自服务器端的响应。服务器端负责处理客户端请求,例如:数据存储,获取数据,修改数据等。 Redis通常用作数据库,缓存以及消息系统。发布订阅的框架其中Publisher和Subscriber为Redis Client,chann...

weixin_35747051的博客 568

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

飞书多维表格+影刀RPA:我如何用3个指令搞定每周的销售数据自动汇总(附完整配置截图)

本文详细介绍了如何利用飞书多维表格和影刀RPA实现销售数据的自动化汇总,通过三个核心指令(建立链接、列出记录、更新记录)简化繁琐的手工操作。文章包含完整的配置截图和实战指南,帮助用户快速部署自动化流程,提升工作效率。

weixin_29273849的博客 285

java实现 redis的发布订阅(简单易懂)

redis的应用场景实在太多了,现在介绍一下它的几大特性之一 发布订阅(pub/sub)。特性介绍:什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式...

weixin_34191734的博客 1372

QMT量化交易实战:如何用通达信预警数据自动买卖股票(附完整Python代码)

本文详细介绍了如何利用QMT平台结合通达信预警数据实现股票自动化交易,提供完整的Python代码实现。通过实时监控通达信预警板块文件,系统自动执行买卖操作,提升交易效率。文章涵盖系统架构设计、数据对接、信号处理、订单执行等核心模块,适合量化交易初学者和通达信用户参考实践。

weixin_29251567的博客 678

[Java语言实现Redis集群订阅 ]

面露难色 愁更愁

汤圆的博客 1415

手把手教你学Simulink--电机电磁兼容与可靠性​场景示例:基于Simulink的电机轴电压与轴电流抑制仿真

本文带你完成了电机轴电压与轴电流抑制的Simulink仿真,实现了:✅ 揭示了共模电压 → 寄生电容 → 轴电压 → 轴承电蚀的完整链路✅ 搭建了含寄生参数的高频电机等效模型共模电压最小化PWM(源头抑制)dv/dt滤波器(路径阻断)轴接地(终端泄放) ✅ 通过仿真验证了轴电压从68 V降至<3 V的显著效果 ✅ 为高可靠性电机系统提供低成本、高效益的轴承保护方案。

MHD0815的博客 315

OpenAI Function Calling 实战:让 Agent 自动调用外部 API 接口

在 2023 年 6 月之前,大语言模型(LLM)的能力边界是清晰的:它能说会道,能写诗作赋,也能帮你润色文案。但如果你问它"北京现在天气怎么样",它要么答不上来,要么基于过时的训练数据给你一个错误答案。原因很简单——LLM 的训练数据是有截止日期的,它活在"过去"。2023 年 6 月,OpenAI 在 GPT-4 的更新中引入了 Function Calling 功能,彻底改变了这一局面。Function Calling(也叫 Tool Use 或工具调用)是一种让 LLM 与外部系统交互的机制。

2201_76125393的博客 86

最新缓存架构技术:Redis+MongDB,阿里P7面试必跳的坑(1),java程序员面试笔试宝典附录答案

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

2401_84584324的博客 1286

(计算机组成原理)第二章数据的表示和运算-第二节:数字电路基础知识

本文介绍了计算机组成原理中的逻辑门电路、多路选择器和三态门。逻辑门电路包括基本逻辑运算(与、或、非)和复合逻辑运算(与非、或非、异或、同或),这些运算通过门电路实现,并满足分配律和结合律。多路选择器(MUX)用于从多个输入信号中选择一个输出,广泛应用于数据选择、资源共享和逻辑函数实现等场景。三态门则具有三种输出状态(高电平、低电平、高阻态),常用于总线控制和信号隔离。这些元件在数字电路设计和计算机系统中具有重要作用。

快乐江湖的博客 2474

kafka发布订阅实战作为Java开发者

金三银四到了,送上一个小福利![外链图片转存中…(img-CPzUWMCa-1710283012421)][外链图片转存中…(img-APqtlO8W-1710283012421)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

m0_60721695的博客 1045

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

面试阿里不到半小时被破格录取,问我原因?还不是因为Redis

前言 众所周知数据结构和算法是面试重点,我们持续发力是十分明智的,要不然最后肯定是要吃亏的,少打打游戏刷刷微博可以改变我们的生活水平哦。 不过本文不是要讲述数据结构和算法的,而是另外一个面试重点Redis,因为Redis也是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试区。 前两天觉得自己之前的公司已经限制了我的发展,直接就把老板给炒了... 我与Redis不得不说的故事 我是2017年才开始接触Redis的,期间自己搭过单机版和集群版,不过现在公司大一些都完全是.

马小婧QAQ 1205

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java大厂面试实录:从小白到被拒的全过程

一场真实的面试不仅是技术的较量,更是思维深度的体现。希望这篇模拟面试能帮助你查漏补缺,在真正的战场上少走弯路。记住,每一个被拒的背后,都是通往成功的必经之路。

joshua的博客 293

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

BTAJ大厂最新面试题汇集,电子版已问世

前言 大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历但是听当事人叙述后便会深有同感(因为我朋友差点就与offer擦肩而过了,总共4面技术5面HR,真的好艰难)。为此,我也将这面经整理出来分享给每位程序员(媛)朋友做一个参考,可知“HUAWEI”在Java开发工程师招聘中有哪些技术性考察和倾向! 01 Redis面试问题常见划分(6个部分) Redis 的概念理解 Redis 基本数据结构详解 Redis 高并发问题策略

CHAMPION8888的博客 170

已拿腾讯后台开发岗 offer,简单说下自己的面试经历和学习路线(1)

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来。

2401_84048542的博客 1046

一个程序媛的面试之路(字节、百度,java过滤器实现原理

面试体验很好,给了自己信心和很多面试的查漏补缺以及思考方式,感恩。 还记得视频面紧张的不行,因为代码能力比较弱,很怕手撕代码,一面面试官看我没写出来,还换了一道特别简单的判断有无环,真的是感恩。 一面+二面+三面:(视频面) ============== Redis数据类型的底层数据结构,String类型和SortedSet类型 中断处理中cpu现场环境存储在哪里 MySQL中有a,b两列各自建立索引,在进行查询的时候,走哪个索引,怎么设计 三面主要问项目中的消息中间件和场景题 代码题目

m0_54861402的博客 230

前端Java C++ Go四线大厂面试复盘与高频考点解析

技术面试是检验开发者综合能力的关键环节,需要覆盖编程语言基础、算法与系统设计等多个维度。不同岗位对技术栈的深度要求不同,但JVM内存模型、并发编程、内存管理等底层原理,往往是区分候选人水平的分水岭。掌握这些原理,不仅有助于写出更健壮的代码,也能在面试中应对连环追问。无论是后端、前端还是云原生方向,面试官都倾向于通过高频考题、手写算法和项目深挖来评估真实工程能力。一位开发者历时三个月,完整走完前端、Java、C++、Go四条技术线的面试,整理出各方向考点分布、参考答案思路和算法题套路,为备战大厂技术面试的求职

weixin_33824363的博客 421

一个程序媛的面试之路(字节、百度,java语言程序设计教程魏永红课后答案

还记得视频面紧张的不行,因为代码能力比较弱,很怕手撕代码,一面面试官看我没写出来,还换了一道特别简单的判断有无环,真的是感恩。 一面+二面+三面:(视频面) ============== Redis数据类型的底层数据结构,String类型和SortedSet类型 中断处理中cpu现场环境存储在哪里 MySQL中有a,b两列各自建立索引,在进行查询的时候,走哪个索引,怎么设计 三面主要问项目中的消息中间件和场景题 代码题目:leetcode 85最大矩形 , 判断链表有无环,手写hashm

m0_64384202的博客 1369

一个程序媛的面试之路(字节、百度,中级java面试问题大全及答案大全

目前拿到了字节,百度,网易(白菜价,已拒),美团,小米的意向书,等最终结果通知的是华泰(已收到体检通知),招行信用卡,阿里 招银(资料审查中),网易互娱(二面没去),浦发(没去体检),农行(面试通过,没去笔试),腾讯(两次被捞都是一面挂,第三次还是深圳拒绝了面试),银联(笔试完),微博(拒绝了现场面试) 还有各种笔试挂的(流利说,爱奇艺,小红书,B站),后续拒绝了很多面试,再也没有精力再去了,持续躺尸中… 面试的时候真的是屡战屡败(阿里三次已回绝),真的要好好调整自己,面试过程中要充分思考,祝大家都收获自己

m0_65441360的博客 330

2021金九银十,2面技术+HR面+offer

第1章 初识Redis 初识Redis,带领读者进入Redis的世界,了解它的前世今生、众多特性、应用场景、安装配置、简单使用,最后对Redis发展过程中的重要版本进行说明,可以让读者对Redis有一个全面的认识。 1.1Redis特性 1.2Redis使用场景 1.3用好Redis的建议 1.4正确安装并启动Redis 1.5Redis重大版本 第2章 API的理解和使用 API的理解和使用,全面介绍了Redis提供的5种数据结构字符串(string)、哈希(hash)、列表(list)、

碧海朝天素 94

快速搭建高可用RedisCluster主从模式集群,大厂内部资料

前言 分布式,是程序员必备技能之一,在面试过程中属于必备类的,在工作中更是会经常用到。而Kafka是一个分布式的基于发布订阅的消息队列,目前它的魅力是无穷的,对于Kafka的奥秘,还需要我们细细去探寻。 要谈对Kafka有多熟悉,我相信还是阿里的大佬们最有发言权,所以今天分享的内容,就是Alibaba内部供应的“限量笔记”,关于Kafka的精髓全部写在这里面了,不得不感叹:不愧是Alibaba的技术官啊,真的服了! 抖音Java岗后端一面(7.22)(47分钟) 1. 自我介绍还没完屏幕就黑了。。重连后直

m0_56835488的博客 120

已拿腾讯后台开发岗 offer,简单说下自己的面试经历和学习路线

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

2401_84048554的博客 864

金九银十,Java 程序员面试历程(附字节,阿里,百度,网易

金三银四马上就到了,希望大家能好好学习一下这些技术点学习视频:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!项目 ing。

2401_84103675的博客 972
上一篇: 从.Net到Java学习第一篇——开篇,大厂 HR 如何面试
下一篇: 从Java小白到收获BAT等offer,分享我这两年的经验和感悟,BAT 面试官 如何面试
ccc_ccc8
博客等级 码龄8年 8粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值