1.缓存基本知识
参考博客:http://carlosfu.iteye.com/blog/2241010
1.1 基本概念
1).什么是缓存(cache)?
Cache(缓存): 从cpu的一级和二级缓存、Internet的DNS、到浏览器缓存都可以看做是一种缓存。
维基百科: 写道
2). Cache hit(缓存命中)和Cahe miss(缓存未命中)
3).缓存算法
LRU(Least Recently Used) FIFO(First Input First Output)Least Frequently Used(LFU) 等等
4).序列化
serialization-and-deserialization(序列化与反序列化):可以参考:http://www.infoq.com/cn/articles/serialization-and-deserialization
后面也有单独文章去分析。
5).Scale Up (垂直扩容) 和 Scale out (水平扩容)
驴拉车,通常不是把一头驴养壮(有极限),而通常是一群驴去拉(当然每个个体也不能太差)。
服务器也是一样的道理,至少互联网是这样:
6). Write-through 和 write-behind
1.2 缓存的种类
1). LocalCache(独立式-本地cache): 例如Ehcache、BigMemory Go
(1) 缓存和应用在一个JVM中。
(2) 缓存间是不通信的,独立的。
(3) 弱一致性。
2. Standalone(单机):
(1) 缓存和应用是独立部署的。
(2) 缓存可以是单台。(例如memcache/redis单机等等)
(3) 强一致性
(4) 无高可用、无分布式。
3. Distributed(分布式):例如Redis-Cluster, memcache集群等等
(1) 缓存和应用是独立部署的。
(2) 多个实例。(例如memcache/redis等等)
(3) 强一致性或者最终一致性
(4) 支持Scale Out、高可用。
1.3 数据层访问速度:(作为开发人员要记住这些量级)
1.4 缓存相关问题
- 缓存系列文章--4.缓存常用更新策略对比。
- 缓存系列文章--7.穿透问题。
- 缓存系列文章--8.雪崩问题-stampeding herd(惊逃的野牛)
- 缓存系列文章--9.无底洞问题(multiget hole)
2. cache的应用
2.1. ehcache,bigmemory使用
详细参考专栏: http://www.iteye.com/blogs/subjects/bigmemory
其中重点理解的点:
1) ehcache架构图
- ehcache-core:API,标准缓存引擎,RMI复制和Hibernate支持
- ehcache:分布式Ehcache,包括Ehcache的核心和Terracotta的库
- ehcache-monitor:企业级监控和管理
- ehcache-web:为Java Servlet Container提供缓存、gzip压缩支持的filters
- ehcache-jcache:JSR107 JCACHE的实现
- ehcache-jgroupsreplication:使用JGroup的复制
- ehcache-jmsreplication:使用JMS的复制
- ehcache-openjpa:OpenJPA插件
- ehcache-server:war内部署或者单独部署的RESTful cache server
- ehcache-unlockedreadsview:允许Terracotta cache的无锁读
- ehcache-debugger:记录RMI分布式调用事件
- Ehcache for Ruby:Jruby and Rails支持
2).Ehcache和bigmemeory关系
Terracotta是一款由美国Terracotta公司开发的著名开源Java集群平台,Terracotta公司在2009年收购了著名的Java开源缓存项目Ehcache以及Java任务调度项目Quartz。经过对该项目的深度整合,Terracotta推出了易用性更高的分布式缓存 bigmemeory GO,bigmemory MAX 等等,官网:http://terracotta.org/
Get standalone in-memory data management on a single application server.
Leverage All the RAM on Your Machine without Garbage Collection Pauses
BigMemory Go lets you keep all application data instantly available in your server's ultra-fast machine memory. If you're still using only a few gigs of RAM for fear of garbage collection performance hits, then it’s time to add the power of BigMemory Go.
3).Ehcache BigMemory: 摆脱GC困扰,参考下图:
3.1)、MemStore(通常指堆内存储)
(1) 堆内存储,受制于GC
(2) 理论上最快,可以存储序列化和非序列化数据
(3) 线程安全
(4) 如果使用了OffHeapStore,那么MemStore保存The hottest subset of data from thre OffHeapStore.
3.2)、OffHeapStore(堆外内存:被称为BigMemory):
有关堆外内存:可以参考如下文章:http://calvin1978.blogcn.com/articles/directbytebuffer.html
只在企业版本的Ehcache(BigMemory)中提供,原理是利用nio的DirectByteBuffers实现,比存储到磁盘 上快,而且完全不受GC的影响,可以保证响应时间的稳定性;但是direct buffer的在分配上的开销要比 heap buffer大,而且要求必须以字节数组方式存储,因此对象必须在存储过程中进行序列化,读取则进 行反序列化操作,它的速度大约比堆内存储慢一个数量级。
注:direct buffer不受GC影响,但是direct buffer归属的的JAVA对象是在堆上且能够被GC回收的,一旦 它被回收,JVM将释放direct buffer的堆外空间。)
(1) 堆外内存,不受制于GC
(2) 只在Bigmemory中能用,Ehcache不支持。
(3) 堆外内存使用字节码存储,所以只能存储序列化数据。
(4) 速度极快 us级别,能扛着很高QPS
4).bigmemory接入
参考:http://carlosfu.iteye.com/blog/2237511