文档章节

如何让 J2Cache 在多种编程语言环境中使用

红薯
 红薯
发布于 10/17 09:04
字数 1189
阅读 2299
收藏 10

现在的系统是越来越复杂了,不仅仅是功能复杂,系统结构也非常复杂,而且经常在一个系统里包含几种不同语言编写的子系统。例如用 JavaScript 做前端开发、用 Java/PHP 等等做后端,C/C++/Go 等做一些底层模块等等(我只是举个栗子,不要挑起斗争哦)。

这些不同语言编写的子系统经常需要进行一些交互,多数方面的数据交互一般都有对应的技术或者中间件来解决,例如消息中间件、数据库、RESTful 接口、Redis 等等。

本文主要聚焦于缓存系统的交互。

在多语言开发的系统中,使用 Redis 这类服务实现缓存交付是非常适合的,但前提是缓存的数据必须是每一种语言都能识别。基于这个前提来考量,JSON、XML 是最合适的格式,因为它们是语言无关的规范,任何语言都能方便的解析这两种格式。而 JSON 相比 XML 又更优一些,因为同样数据用 JSON 表示体积更小。

所以 Redis + JSON 就成为了跨语言环境中的缓存首先解决方案。不过我之前一直在强调单独使用 Redis 做缓存的严重问题(详情):巨大的缓存数据吞吐量会导致 Redis 的数据读取变得异常缓慢,而扩容 Redis 的成本又非常高。

因此我们有必要在跨语言环境中使用 J2Cache 。

那么问题来了,J2Cache 是一个 Java 开发的缓存桥梁,非 Java 语言的应用怎么用 J2Cache 呢?答案是用不了!

但是可行!

我们假设一个系统中包含两个应用,一个 Java 开发(J应用),另外一个随便用什么别的语言开发,例如 Python (P应用)?

J应用和 P应用之间需要进行缓存交互,在 J2Cache 中,两个节点之间的数据交互包括:

  1. 缓存数据
  2. 消息通知

J2Cache 从 2.0 版本开始就是用 JSON 格式的消息通知,默认走 Redis 的 Pub/Sub 来传播,因此 P应用只需要连接到 Redis 对应的 Pub/Sub 通道就可以获取和发布消息通知。

最大的问题是“缓存数据”,因为应用系统中的缓存数据一般会比较复杂,例如我们会缓存一个对象、一个列表、数组等等。在 Java 应用中我们在将这些数据写到 Redis 时一般是采用序列化的方式,而你让其他语言来读取 Java 序列化数据是很难,可以说是几乎不可能的。

因此我们也必须用 JSON 的格式来表示我们所要缓存的数据,这样就可以让别的语言方便的解析数据。

在 J2Cache 中是需要配置 j2cache.serialization = json 即可实现这个需求。

J2Cache 使用的是 FST 库提供的 JSON 序列化方案,来看看一个普通对象序列化后的结果:

首先是要序列化的类:

public class Person implements Serializable {

    private String name;
    private int age;
    private BigInteger seconds = new BigInteger("100");
    private List<School> schoolList;
    private HashMap<String, Integer> jobs;

}

public class School implements Serializable {

    private String name;
    private int random = (int)(Math.random() * 1000);

}

初始化的数据:

person = new Person();
person.setName("Winter Lau");
person.setAge(19);
person.setSchoolList(Arrays.asList(new School("西北工业大学"), new School("泉州第五中学"), new School("城东中学"), new School("洛南小学")));
person.setJobs(new HashMap<String, Integer>(){{
    put("creawor", 3);
    put("moabc", 5);
    put("huateng", 3);
    put("oschina", 8);
}});

序列化的结果:

{"@type":"net.oschina.j2cache.Person","@object":{"age":19,"seconds":{"@type":"java.math.BigInteger","@object":[1,["byte",100]]},"create_time":{"@type":"date","@object":[1539737786400]},"jobs":{"@type":"map","@object":[4,"creawor",3,"huateng",3,"moabc",5,"oschina",8]},"schoolList":{"@type":"list","@object":[4,{"@type":"net.oschina.j2cache.School","@object":{"random":950,"name":"西北工业大学"}},{"@type":"net.oschina.j2cache.School","@object":{"random":983,"name":"泉州第五中学"}},{"@type":"net.oschina.j2cache.School","@object":{"random":647,"name":"城东中学"}},{"@type":"net.oschina.j2cache.School","@object":{"random":766,"name":"洛南小学"}}]},"name":"Winter Lau"}}

而消息通知的数据更为简单:

{"keys":[],"operator":1,"src":6160636}

所以,当我们用其他语言来编写缓存操作的时候,只需要参考 J2Cache 的流程对这两种 JSON 格式的数据进行解析即可。

有兴趣的朋友可以根据本文的思路来开发不同语言版本的 J2Cache ,我之前已经开发了一个 Python 的版本的雏形 —— Py3Cache

欢迎大家贡献 https://gitee.com/ld/J2Cache

© 著作权归作者所有

共有 人打赏支持
红薯

红薯

粉丝 20723
博文 130
码字总数 47104
作品 8
深圳
产品经理
私信 提问
加载中

评论(9)

久永
久永
贱应用、屁应用都支持了,鸟应用(.Net)支持不?
红薯
红薯

引用来自“长乐未央m”的评论

j2cache可有缓存即将过期时的自动刷新机制,防止缓存过期时瞬间的DB压力

就擅长做这个事情
长乐未央m
j2cache可有缓存即将过期时的自动刷新机制,防止缓存过期时瞬间的DB压力
lanybass
lanybass
软件是正经软件,但作者正不正经就不知道了,一看就很猥琐。
红薯
红薯

引用来自“FalconChen”的评论

就是说用其他语言实现一个反序列化就行了吗

其他语言解析json就可以了
FalconChen
FalconChen
就是说用其他语言实现一个反序列化就行了吗
jeffsui
jeffsui
天花板
叫我刀刀
叫我刀刀
赶紧呼叫 宏哥,
使用 fastjson 实现类型无关的对象序列化

今天跟 fastjson 作者 @wenshao 聊了会才找到 fastjson 如何实现类型无关的对象序列化 代码如下: J2Cache 已经新增了这个特性,详情请看这里。 J2Cache 使用 JSON 进行缓存数据序列化的方式...

红薯
08/08
0
0
J2Cache 2.6.0 发布,支持分布式 session 存储管理

J2Cache 2.6.0 版本发布啦,该版本最最值得关注的就是支持分布式的 session 存储管理,支持不同的 Servlet 容器。 此外,该版本包含了如下小改动: 配置中对值包含空格的处理 CacheObject 允...

红薯
09/13
0
0
J2Cache 新增 Hibernate 5 支持,感谢 @tandy 贡献

想了解 J2Cache 是一个什么开源项目,请阅读 这篇博客。 J2Cache 刚新增对 Hibernate 5 的支持,提供了 j2cache-hibernate5 模块,可以方便在 Hibernate 5 中启用 J2Cache 缓存。 该模块由 ...

红薯
09/28
0
1
J2Cache 2.4.0 发布,支持 JSON 序列化体验

J2Cache 2.4.0 发布了,该版本统一了各个模块的版本号,完善了 Spring Boot 的支持。最最值得关注的是 J2Cache 2.4.0 的序列化方案中增加了对 JSON 的支持。 可通过 j2cache.serialization ...

红薯
08/02
0
0
J2Cache 2.7.0 发布了,支持 Lettuce 替代 Jedis

J2Cache 2.7.0 在周末悄没声息的发布了!!! 该版本支持使用 Lettuce 替代 Jedis 连接 Redis ,目前二者并存,以后的版本可能会考虑直接替换掉 Jedis 。我之前不喜欢 Lettuce 是因为它依赖了...

红薯
09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 教程:在 Confluence 中导航

当你对 Confluence 有所了解后,你会发现 Confluence 使用起来非常简单。这个教程主要是针对你使用的 Confluence 界面进行一些说明,同时向你展示在那里可以进行一些通用的任务和操作。 空间...

honeymose
今天
2
0
sed, awk 练习

1. sed打印某行到某行之间的内容 2. sed 转换大小写 将单词首字母转化大写 将所有小写转化大写 3. sed 在某一行最后面添加一个数字 4. 删除某行到最后一行 解析: {:a;N;$!ba;d} :a : 是...

Fc丶
今天
2
0
babel6升级到7,jest-babel报错:Requires Babel "^7.0.0-0", but was loaded with "6.26.3".

自从将前端环境更新到babel7,jest-babel之前是基于babel6的,执行时候就会报:Requires Babel "^7.0.0-0", but was loaded with "6.26.3". 很烦,因为连续帮好几台电脑修复这个问题,所以记...

曾建凯
今天
1
0
探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部