jedis源码学习
最近因为工作的原因,对jedis源码熟悉了一下。
1.jedis对底层协议封装,建立socket连接,数据发送和接收。抽象出client。
2.面向用户使用的jedis。
3.提供发布订阅功能。相关类为:BinaryJedisPubSub,JedisPubSub
4.提供事务功能。相关类为:Queable,BinaryTransaction,Transaction,TransactionBlock。
5.pipeline功能。相关类为:Queable,Pipeline,PipelineBlock。
6.实现分布式功能的ShardedJedis。
主要使用MurmurHash算法将key哈希到各个客户端。
使用对象池技术来保存ShardedJedis,以支持高并发。
在redis实际应用中,我们分有很多片,在批量查询中,首先要将查询key进行合并,将key对应在同一个分片保存到map
redis集群由64分片扩容到128分片后发现响应速度明显变慢,比以前慢了1倍多。
解决方法:过多分片,导致查询次数增多(可能),发现redis连接数很多。redis分片容量较少,4g左右。经过测试,redis单个实例分片在15g左右比较合适。根据业务进行垂直分片,增加集群数量,而不是在一个集群中增加机器数量。具体业务接入对应的集群后,响应速度比以前快了2倍左右,连接数很少。增加集群数量,也增加了维护工作量,各有得失吧。
ShardedJedisPool嵌套类ShardedJedisFactory继承BasePoolableObjectFactory,销毁对象是会把所有的jedis都销毁掉。假如分片A有超时现象,对象池将会returnBrokenResourceObject,也就是将ShardedJedis里面所有客户端都销毁,在重建。这浪费了很多资源,也容易造成集群处理能力下降。修改jedis源码,那个分片jedis有问题,销毁对应的jedis。
本文固定链接: http://www.chepoo.com/jedis-source-code-study.html | IT技术精华网