如今的系统是愈来愈复杂了,不单单是功能复杂,系统结构也很是复杂,并且常常在一个系统里包含几种不一样语言编写的子系统。例如用 JavaScript 作前端开发、用 Java/PHP 等等作后端,C/C++/Go 等作一些底层模块等等(我只是举个栗子,不要挑起斗争哦)。前端
这些不一样语言编写的子系统常常须要进行一些交互,多数方面的数据交互通常都有对应的技术或者中间件来解决,例如消息中间件、数据库、RESTful 接口、Redis 等等。java
本文主要聚焦于缓存系统的交互。git
在多语言开发的系统中,使用 Redis 这类服务实现缓存交付是很是适合的,但前提是缓存的数据必须是每一种语言都能识别。基于这个前提来考量,JSON、XML 是最合适的格式,由于它们是语言无关的规范,任何语言都能方便的解析这两种格式。而 JSON 相比 XML 又更优一些,由于一样数据用 JSON 表示体积更小。数据库
因此 Redis + JSON 就成为了跨语言环境中的缓存首先解决方案。不过我以前一直在强调单独使用 Redis 作缓存的严重问题(详情):巨大的缓存数据吞吐量会致使 Redis 的数据读取变得异常缓慢,而扩容 Redis 的成本又很是高。json
所以咱们有必要在跨语言环境中使用 J2Cache 。后端
那么问题来了,J2Cache 是一个 Java 开发的缓存桥梁,非 Java 语言的应用怎么用 J2Cache 呢?答案是用不了!数组
可是可行!缓存
咱们假设一个系统中包含两个应用,一个 Java 开发(J应用),另一个随便用什么别的语言开发,例如 Python (P应用)?dom
J应用和 P应用之间须要进行缓存交互,在 J2Cache 中,两个节点之间的数据交互包括:.net
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); }});
序列化的结果:
<code class="language-json">{"@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"}}
而消息通知的数据更为简单:
<code class="language-json">{"keys":[],"operator":1,"src":6160636}
因此,当咱们用其余语言来编写缓存操做的时候,只须要参考 J2Cache 的流程对这两种 JSON 格式的数据进行解析便可。
有兴趣的朋友能够根据本文的思路来开发不一样语言版本的 J2Cache ,我以前已经开发了一个 Python 的版本的雏形 —— Py3Cache。
欢迎你们贡献 https://gitee.com/ld/J2Cache
原文连接:https://my.oschina.net/javayou/blog/2247729