J2Cache 和普通缓存框架有何不一样,它解决了什么问题?

很多人看到 J2Cache 第一眼时,会认为这就是一个普普统统的缓存框架,和例如 Ehcache、Caffeine 、Spring Cache 之类的项目没什么区别,无非是造了一个新的轮子而已。事实上彻底不是一回事!数据库

目前缓存的解决方案通常有两种:缓存

内存缓存(如 Ehcache) —— 速度快,进程内可用
集中式缓存(如 Redis)—— 可同时为多节点提供服务
现有的缓存框架已经很是成熟并且优秀,J2Cache 无意造一个新的轮子,它要解决的几个问题以下:性能优化

使用内存缓存时,一旦应用重启后,因为缓存数据丢失,缓存雪崩,给数据库形成巨大压力,致使应用堵塞
使用内存缓存时,多个应用节点没法共享缓存数据
使用集中式缓存,因为大量的数据经过缓存获取,致使缓存服务的数据吞吐量太大,带宽跑满。现象就是 Redis 服务负载不高,可是因为机器网卡带宽跑满,致使数据读取很是慢
在遭遇问题一、2 时,不少人天然而然会想到使用 Redis 来缓存数据,所以就难以免的致使了问题3的发生。服务器

当发生问题 3 时,又有不少人想到 Redis 的集群,经过集群来下降缓存服务的压力,特别是带宽压力。架构

但其实,这个时候的 Redis 上的数据量并不必定大,仅仅是数据的吞吐量大而已。并发

我们假设这样一个场景:框架

有这么一个网站,某个页面天天的访问量是 1000万,每一个页面从缓存读取的数据是 50K。缓存数据存放在一个 Redis 服务,机器使用千兆网卡。那么这个 Redis 一天要承受 500G 的数据流,至关于平均每秒钟是 5.78M 的数据。而网站通常都会有高峰期和低峰期,两个时间流量的差别多是百倍以上。咱们假设高峰期每秒要承受的流量比平均值高 50 倍,也就是说高峰期 Redis 服务每秒要传输超过 250 兆的数据。请注意这个 250 兆的单位是 byte,而千兆网卡的单位是“bit” ,你懂了吗? 这已经远远超过 Redis 服务的网卡带宽。运维

因此若是你能发现这样的问题,通常你会这么作:分布式

升级到万兆网卡 —— 这个有多麻烦,相信不少人知道,特别是一些云主机根本没有万兆网卡给你使用(运维工程师通常会给这样的建议)
多个 Redis 搭建集群,将流量分摊多多台机器上
若是你采用第2种方法来解决上述的场景中碰到的问题,那么你最好准备 5 个 Redis 服务来支撑。在缓存服务这块成本直接攀升了 5 倍。你有钱固然没任何问题,可是结构就变得很是复杂了,并且可能你缓存的数据量其实不大,1000 万高频次的缓存读写 Redis 也能轻松应付,但是由于带宽的问题,你不得不付出 5 倍的成本。微服务

那么 J2Cache 的用武之处就在这里。

若是咱们不用每次页面访问的时候都去 Redis 读取数据,那么 Redis 上的数据流量至少下降 1000 倍甚至更多,以致于一台 Redis 能够轻松应付。

J2Cache 其实不是一个缓存框架,它是一个缓存框架的桥梁。它利用现有优秀的内存缓存框架做为一级缓存,而把 Redis 做为二级缓存。全部数据的读取先从一级缓存中读取,不存在时再从二级缓存读取,这样来确保对二级缓存 Redis 的访问次数降到最低。

有人会质疑说,那岂不是应用节点的内存占用要飙升?个人答案是 —— 如今服务器的内存都是几十 G 打底,多则百 G 数百 G,这点点的内存消耗彻底不在话下。其次一级缓存框架能够经过配置来控制在内存中存储的数据量,因此不用担忧内存溢出的问题。

剩下的另一个问题就是,当缓存数据更新的时候,怎么确保每一个节点内存中的数据是一致的。而这一点算你问到点子上了,这偏偏是 J2Cache 的核心所在。

J2Cache 目前提供两种节点间数据同步的方案 —— Redis Pub/Sub 和 JGroups 。当某个节点的缓存数据须要更新时,J2Cache 会经过 Redis 的消息订阅机制或者是 JGroups 的组播来通知集群内其余节点。当其余节点收到缓存数据更新的通知时,它会清掉本身内存里的数据,而后从新从 Redis 中读取最新数据。

clipboard.png

ache 缓存数据读写的闭环。

为何不用 Ehcache 的集群方案?

对 Ehcache 比较熟悉的人还会问的就是这个问题,Ehcache 自己是提供集群模式的,能够在多个节点同步缓存数据。可是 Ehcache 的作法是将整个缓存数据在节点间进行传输。如我们前面的说的,一个页面须要读取 50K 的缓存数据,当这 50K 的缓存数据有更新时,那么须要在几个节点间传递整个 50K 的数据。这也会形成应用节点间大量的数据传输,这个状况彻底不可控。

补充:固然这个单个数据传输量自己并不比使用 J2Cache 多,可是 ehcache 利用 jgroups 来同步数据的作法,在实际测试过程当中发现可靠性仍是略低,并且 jgroups 的同步数据在云主机上没法使用。

而 J2Cache 传输的仅仅是缓存的 key 而已,所以相比 Ehcache 的集群模式,J2Cache 要传输的数据极其小,对节点间的数据通讯彻底不会产生大的影响。

那如何学习才能快速入门并精通呢?

当真正开始学习的时候不免不知道从哪入手,致使效率低下影响继续学习的信心。

但最重要的是不知道哪些技术须要重点掌握,学习时频繁踩坑,最终浪费大量时间,因此有一套实用的视频课程用来跟着学习是很是有必要的。

为了让学习变得轻松、高效,今天给你们免费分享一套阿里架构师传授的一套教学资源。加群:874811168免费获取如下资料 帮助你们在成为架构师的道路上披荆斩棘。

这套视频课程详细讲解了(Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构)等成为架构师必备的内容!

clipboard.png

相关文章
相关标签/搜索