文档章节

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

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

© 著作权归作者所有

红薯

红薯

粉丝 22345
博文 162
码字总数 88952
作品 8
深圳
产品经理
私信 提问
加载中

评论(9)

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

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

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

就擅长做这个事情
长乐未央m
j2cache可有缓存即将过期时的自动刷新机制,防止缓存过期时瞬间的DB压力
l
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
3.4K
21
J2Cache 2.2.1 正式版发布,开源中国两级缓存框架

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

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

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

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

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

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

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

红薯
2014/01/07
6.9W
113

没有更多内容

加载失败,请刷新页面

加载更多

C#中两个问号共同意味着什么? - What do two question marks together mean in C#?

问题: Ran across this line of code: 跨越这行代码: FormsAuth = formsAuth ?? new FormsAuthenticationWrapper(); What do the two question marks mean, is it some kind of ternary ......

javail
36分钟前
7
0
Elasticsearch - 中文分词器(IK) 安装和简单使用

中文分词器(IK) GitHub下载地址 下载的时候注意一下,最好不要下高版本的,而且最好和你的elasticsearch版本一样,不然后面配置可能会有报错 我用的是 6.3.0 版本,高版本配置会出错 解压后使...

庭前云落
55分钟前
17
0
thinkphp6+vue2.6+element2.13前后端分离解决方案

本人一直在从事PHP后端开发工作,MVC模式写了很多年,总觉得MVC这种分层不太顺手,还有就是后台模板太旧。于是,在2019年3月份,基于thinkphp5+vue-admin-element,写第一版本,主要实现了后...

hardphp
今天
13
0
OSChina 周五乱弹 —— 来自祖安喵对恶魔的祝福

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :+分享洛神有语创建的歌单「我喜欢的音乐」: 《See U for 123 seconds》 - AniFace 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
25
1
如何检查字符串是否为数字(浮点数)? - How do I check if a string is a number (float)?

问题: What is the best possible way to check if a string can be represented as a number in Python? 检查字符串是否可以在Python中表示为数字的最佳方法是什么? The function I curre......

技术盛宴
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部