利用Redis发布订阅完成tomcat集群下的消息通知
以下为个人想法,如果有说的不对的地方请各位大佬见谅!
这是博主的第一篇博客,可能排版以及一些描述有不合理的地方还请勿喷,希望大家尽可能的多给我这样的新人一些鼓励让我能在写博客的道路上走下去。
进入正题,首先开发背景
近期公司的一些项目上出现了内存溢出的问题,究其原因是缓存的数据量太大导致jvm内存溢出,产品的架构上比较老所以针对缓存这块,领导叫我去重构移植到Redis中,博主之前并没有学习过Redis以及关于分布式系统的并发问题,所以也是对我的一次挑战,还好没有辜负领导的期望在期望时间之前完成了任务,废话不多说,下面讲讲我对Redis发布订阅以及实现应用集群的分布式锁。
利用Redis的发布订阅实现各个tomcat的消息通知
首先了解一下Redis的发布与订阅,Redis的发布订阅是基于Redis的组成架构 :Redis Client和Redis Server,具体关于Redis发布订阅的信息请查阅这里,利用Redis的该特性,只要将Redis单点同时设置为订阅者与发布者,那么当有一个tomcat发送消息给Redis,Redis去发布该消息时就会通知到所有的节点,这样就实现了各个节点间的消息通知
下图大概描述一下整个消息的传递。

至于实现,博主使用的是java,继承JedisPubSub类重写它的onSubscribe、onUnsubscribe、onMessage三个方法实现订阅者类,再利用jedis.publish()去发布信息。
整个过程中需要注意的是,再发布消息后执行的动作必须放在onMessage中,不能放在发布消息的过程中,因为一个节点去发布消息后,Redis还会反向通知到这个节点,如果在发布消息的过程中执行动作会导致该节点的动作重复执行,所以整个过程可以分为两个部分第一是去发布消息不做任何其他多余动作,二是接收消息立即去执行对应动作。
需要注意的是Redis的发布订阅不会做持久化所以如果在发布信息时Redis宕机会导致消息丢失并且无法恢复,如果业务场景中丢失消息会导致严重结果请慎用!
感谢
其实在本次的项目中还有许多关于Redis以及分布式锁的体会,在后面也会写出来供大家参考一下,感谢各位看到这里的读者!
利用Redis发布订阅完成tomcat集群下的消息通知的更多相关文章
- linux下实现redis共享session的tomcat集群
为了实现主域名与子域名的下不同的产品间一次登录,到处访问的效果,因此采用rediss实现tomcat的集群效果.基于redis能够异步讲缓存内容固化到磁盘上,从而当服务器意外重启后,仍然能够让sess ...
- 用redis实现TOMCAT集群下的session共享
上篇实现了 LINUX中NGINX反向代理下的TOMCAT集群(http://www.cnblogs.com/yuanjava/p/6850764.html) 这次我们在上篇的基础上实现session ...
- 在tomcat集群下利用redis实现单点登陆
场景:比如说我们要实现一个集群环境,无非是把多个项目部署到多个tomcat下,然后按照一定的算法,轮询什么的随机访问多个tomcat服务器,但是问题也会有许多,比如说,我们最开始是把登陆人的信息存放到 ...
- 基于redis实现tomcat8的tomcat集群的session持久化实现(tomcat-redis-session-manager二次开发)
前言: 本项目是基于jcoleman的tomcat-redis-session-manager二次开发版本 1.修改了小部分实现逻辑 2.去除对juni.jar包的依赖 3.去除无效代码和老版本tom ...
- Tomcat集群下获取memcached缓存对象数量,统计在线用户数据量
项目需要统计在线用户数量,系统部署在集群环境下,使用会话粘贴的方式解决Session问题.要想得到真实在线用户数,必须是所有节点的总和. 这里考虑使用memcached存放用户登录数据,key为use ...
- ActiveMQ集群下的消息回流功能
------------------------------------------------------------------ "丢失"的消息 如果有broker1和brok ...
- Redis 发布订阅,小功能大用处,真没那么废材!
今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...
- 集群下使用redis统一session处理
pom依赖(快照版): <dependency> <groupId>org.springframework.session</groupId> <artifa ...
- Linux--6 redis订阅发布、持久化、集群cluster、nginx入门
一.redis发布订阅 Redis 通过 PUBLISH .SUBSCRIBE 等命令实现了订阅与发布模式. 其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个 ...
随机推荐
- spring用注解配置,不用XML
//首先装载一个配置类AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyCon ...
- HBase Configuration过程
(2012-10-22 15:56:10) 转载▼ HBase客户端API中,我们看到对HBase的任何操作都需要首先创建HBaseConfiguration类的实 例.为HBaseConf ...
- IOS xib和代码自定义UIView
https://www.jianshu.com/p/1bcc29653085 总结的比较好 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件. 下面就来说说自定义View的封装 ...
- ActiveMQ_6持久化
activemq持久化 ActiveMQ提供了插件式的消息存储,主要有有如下几种: 1.AMQ消息存储-基于文件的存储方式,是以前的默认消息存储 2.KahaDB消息存储-提供了容量的提升和恢复能力, ...
- Win7 VS2015 x64 MASM汇编语言编写DLL文件
有点坑记录一下. 首先创建工程时选控制台类型工程,Win32估计就应该选Win32的,反正我测试用的控制台. 然后选DLL类型,除了Empty其他全都去掉. 工程属性,masm勾上. Linker & ...
- eclipse怎么删除多余的tomcat server(2)
首先你的Server要是可用状态,就是说当前这个tomcat处于可用状态才能点击那个Create Launch Configuration
- break语句和continue语句
1. break 语句 break语句只能用在switch语句中,其作用是跳出switch语句或跳出本层循环. 2. continue 语句 continue语句只能用在循环体中,用于结束本次循环,即 ...
- 转 Master-Worker模式 并行程序设计模式--Master-Worker模式
简介 Master-Worker模式是常用的并行设计模式.它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负责处理子任务 ...
- nginx 502 bad gateway 问题处理集锦
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致5 ...
- 【接口时序】7、VGA接口原理与Verilog实现
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...