Open luger1990 opened 11 months ago
实现SerialPolicy接口 比如 TestPolicy
注册Bean @Bean(name = "testPolicy") public SerialPolicy testPolicy() { // 省略 return testPolicy; }
配置 ,格式:valueEncoder: bean:testPolicy jetcache: statIntervalMinutes: 15 areaInCacheName: false local: default: type: linkedhashmap keyConvertor: fastjson remote: test: type: redisson valueEncoder: bean:testPolicy valueDecoder: bean:testPolicy
我还是想用fastjson2进行value的序列化和反序列化,但是想存redis之前对value进行gzip压缩,减小数据的体积。但是看了看文档没有找到自定义序列化和反序列化的完整代码。麻烦给个步骤。 同时也问问有没有人是用gzip压缩的。效果好不好。不考虑kryo的原因是 如果新增 减少字段 kryo会报错。
源码参见:
com.alicp.jetcache.autoconfigure.JetCacheAutoConfiguration#springConfigProvider
com.alicp.jetcache.anno.support.SpringConfigProvider
com.alicp.jetcache.anno.support.DefaultSpringEncoderParser
com.alicp.jetcache.anno.support.DefaultSpringEncoderParser#parseBeanName
com.alicp.jetcache.anno.support.ConfigProvider#doInit
api模式: //初始化任务图相关数据的缓存配置 QuickConfig graphQc = QuickConfig.newBuilder(JetCacheConstant.PUBLISH_GRAPH_CACHE_NAME) .expire(Duration.ofDays(PUBLISH_DATA_EXPIRE_TIME)) .cacheType(CacheType.BOTH) // 本地缓存更新后,将在所有的节点中删除缓存,以保持强一致性 .valueDecoder(bytes -> GzipUtils.unGzip(new String(bytes, StandardCharsets.UTF_8))) .valueEncoder(obj -> { String gzip = GzipUtils.gzip(JSONObject.toJSONString(obj)); return gzip.getBytes(); }) .syncLocal(false) .build(); 使用起来感觉还行
fastjson2编码器/解码器已实现,但默认情况下不注册。这是因为json不是java的良好序列化util,并且有许多兼容问题
fastjson2的序列化器已经完成。
json不是专门的java序列化工具,无论用用哪个json类库,兼容性问题都很多。java中反序列化特别容易导致严重的安全问题,而json字符串通常又是从不受信任的前端传进来的,导致json类库安全漏洞特别多,为了修这些漏洞,各个json类库都变得特别保守,比如只要类型不确定,就序列化为一个JsonObject,而不是序列化时的那个java对象。在jetcache里面,会导致反序列化的时候出现各种问题。
综上考虑,2.7代码里面虽包含fastjson2的Encoder/Decoder实现,但默认不注册任何json序列化器。如果有人需要用,自己搞定注册事宜(要是搞不定这个你也搞不定反序列化时出现的各种问题,也就没必要用了)。
我还是想用fastjson2进行value的序列化和反序列化,但是想存redis之前对value进行gzip压缩,减小数据的体积。但是看了看文档没有找到自定义序列化和反序列化的完整代码。麻烦给个步骤。 同时也问问有没有人是用gzip压缩的。效果好不好。不考虑kryo的原因是 如果新增 减少字段 kryo会报错。