缓存清除策略,官方文档给出的有
- LRU - least recently used(最近最少使用)
- LFU - least frequently used(最不经常使用)
- FIFO - first in first out, the oldest element by creation time(清除最早缓存的数据,不关心是否经常使用)
1实体要序列化
public class User implements Serializable
{
private static final long serialVersionUID = 3681423205727147793L;
2、配置ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- updateCheck
属性默认为true
,updateCheck
表示项目启动后, HTTP 请求 ehcache 官方检查是否要更新 -->
<ehcache updateCheck="false">
<diskStore path="java.io.tempdi" />
<defaultCache maxElementsInMemory="10000" memoryStoreEvictionPolicy="LRU" eternal="false" timeToIdleSeconds="1" timeToLiveSeconds="5" overflowToDisk="false" diskPersistent="false" />
<!-- 测试 --> <!-- name:缓存名称 -->
<cache name="ehcacheGO" memoryStoreEvictionPolicy="LRU" maxElementsInMemory="1" eternal="false" timeToIdleSeconds="7200" timeToLiveSeconds="7200" overflowToDisk="true" />
</ehcache>
(1) defaultCache属性的作用
- maxElementsInMemory="10000" <!-- 最大内存占用,超出后缓存保存至文件 -->
- memoryStoreEvictionPolicy="LRU" <!-- 缓存废弃策略,LRU表示最少使用的优先清除,此值对应之前3种策略 -->
- eternal="false"
- timeToIdleSeconds="1" <!-- 空闲时间,超出此时间未使用缓存自动清除 -->
- timeToLiveSeconds="5" <!-- 清除时间,缓存保留的最长时间 -->
- overflowToDisk="false" <!-- 是否往硬盘写缓存数据 -->
- diskPersistent="false"
3.建立ehcache的工具类
package com.xinyi.msrv.util;
import java.net.URL;
import com.xinyi.msrv.bean.OtherMessage;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
public class EhcacheUtil {
//配置文件路径
private static final String path = "/ehcache.xml";
private URL url;
private CacheManager manager;
private static EhcacheUtil ehCache;
private EhcacheUtil(String path) {
url = getClass().getResource(path);
manager = CacheManager.create(url);
}
public static EhcacheUtil getInstance() {
if (ehCache == null) {
ehCache = new EhcacheUtil(path);
}
return ehCache;
}
public void put(String cacheName, String key, Object value) {
Cache cache = manager.getCache(cacheName);
Element element = new Element(key, value);
cache.put(element);
}
public Object get(String cacheName, String key) {
Cache cache = manager.getCache(cacheName);
Element element = cache.get(key);
return element == null ? null : element.getObjectValue();
}
public Cache get(String cacheName) {
return manager.getCache(cacheName);
}
public void remove(String cacheName, String key) {
Cache cache = manager.getCache(cacheName);
cache.remove(key);
}
public static void main(String[] args) {
System.out.println("UserController showUser");
OtherMessage message = new OtherMessage();
message.setFirst("22");
message.setKeyword1("33");
//将查询到的结果放入缓存
EhcacheUtil.getInstance().put("ehcacheGO", "userEch", message);
System.out.println("UserController showUser");
System.out.println("use cacher");
//从缓存中取数据
OtherMessage user=(OtherMessage)EhcacheUtil.getInstance().get("ehcacheGO", "userEch");
System.out.println(user.getKeyword1());
}
}
4.使用ehcache
(1)将数据存入缓存
@RequestMapping("/showUser")
public String toIndex(HttpServletRequest request, Model model) {
System.out.println("UserController showUser");
int id = Integer.parseInt(request.getParameter("id"));
User user = userService.getUserById(id);
//将查询到的结果放入缓存
EhcacheUtil.getInstance().put("ehcacheGO", "userEch", user);
model.addAttribute("user", user);
return "showUser";
}
(2)将数据从缓存取出
@RequestMapping("/getUser")
public String toEhcahe(HttpServletRequest request, Model model) {
System.out.println("use cacher");
//从缓存中取数据
User user=(User)EhcacheUtil.getInstance().get("ehcacheGO", "userEch");
model.addAttribute("userCache", EhcacheUtil.getInstance().get("ehcacheGO", "userEch"));
model.addAttribute("user", user);
return "showUser";
}
资料参考:https://www.cnblogs.com/austinspark-jessylu/p/6229334.html