内存缓存(in-memory cache)
有些程序,需要保存一些数据在以备下次使用,然而在下次使用时再次获取,开销会比较大,如:数据源是数据库,就需要去数据库搜索,然后获取数据返回;数据源是储存在硬盘的文件,需要从硬盘一个个byte地将数据读取进内存;数据源是从外部API获取,则需要在调用API后等待回应才能获得数据,再次获取数据的开销比较大,不想每次都重新获取一次数据,可以将这些数据暂时存放在内存的缓存(in-memory cache)里,下次想用的时候就不用从外部再次搜索,直接拿来用就好了。
性能很重要的一个评价指标就是latency,在请求和响应之间的时间差,以一个Java分布式系统为例,引起延迟的原因有:
1.从磁盘上加载数据的IO延迟
2.跨网络加载数据的IO延迟
3.在分布式锁上的资源争夺
4.垃圾回收引起的延迟
内存比硬盘,网络IO要快很多,同时通过网络传输数据会严重影响性能,包括数据库连接池,内存缓存最开始的作用是提高数据库访问性能。内存缓存,就是内存,将状态置于内存不是数据库,不但性能提升,还提高软件的可伸缩性和扩展性,直至轻松发展为分布式系统或云计算,java ee 7 引入分布式弹性缓存elastic caching,云计算是一种计算和存储分离的模型,云计算本质是分布式可伸缩的内存计算。
twitter 从Ruby转向java实践证明:Cache缓存+JVM微调是具有核心竞争力,很多Java系统(Spring框架,mybatis框架,Hibernate框架等)只是当作SQL语句的包装器来使用,负载主要集中在数据库上,一般不使用in-memory Cache。