享学课堂特邀做者:老顾
小伙伴们对redis应该不陌生,redis是系统必备的分布式缓存中间件,主要用来解决高并发下分担DB资源的负载,从而提高系统吞吐量。java
redis支持多种数据类型, String(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),不一样的类型能够应用到不一样的业务需求中。
redis的集群部署也加强了redis的高可用性,以及对数据的易扩容。web
上面都是 redis知识掌握的重点,这些知识点也是咱们工做的时候,常常用到的,网上介绍的也挺多,老顾就不介绍了。
今天老顾分享redis企业应用,从业务实战的纬度,看看咱们平时使用redis出现了什么问题?如何去解决?redis
如今咱们企业中,作的项目产品确定不止一个;或者一个大的平台中,会有不少业务线。不一样的项目和业务线确定是不一样的团队进行开发的。那你们都会用到redis,那怎么去划分?缓存
这种方案就是不一样的业务用不一样的redis集群,这种方案针对一些小项目或业务线不复杂,以及用到redis缓存范围不大的话,是对服务器资源的浪费,并且增长了运维的工做量。服务器
固然也有好处,就是 redis资源的独立性,不干扰;通常会用在大项目中。
这种方案就是一些业务共用一个redis集群,加强了对redis资源的利用率。架构
在通常企业中,不一样的业务线通常咱们采用的是公共redis集群,由于业务线都不大,独立集群没有必要。这样虽然对redis资源充分利用了,但会出现一些问题。并发
多业务间用redis,会出现不少缓存Key,根本无法知道哪些key是属于哪一个业务的,如:运维
KEY: user:1000、user:book、book、user:like:book、book:user;甚至会出现key冲突。分布式
redis的key在开发的使用是要 合理进行设计规划的,但两个不一样的团队,技术和管理都不同, 即便有规范文档,但不一样的业务团队间, 规范的执行就不得而知。
咱们在开发web服务时,会用相似jedis客户端链接redis服务器,会在配置文件中加入redis集群地址。不过当系统遇到redis负载过高,或者redis的数据须要扩容,就须要增长redis服务器。这时就须要从新把配置文件中的redis集群更改,再重启应用。高并发
上面的方式是否太low了, 都须要从新启动应用, 那么多的应用都须要重启,是否是很麻烦,并且若是在 没法区分业务的状况下, 还不知道重启哪些业务应用。
由于不一样的业务,不一样的团队,不一样的开发人员在真实业务场景中,咱们管理者是没法避免bug存在的,也没法预测线上会发生什么样的问题?如:发现redis集群有不稳定状况,cpu负载很是高,那咱们怎么知道是哪一个业务致使的呢?
这个是很是重要的,由于这个是 公共的redis集群,一旦这个集群挂了,会影响整个业务。
当咱们在生产环境中,发现异常是由哪一个业务产生时,或者是哪一个应用服务器产生的,那如何很快速截断的让有问题的业务和应用服务器,先不让他们访问咱们公共redis集群,等排查出缘由在恢复他们的访问权限。
小伙伴看到这里,感受怎么样?是否是工做中,没有想过这些问题,工做中就直接按照网上的介绍先拿来用了。
如今是否是内心在想,怎么去解决上面的问题?
老顾这里介绍一下解决思路,具体整个代码等老顾的开源项目rb-cache上线后,会分享给你们。
这个问题解决相对比较简单,就是对咱们现有的客户端工具,进行二次封装,
上图就是定义一个二次封装接口
其实原理就是强制在方法中,要开发人员赋予业务区分,每一个业务都是在开发前,管理人员定下来的,这个管理就比较简单了。
若是项目管理中,对业务的划分 比较合理的话,能够在外面再 封装一个简单的方法,把business业务放在配置文件中,这样就不须要每次都要传business这个参数了。
解决这个问题,其实原理比较简单,就是程序若是可以知道redis集群地址产生了变化,从新设置一下jedis客户端的链接配置。如今的问题就是如何知道redis集群地址发生了改变?
咱们能够采用把redis的集群地址配置在zookeeper中,应用在启动的时候,获取zk上的集群地址的值,进行初始化。若是想要改变集群地址,要在zk上面进行设置。
zk重要的特性就 是监听特性, 节点发生变化,就会马上把变化发送给应用,从而应用获取到值, 从新设置jedis客户端链接
发现异常这个问题,其实就是一个监控的问题,咱们须要把各个客户端使用redis的状况进行监控。怎么监控?
须要一个监控工具,这个监控工具网上有几个,推荐使用小米的open-falcon,自行搭建改监控系统,搭建比较复杂,但功能比较强大,不少公司都在使用。
固然小伙伴们能够用别的监控工具,只要数据上报协议,和监控报表输出功能便可,固然也要有报警的功能,及时给运维人员报告
再使用Aop拦截redis操做类,拦截redis操做,把相关数据进行封装。每隔1分钟把这些数据上报到open-falcon平台中。具体监控什么数据,由业务决定,通常要把设置的key,业务,操做时长,哪一个客户端IP发起的,都须要监控。
在能够设置相关的 报警规则,如:某个key一直被调用,在一段时间内 操做次数过高。这样就能够方便排查 哪些key致使cpu负载过高,就能够去看一下 设置这个key的代码,有没有什么问题?是否是死循环等问题?
在上面的发现异常的基础上面,若是发现某些业务应用,不正常,就能够当即发起截断该客户端的请求,这样能够保证其余业务不受影响。这里咱们使用客户端方式去实现截断。原理也很简单,在redis二次封装的类中,咱们须要判断本机是否在黑名单中,若是存在,则没法操做方法,或报异常。
如何知道黑名单的变化,跟优雅扩容那个redis集群地址的改变,方案同样。
在企业应用中,小伙伴们要常常去思考,业务进行中,如何方便管理,及时发现问题,是很是重要的。这也是不少管理者常常忽略的,都只是先把功能完成了,而不顾管理和监控。但愿这篇文章可以帮助你们,从另外一个纬度发现问题。谢谢!!!
END
欢迎长按下图关注公众号:享学课堂online!
公众号后台回复【java】,获取精选准备的架构学习资料(视频+文档+架构笔记)