Ehcache(2.9.x) - API Developer Guide, Cache Usage Patterns
There are several common access patterns when using a cache. Ehcache supports the following patterns:
- Cache-aside (or direct manipulation)
- Cache-as-sor (a combination of read-through and write-through or write-behind patterns)
- Read-through
- Write-through
- Write-behind (or write-back)
- Copy cache
cache-aside
With the cache-aside pattern, application code uses the cache directly.
This means that application code which accesses the system-of-record (SOR) should consult the cache first, and if the cache contains the data, then return the data directly from the cache, bypassing the SOR.
Otherwise, the application code must fetch the data from the system-of-record, store the data in the cache, and then return it.
When data is written, the cache must be updated with the system-of-record. This results in code that often looks like the following pseudo-code:
public class MyDataAccessClass {
private final Ehcache cache; public MyDataAccessClass(Ehcache cache) {
this.cache = cache;
} /* read some data, check cache first, otherwise read from sor */
public V readSomeData(K key) {
Element element;
if ((element = cache.get(key)) != null) {
return (V) element.getValue();
}
// note here you should decide whether your cache
// will cache 'nulls' or not
if ((value = readDataFromDataStore(key)) != null) {
cache.put(new Element(key, value));
}
return value;
} /* write some data, write to sor, then update cache */
public void writeSomeData(K key, V value) {
writeDataToDataStore(key, value);
cache.put(new Element(key, value));
} }
cache-as-sor
The cache-as-sor pattern implies using the cache as though it were the primary system-of-record (SOR). The pattern delegates SOR reading and writing activities to the cache, so that application code is absolved of this responsibility.
To implement the cache-as-sor pattern, use a combination of the following read and write patterns:
- read-through
- write-through or write-behind
Advantages of using the cache-as-sor pattern are:
- Less cluttered application code (improved maintainability)
- Choice of write-through or write-behind strategies on a per-cache basis (use only configuration)
- Allows the cache to solve the "thundering-herd" problem
A disadvantage of using the cache-as-sor pattern is:
- Less directly visible code-path
public class MyDataAccessClass { private final Ehcache cache; public MyDataAccessClass(Ehcache cache) {
cache.registerCacheWriter(new MyCacheWriter());
this.cache = new SelfPopulatingCache(cache);
} /* read some data - notice the cache is treated as an SOR.
* the application code simply assumes the key will always be available
*/
public V readSomeData(K key) {
return cache.get(key);
} /* write some data - notice the cache is treated as an SOR, it is
* the cache's responsibility to write the data to the SOR.
*/
public void writeSomeData(K key, V value) {
cache.put(new Element(key, value);
}
} /**
* Implement the CacheEntryFactory that allows the cache to provide the
* read-through strategy
*/
private class MyCacheEntryFactory implements CacheEntryFactory {
public Object createEntry(Object key) throws Exception {
return readDataFromDataStore(key);
}
} /**
* Implement the CacheWriter interface which allows the cache to provide the
* write-through or write-behind strategy.
*/
private class MyCacheWriter implements CacheWriter {
public CacheWriter clone(Ehcache cache) throws CloneNotSupportedException {
throw new CloneNotSupportedException();
} public void init() { } void dispose() throws CacheException { } void write(Element element) throws CacheException {
writeDataToDataStore(element.getKey(), element.getValue());
} void writeAll(Collection<Element> elements) throws CacheException {
for (Element element : elements) {
write(element);
}
} void delete(CacheEntry entry) throws CacheException {
deleteDataFromDataStore(element.getKey());
} void deleteAll(Collection<CacheEntry> entries) throws CacheException {
for (Element element : elements) {
delete(element);
}
}
}
read-through
The read-through pattern mimics the structure of the cache-aside pattern when reading data. The difference is that you must implement the CacheEntryFactory interface to instruct the cache how to read objects on a cache miss, and you must wrap the Cache instance with an instance of SelfPopulatingCache.
write-through
The write-through pattern mimics the structure of the cache-aside pattern when writing data. The difference is that you must implement the CacheWriter interface and configure the cache for write-through mode.
A write-through cache writes data to the system-of-record in the same thread of execution. Therefore, in the common scenario of using a database transaction in context of the thread, the write to the database is covered by the transaction in scope. For more details (including configuration settings) about using the write-through pattern, see Write-Through and Write-Behind Caches.
write-behind
The write-behind pattern changes the timing of the write to the system-of-record. Rather than writing to the system-of-record in the same thread of execution, write-behind queues the data for write at a later time.
The consequences of the change from write-through to write-behind are that the data write using write-behind will occur outside of the scope of the transaction.
This often-times means that a new transaction must be created to commit the data to the system-of-record. That transaction is separate from the main transaction. For more details (including configuration settings) about using the write-behind pattern, see Write-Through and Write-Behind Caches.
Copy Cache
A copy cache can have two behaviors: it can copy Element instances it returns, when copyOnRead is true and copy elements it stores, when copyOnWrite to true.
A copy-on-read cache can be useful when you can't let multiple threads access the same Element instance (and the value it holds) concurrently. For example, where the programming model doesn't allow it, or you want to isolate changes done concurrently from each other.
Copy on write also lets you determine exactly what goes in the cache and when (i.e., when the value that will be in the cache will be in state it was when it actually was put in cache). All mutations to the value, or the element, after the put operation will not be reflected in the cache.
A concrete example of a copy cache is a Cache configured for XA. It will always be configured copyOnRead and copyOnWrite to provide proper transaction isolation and clear transaction boundaries (the state the objects are in at commit time is the state making it into the cache). By default, the copy operation will be performed using standard Java object serialization. For some applications, however, this might not be good (or fast) enough. You can configure your own CopyStrategy, which will be used to perform these copy operations. For example, you could easily implement use cloning rather than Serialization.
For more information about copy caches, see “Passing Copies Instead of References” in the Configuration Guide for Ehcache.
Ehcache(2.9.x) - API Developer Guide, Cache Usage Patterns的更多相关文章
- Ehcache(2.9.x) - API Developer Guide, Cache Loaders
About Cache Loaders A CacheLoader is an interface that specifies load() and loadAll() methods with a ...
- Ehcache(2.9.x) - API Developer Guide, Cache Decorators
About Cache Decorators Ehcache uses the Ehcache interface, of which Cache is an implementation. It i ...
- Ehcache(2.9.x) - API Developer Guide, Cache Eviction Algorithms
About Cache Eviction Algorithms A cache eviction algorithm is a way of deciding which element to evi ...
- Ehcache(2.9.x) - API Developer Guide, Cache Manager Event Listeners
About CacheManager Event Listeners CacheManager event listeners allow implementers to register callb ...
- Ehcache(2.9.x) - API Developer Guide, Cache Event Listeners
About Cache Event Listeners Cache listeners allow implementers to register callback methods that wil ...
- Ehcache(2.9.x) - API Developer Guide, Cache Exception Handlers
About Exception Handlers By default, most cache operations will propagate a runtime CacheException o ...
- Ehcache(2.9.x) - API Developer Guide, Cache Extensions
About Cache Extensions Cache extensions are a general-purpose mechanism to allow generic extensions ...
- Ehcache(2.9.x) - API Developer Guide, Write-Through and Write-Behind Caches
About Write-Through and Write-Behind Caches Write-through caching is a caching pattern where writes ...
- Ehcache(2.9.x) - API Developer Guide, Transaction Support
About Transaction Support Transactions are supported in versions of Ehcache 2.0 and higher. The 2.3. ...
随机推荐
- 语义Web和本体开发相关技术
在技术实现方面,语义Web和本体理论的研究日趋成熟,已经有许多成熟的工具或程序接口,诸如Jena.OWL API等API是系统实现的关键技术.这里介绍系统的可行性分析以及系统开发设计的关键技术. 1 ...
- 解北大OJ1088滑雪问题的记录
问题: Time Limit:1000MS Memory Limit:65536K Total Submissions:67600 Accepted:24862 Description Mic ...
- 基于OpenCV的iOS开发笔记(1)
本系列文章采用的的开发环境为: 1)Xcode 6 2)OpenCV for iOS 3.0.0 -------------------分割线---------------------------- ...
- python中objects的all和get方法的区别
all返回的是QuerySet: get返回的是模型对象. 想要获取查询结果的字段值: 从QuerySet中获取对象可以通过for in的形式遍历,之后通过对象获取对象的具体值: get 返回的是对象 ...
- python的sys.path
python检测不到模块: No module named 是因为模块没有在sys.path中,查看sys.path的方法 import sys sys.path 发现确实没有加载到模块. windo ...
- assert函数(python)
assert语句: 用以检查某一条件是否为True,若该条件为False则会给出一个AssertionError. 用法: assert type(x)=int and x>=0 如果不满足后面 ...
- Java中单例设计模式总结
两种单例常见的实现方式: 1:懒汉的设计模式,在第一次调用的时候才完成相关的初始化操作 懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间.当然,如果一直没有人 ...
- C++ 预编译头文件
1.解决什么问题? C++ 编译器是单独,分别编译的,每个cpp文件,进行预编译(也就是对#include,define 等进行文本替换),生成编译单元.编译单元是一个自包含文件,C++编译器对编译单 ...
- Amazon DynamoDB 概览
1. 什么是Amazon DynamoDB DynamoDB 是一种快速.全面受管的 NoSQL 数据库服务,它能让用户以简单并且经济有效地方式存储和检索任何数据量,同时服务于任何程度的请求流量.所有 ...
- SQL Server中DML语句要申请的锁
对于select语句: 1.当採用表扫描时,会直接锁定page,而不是锁定详细的某条记录,所以会有这些锁: A.数据库S锁 B.表的IS锁 C.页的S锁 2.当採用索引来查找数据时,会锁定详细的记录, ...