jetcache icon indicating copy to clipboard operation
jetcache copied to clipboard

2.7版本计划

Open areyouok opened this issue 1 year ago • 7 comments

jetcache2.6以后我觉得已经比较完善,一度疏于维护。现在,根据最近两年积攒的问题,准备升级一波。

预计有以下修改:

  • 两级缓存的情况下,如果一台服务器更新了缓存,会去刷新其它服务器的本地缓存。通过redis pub/sub来实现(jedis已经实现,其它的开发中)。
  • 内置json序列化、反序列化器。其实这个最早是有的,但是后来因为兼容和安全的原因去掉了,丢给了用户自己实现,其实jetcache定制encoder/decoder非常简单,不过确实有很多人不会。
  • 废弃CreateCache注解,并提供替代方式。CreateCache的问题是不能提供全功能配置,而且实现方式过于hack,总担心哪天spring升级它又不能用了。如果使用CacheAPI,又比较麻烦,需要各种设置。所以新的方式应该基当前的项目cache配置模板,然后通过api来组装。
  • 可能会提供集中化的缓存配置文件。现在CreateCache和Cached都可以定义缓存,如果两个注解(相同的area和name)定义不一样,按什么方式创建Cache实例是不能确定的。集中的配置文件还有个好处,可以统一管理,适合大型项目,与之相反,散落在各个java文件里面的注解,不利于评估整个项目的缓存使用情况。
  • 类库升级和一些不兼容升级,fastjson会升级到fastjson2,详见兼容性说明(更新中)

一些设计原则:jetcache最强的能力来自CacheAPI,注解只是提供一个方便,满足大部分场景即可。一些复杂的需求应该用CacheAPI来实现,以前通过CreateCache注解可以获取Cache实例(以后会提供更好的方式)。所以,如果需要对注解那一套机制进行复杂的修改来实现什么功能,我觉得不是好的实践,很可能是不会做的(我自己现在也特别讨厌spring)。

时间上,预计就在这个月,会加速开发。2.7版本发布以后,我会发起全新的项目并将主要精力投入其中(过些天我会在个人仓库下创建这个新项目),之后jetcache暂时不会再开发大的特性。

2022年7月8日

areyouok avatar Jul 08 '22 01:07 areyouok

第二点很需要啊。使用 @CreateCache 虽然方便,但确实不够灵活,特别是想要通过代码的方式动态创建Cache的时候。虽然有builder方式,但是这种方式所有的配置都要自己手动重新设置一遍。我现在是临时通过注入 SpringConfigProvider ,调用CacheContext().__createOrGetCache的方式解决。非常期待大佬的新版本。

另外:如果还要延续使用 Kyro,建议升级 Kyro的版本。Spring Boot 3 马上就要来了,Kyro 低版本在 JDK 17下有问题。使用最新版本 的Kyro,需要对KryoValueEncoder进行一定的修改,Jetcache 才能在 JDK 17下运行。

public class KryoValueEncoder extends AbstractValueEncoder {

    public static final KryoValueEncoder INSTANCE = new KryoValueEncoder(true);

    protected static int IDENTITY_NUMBER = 0x4A953A82;

    private static int INIT_BUFFER_SIZE = 512;

    static ThreadLocal<Object[]> kryoThreadLocal = ThreadLocal.withInitial(() -> {
        Kryo kryo = new Kryo();
        kryo.setDefaultSerializer(CompatibleFieldSerializer.class);
        kryo.setRegistrationRequired(false);
        kryo.register(AtomicInteger.class, new AtomicIntegerSerializer());
        kryo.setReferences(true);
//        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());
//        kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));

herodotus-ecosystem avatar Jul 24 '22 03:07 herodotus-ecosystem

kryo4和kryo5互不兼容,都会支持的。

areyouok avatar Jul 24 '22 05:07 areyouok

fastjson2的序列化器已经完成。

json不是专门的java序列化工具,无论用用哪个json类库,兼容性问题都很多。java中反序列化特别容易导致严重的安全问题,而json字符串通常又是从不受信任的前端传进来的,导致json类库安全漏洞特别多,为了修这些漏洞,各个json类库都变得特别保守,比如只要类型不确定,就序列化为一个JsonObject,而不是序列化时的那个java对象。在jetcache里面,会导致反序列化的时候出现各种问题。

综上考虑,2.7代码里面虽包含fastjson2的Encoder/Decoder实现,但默认不注册任何json序列化器。如果有人需要用,自己搞定注册事宜(要是搞不定这个你也搞不定反序列化时出现的各种问题,也就没必要用了)。

areyouok avatar Jul 29 '22 02:07 areyouok

2.7.0.RC,已发布,升级参考兼容性说明文档:

https://github.com/alibaba/jetcache/blob/master/docs/CN/Compatibility.md

areyouok avatar Aug 05 '22 08:08 areyouok

大佬,咨询个问题。 syncLocal 配置是不是无法通过yml配置进行统一设置?只能手动在QuickConfig里面设置么?

herodotus-ecosystem avatar Aug 09 '22 13:08 herodotus-ecosystem

默认是关闭的,手工显式开启比较好,以免更新比较多的情况下产生广播风暴把系统打挂了。

areyouok avatar Aug 09 '22 13:08 areyouok

默认是关闭的,手工显式开启比较好,以免更新比较多的情况下产生广播风暴把系统打挂了。

明白了,感谢!

herodotus-ecosystem avatar Aug 09 '22 14:08 herodotus-ecosystem