内存缓存(in-memory cache)

  当建立一个大型Java应用时,引起性能问题大部分是延迟,延迟是指请求和响应之间的时间差,在一个分布式Java系统中引起延迟的原因有:

  1. 从磁盘上加装数据的IO延迟
  2. 跨网络加装数据的IO延迟。
  3. 在分布式锁上的资源争夺。
  4. 垃圾回收引起的暂停。

  典型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才刚刚加入缓存,两种框架相比可见关键性方向的不同:

cache

相关文章和教程:

性能优化的首要法则

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专题