alibaba / jetcache

JetCache is a Java cache framework.
Apache License 2.0
5.07k stars 1.05k forks source link

请问有计划支持jedis cluster模式吗? #398

Open EasonFeng5870 opened 4 years ago

EasonFeng5870 commented 4 years ago

我们公司目前在中间件里包了一下jetcache,现在不知道是否会有对jedis client的cluster模式的支持呢?

areyouok commented 4 years ago

jedis的cluster jedis(忘记类名了)和其它的jedis没有共同的父类或者接口,如果要支持的话需要新做一个Cache实现。以前我想有lettuce能支持集群就行,所以就偷懒了。

但是对jedis的需求还是很多的,lettuce也有它本身的问题,所以这个还是需要的。

新实现一个也不难,不过暂时还没有明确的时间点。你急着要可以自己先搞一个,参考RedisCache类实现一下就行了。

EasonFeng5870 commented 4 years ago

我们也正有意愿加入实现这块功能。如果您愿意的话,到时候我们可以把相关内容提pr过来?代码上我们也会有严格的控制,包括单元测试,代码风格等。

areyouok commented 4 years ago

可以的,欢迎,参考: https://github.com/alibaba/jetcache/wiki/DevNote_CN

添加一个JedisCluster实现,需要在jetcache-redis里面添加一个JedisClusterCache(参考RedisCache),springboot支持需要在jetcache-autoconfigure里面添加一个JedisClusterAutoConfiguration。单元测试可以参考RedisCacheTest和RedisStarterTest。

另外我很久以前做的docker镜像,cluster模式只能运行在linux环境中,所以我在非linux环境下屏蔽了cluster相关的测试,参考RedisLettuceCacheTest。

EasonFeng5870 commented 4 years ago

好的,我们开发一下

redzippo1 commented 4 years ago

嗨 @areyouok :

我在和 @EasonFeng5870 一起着手实现JetCache对于JedisCluster的支持,有一些设计上的选择比较纠结,想听取一下你的意见哈。

  1. 之前的建议是Jedis对于Cluster的支持完全独立出来,但我觉得这样做重复的代码量比较高,比如通用的配置信息处理等,所以想将两者的逻辑统一放在 RedisAutoConfiguration 中,细节大致如下:
    1. 配置文件中,增加 remote.${cacheArea}.mode 配置,支持 standalone 和 cluster (这两个关键字是redis官方使用的),并增加 remote.${cacheArea}.uri 配置项,用以配置redis cluster实例信息
    2. RedisCacheBuilder 中,增加 createRedisJedisClusterCacheBuilder方法,并增加RedisJedisClusterBuilderImpl 静态内部类,作为Jedis Cluster的实例构造器
    3. RedisCache 中,通过上面的 mode 配置选择使用的client是Cluster还是Pool
  2. 目前很多类中的Redis关键字实际代表的是Jedis,猜想是早期只支持这一种Redis的客户端,目前看有些混淆的意思,是否有必要更正关键字?
    1. 如果需要更正,有一些和用户代码接触的类可能会有低版本不兼容的情况,这种情况能否被接受?例如 RedisCacheBuilder 这个类,可能改名为 RedisJedisCacheBuilder,或者二者共存几个版本?
  3. Jedis的cluster模式,是否需要支持读写分离?若支持的话,slave信息实际应该是从Jedis的Cluster实例中取吧?而不是配置文件指定。但是这样的话权重配置就有些问题。

以上是目前的一些困惑哈,我们也是能希望最大程度接近原作者思路,希望能被大神指正! 非常感谢!

areyouok commented 4 years ago
  1. 是否复用,这取决于相同点和不同点有多少。我认为差异配置项在25%以上就没必要复用了,有一定差异的复用会导致代码和说明文档都变复杂,可读性也变差。AutoConfiguration本身有继承结构实现了一定的复用。剩余的是否还要复用,你们可以评估一下差异项比例。
  2. 原因确实是这样的,以前只支持jedis。为了这个改变兼容性有些不值得,我不太纠结这个事情。如果要改可以这样,新做一个JedisCache(空body)继承RedisCache,把原来的RedisCache标记Deprecated。
  3. JedisCluster我没仔细研究过,slave信息动态获取和现在的RedisCache的静态配置相比又是一个配置差异项吧。另外,其实现在普通的RedisCache的实现读写分离也有很大的优化余地的。比如slave只支持初始权重,不能根据访问失败动态扣减权重,也没有考虑并发度等等,在要求极高的生产环境下,当前的做法是有待优化的。
redzippo1 commented 4 years ago

感谢回复!

我们准备先实现一版cluster不支持读写分离权重的,后续再提交关于您说的问题3的pr :)

EasonFeng5870 commented 4 years ago

@areyouok 你好, @redzippo1 和我提交了一版本代码,包含如下: