内存缓存(in-memory cache)
当建立一个大型Java应用时,引起性能问题大部分是延迟,延迟是指请求和响应之间的时间差,在一个分布式Java系统中引起延迟的原因有:- 从磁盘上加装数据的IO延迟
- 跨网络加装数据的IO延迟。
- 在分布式锁上的资源争夺。
- 垃圾回收引起的暂停。
典型Ping时间是:本地机器是57µs;局域网是300 µs;从伦敦到纽约是100ms;对于1Gb网络,网络数据传输是每秒25MB – 30MB。对于10GB网络是每秒250MB – 350MB。使用SATA 3.0接口的SSD硬盘数据传输是每秒500-600MB。如果你有1G以上数据需要处理,磁盘延迟会严重影响应用性能。
硬件上最低延迟是内存,典型的内存缓存是每秒3-5 GB,能够随着CPU扩展。如果你有两个处理器,你就能每秒10GB,如果有4CPU就能获得 20GB. 有一个内存基准测试称为STREAM (http://www.cs.virginia.edu/stream/) 是测试许多计算机的内存吞吐量,一些在大量CPU帮助下能够实现每秒TB级别的吞吐量。
因此可以总结如下:
- 内存是快的: 为了高性能,你需要在内存中处理数据。
- 网络是慢的: 通过网络传输数据会严重影响性能,包括数据库连接池。
在许多应用中,应用的快速性能与数据实时更新需要寻找一个平衡点,有时你需要大胆地使用缓存,但是你可能会发现有旧脏数据现象发生,当然可以再抓取更新数据,但是可能会牺牲一些性能,你能,你可以鱼和熊掌兼得,那么就要花费购买更多硬件,增加软件的复杂性。
内存缓存原来作用是提高数据库访问性能。但是缓存不是数据库遮羞布,架构上缓存引入有着重要意义:状态对象:数据库的替代者。
缓存实际是内存,将状态置于内存而不是数据库,不但性能提升,还提高软件的可伸缩性和扩展性,直至轻松发展为分布式系统或云计算,这种缓存称为内存缓存(in-memory cache)或称 数据网格In-Memory-Data-Grid (IMDG);Java EE 7引入分布式 弹性缓存Elastic Caching ,作为其云核心战略的一部分。 云计算是一种计算和存储分离的模型,云计算本质是分布式可伸缩的内存计算,可见Amazon弹性缓存介绍。
当我们将DDD领域模型加载到内存中以后,我们就不再面向关系数据库中数据表编程,而是真正直接面向模型对象编程。Java内存模型优点:基于内存的并发模型,多线程机制,大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁。 多核并行计算模型 基于线程的异步模型(Domain Events)。
Twitter从Ruby转向JAVA的实践证明:Cache缓存 + JVM微调是Java/JVM的核心竞争力,这也是最容易被我们忽视的,因为很多使用Java系统(包括Spring + Hibernate)只是当作SQL语句的包装器来使用,负载主要集中在数据库上,根本不会使用In-memory Cache。
Jdon认为对象缓存恰好是领域模型和Java内存模型之间的衔接物,通过引入缓存,将领域模型落实到计算机平台上,如下图,基于此理念JdonFramework特点就是DDD + Cache,而Spring 3才刚刚加入缓存,两种框架相比可见关键性方向的不同:
相关文章和教程:
性能优化的首要法则
Web缓存教程
数据库缓存几种方式
可扩展伸缩架构中的状态
为什么计算科学中最难的两件事是命名和缓存失效
Netflix的EVCache缓存分布式复制架构
为什么要使用数据网格Data Grid
数据网格介绍
Hazelcast入门教程
Redis Cluster快速安装指南
12306铁路售票系统核心开源中间件Geode介绍
分布式缓存介绍
内存领域对象+事件驱动 = 量身定制的高并发架构
Martin Fowler推荐的领域模型in-memory架构:LMAX架构
12306火车票订票系统的伸缩扩展
结合Java内存模型和领域模型的开源框架JdonFramework
Avanza银行非推倒重来式的读/写伸缩扩展
Red Hat为Java EE 7提交新的缓存规范标准
Spring 3.1 终于加入了Cache支持
ddd之ehcache和no ddd 之memcached扩展性的比较
使用Varnish加速Web性能
Http缓存Last-Modified、ETag和Expires的Java终结解决之道
关于缓存的思考
重用Session提高https性能
Cache-Control: immutable
数据库也可以像电脑一样组装:使用Kafka建立关系数据库 – Robert Yokota
更多缓存Cache专题
Redis
Redis安装
使用Spring Data + Redis实现缓存
基于Spring+redis实现pub/sub
apache camel和 redis
Redis Cluster快速安装指南
介绍Redis数据结构set
介绍Redis数据结构hash
Redis如何简化微服务设计模式
Redis专题
相关专题
性能专题
对象生命周期专题讨论
内存泄漏
集群(cluster)
数据网格
更多缓存Cache专题