Cache实现
Play容器启动时(play.Play.start()),调用play.cache.Cache.init()
检查application.conf配置文件中,是否开启了memcached
a) 未开启memcached则开启一个ehcache实例
b) 若开启memcached但连接memcached失败,则会启动一个ehcache
Cache使用memcached配置
配置一个memcached
memcached=disabled (开启 enabled,关闭disabled)
memcached.host= 127.0.0.1:11211
memcached.user=username
memcached.password=password
配置多个memcached
memcached=disabled (开启 enabled,关闭disabled)
memcached.1.host= 127.0.0.1:11211
memcached.2.host= 127.0.0.1:11211
play中Ehcache的配置
配置文件playframework/src/ehcache.xml
maxElementsInMemory="10000" //内存中最大缓存对象数
eternal="false" //Element是否永久有效,一但设置了,timeout将不起作用
timeToIdleSeconds="120" //设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds="120" //设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大。
overflowToDisk="false" // 当缓存中元素的数量超过限制时,就把这些元素持久化到硬盘,如果overflowToDisk是false ,那么maxElementsOnDisk 的设置就没有什么意义了
maxElementsOnDisk="10000000" //持久化该缓存的元素到硬盘上的最大数量
diskPersistent="false" //Whether the disk store persists between restarts of the Virtual Machine.
diskExpiryThreadIntervalSeconds="120 " //磁盘失效线程运行时间间隔,默认是120秒
memoryStoreEvictionPolicy="LRU" //当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)
自定义ehcache配置
在app目录下面,新建ehcache配置的xml文件ehcache.xml
自定缓存实现Cache
自定义一个playPlugin
重写 play.PlayPlugin.onLoad()
在onLoad方法中,设置Cache属性 play.cache.Cache.forcedCacheImpl
参见源码: play.cache.Cache.init()和play.Play.start()
Play自带的controller缓存
play自带了controller缓存,play.cache.CacheFor 在controller方法上加上注解后,play将会为方法提供缓存(源码:play.mvc.ActionInvoker.invoke(Request, Response))
// Check the cache (only for GET or HEAD)
if ((request.method.equals("GET") || request.method.equals("HEAD")) && actionMethod.isAnnotationPresent(CacheFor.class)) {
cacheKey = actionMethod.getAnnotation(CacheFor.class).id();
if ("".equals(cacheKey)) {
cacheKey = "urlcache:" + request.url + request.querystring;
}
actionResult = (Result) play.cache.Cache.get(cacheKey);
}