前言
之前在做
秒杀架构实践
时有提到对 distributed-redis-tool 的一次小升级,但是没有细说。
其实主要原因是:
秒杀时我做压测:由于集成了这个限流组件,并发又比较大,所以导致连接、断开 Redis 非常频繁。最终导致获取不了 Redis connection 的异常。
池化技术
这就是一个典型的对稀缺资源使用不善导致的。
何为稀缺资源?常见的有:
线程
数据库连接
网络连接等
这些资源都有共同的特点:创建销毁成本较高。
这里涉及到的 Redis 连接也属于该类资源。
我们希望将这些稀有资源管理起来放到一个池子里,当需要时就从中获取,用完就放回去,不够用时就等待(或返回)。
这样我们只需要初始化并维护好这个池子,就能避免频繁的创建、销毁这些资源(也有资源长期未使用需要缩容的情况)。
通常我们称这项姿势为池化技术,如常见的:
线程池
各种资源的连接池等。
这里以分布式锁为例:
将使用的 api 修改为:
原有:
现在:
将以前的 Jedis 修改为 ,后续的 Redis 连接就可通过这个对象获取。
并且显示的传入使用 RedisCluster 还是单机的 Redis。
所以在真正操作 Redis 时需要修改:
最大的改变就是将原有操作 Redis 的对象( )改为从连接池中获取。
由于使用了 作为 Redis 连接池。
所以需要再使用时构件好这个对象:
看起比较麻烦,需要构建对象的较多。
但整合 Spring 使用时就要清晰许多。
配合 Spring
Spring 很大的一个作用就是帮我们管理对象,所以像上文那些看似很复杂的对象都可以交由它来管理:
这个其实没多少好说的,就算是换成 SpringBoot 也是创建 这些 bean 即可。
总结
换为连接池之后再进行压测自然没有出现获取不了 Redis 连接的异常(并发达到一定的量也会出错)说明更新是很有必要的。
推荐有用到该组件的朋友都升级下,也欢迎提出 Issues 和 PR。
项目地址:
https://github.com/crossoverJie/distributed-redis-tool
领取专属 10元无门槛券
私享最新 技术干货