文档章节

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

红薯
 红薯
发布于 2018/10/17 09:04
字数 1189
阅读 2567
收藏 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

© 著作权归作者所有

共有 人打赏支持
红薯

红薯

粉丝 20939
博文 131
码字总数 47521
作品 8
深圳
产品经理
私信 提问
加载中

评论(9)

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

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

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

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

引用来自“FalconChen”的评论

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

其他语言解析json就可以了
FalconChen
FalconChen
就是说用其他语言实现一个反序列化就行了吗
jeffsui
jeffsui
天花板
叫我刀刀
叫我刀刀
赶紧呼叫 宏哥,
开源中国首席技术官
开源中国首席技术官
沙发
J2Cache 2.2.0-beta 发布,开源中国两级缓存框架

J2Cache 2.2.0-beta 发布,J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此...

周其
2018/01/08
3K
21
J2Cache 2.2.1 正式版发布,开源中国两级缓存框架

J2Cache 2.2.1 正式版发布了。J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因...

周其
2018/01/10
973
5
4 千元悬赏 J2Cache 的 Hibernate 支持功能开发

2015年3月12日更新:此活动已圆满结束,详情请看这里。 OSC 首创基于 Git 的悬赏羊年继续罗! J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Re...

小编辑
2015/07/24
22
2
4 千元悬赏 J2Cache 的 Hibernate 支持功能开发

2015年3月12日更新:此活动已圆满结束,详情请看这里。 OSC 首创基于 Git 的悬赏羊年继续罗! J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Re...

红薯
2015/03/04
14.5K
49
Java两级缓存框架--J2Cache

J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读...

红薯
2014/01/07
55.7K
111

没有更多内容

加载失败,请刷新页面

加载更多

KaliLinuxNetHunter教程下载相关资源

KaliLinuxNetHunter教程下载相关资源 当用户将刷机工具准备完后,则需要下载ROM包。ROM是ROM image(只读内存镜像)的简称,常用于手机定制系统。一般手机刷机的过程,就是将只读内存镜像(R...

大学霸
18分钟前
1
0
C# 字符串插值

字符串插值 据说是 C# 6.0 中引入的新特性. 字符串插值允许您以更简洁易读的方式将字符串拼凑在一起. 如果在字符串的左引号前添加$,则可以在字符串中的大括号里包含字符串值,如变量等. 一些示...

taadis
42分钟前
2
0
Navicat使用教程:接收MySQL/MariaDB问题通知

下载Navicat Monitor最新版本 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona ...

电池盒
43分钟前
3
0
我是怎样和Linux系统结缘并通过红帽RHCE认证的

我高考完当时就是选择的计算机科学与技术专业,上大学以后联想到的和计算机相关的就只有写代码,开发,网站,网页设计,就没有其他的了,当时学习写代码也都是在Windows上,什么C#、C++之类的...

Linux就该这么学
51分钟前
5
0
hbase的web页面访问

hbase1.1版本web页面默认不开放 在hbase-site.xml中加入一下内容即可 <!-- 新增的配置 --><property><name>hbase.master.info.port</name><value>60010</value></property> 借鉴htt......

你为什么不吃药
55分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部