如下为我的想法,若是有说的不对的地方请各位大佬见谅!html
这是博主的第一篇博客,可能排版以及一些描述有不合理的地方还请勿喷,但愿你们尽量的多给我这样的新人一些鼓励让我能在写博客的道路上走下去。java
进入正题,首先开发背景缓存
近期公司的一些项目上出现了内存溢出的问题,究其缘由是缓存的数据量太大致使jvm内存溢出,产品的架构上比较老因此针对缓存这块,领导叫我去重构移植到Redis中,博主以前并无学习过Redis以及关于分布式系统的并发问题,因此也是对个人一次挑战,还好没有辜负领导的指望在指望时间以前完成了任务,废话很少说,下面讲讲我对Redis发布订阅以及实现应用集群的分布式锁。tomcat
利用Redis的发布订阅实现各个tomcat的消息通知架构
首先了解一下Redis的发布与订阅,Redis的发布订阅是基于Redis的组成架构 :Redis Client和Redis Server,具体关于Redis发布订阅的信息请查阅这里,利用Redis的该特性,只要将Redis单点同时设置为订阅者与发布者,那么当有一个tomcat发送消息给Redis,Redis去发布该消息时就会通知到全部的节点,这样就实现了各个节点间的消息通知并发
下图大概描述一下整个消息的传递。jvm
至于实现,博主使用的是java,继承JedisPubSub类重写它的onSubscribe、onUnsubscribe、onMessage三个方法实现订阅者类,再利用jedis.publish()去发布信息。分布式
整个过程当中须要注意的是,再发布消息后执行的动做必须放在onMessage中,不能放在发布消息的过程当中,由于一个节点去发布消息后,Redis还会反向通知到这个节点,若是在发布消息的过程当中执行动做会致使该节点的动做重复执行,因此整个过程能够分为两个部分第一是去发布消息不作任何其余多余动做,二是接收消息当即去执行对应动做。学习
须要注意的是Redis的发布订阅不会作持久化因此若是在发布信息时Redis宕机会致使消息丢失而且没法恢复,若是业务场景中丢失消息会致使严重结果请慎用!spa
感谢
其实在本次的项目中还有许多关于Redis以及分布式锁的体会,在后面也会写出来供你们参考一下,感谢各位看到这里的读者!