现在的系统是越来越复杂了,不仅仅是功能复杂,系统结构也非常复杂,而且经常在一个系统里包含几种不同语言编写的子系统。例如用 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 中,两个节点之间的数据交互包括:
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
Original url: Access
Created at: 2018-10-18 09:59:39
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论