在spring中利用Guava实现本地Cache的具体配置 第二篇

通过直接实现org.springframework.cache.Cache 接口来管理和实现缓存


springframework 为我们提供了一套公用的接口模版标准 本文将通过Guava工程 利用单例实现Cache 接口来完成本地缓存的配置

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
public class GuavaCacheUtil implements Cache {
private static Logger log = LoggerFactory.getLogger(GuavaCacheUtil.class);
private static final Object NULL_HOLDER = new NullHolder();
private static final String DEFAULT_NAME = "system_cache";
private final String name;
private final com.google.common.cache.Cache<Object, Object> cache;
private final boolean allowNullValues;
private static GuavaCacheUtil guavaCacheUtil = new GuavaCacheUtil();
public static GuavaCacheUtil builder() {
return guavaCacheUtil;
}
private GuavaCacheUtil() {
this(DEFAULT_NAME, CacheBuilder.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.HOURS).build());
}
private GuavaCacheUtil(String name, com.google.common.cache.Cache<Object, Object> cache) {
this(name, cache, true);
}
private GuavaCacheUtil(String name, com.google.common.cache.Cache<Object, Object> cache, boolean allowNullValues) {
Assert.notNull(name, "Name must not be null");
Assert.notNull(cache, "Cache must not be null");
this.name = name;
this.cache = cache;
this.allowNullValues = allowNullValues;
}
@Override
public String getName() {
return this.name;
}
@Override
public Object getNativeCache() {
return this.cache;
}
@Override
public ValueWrapper get(Object key) {
key = getKey(key.toString());
Object value = this.cache.getIfPresent(key);
log.info("getKey = {}, getObject = {}", key, JsonUtil.objectToJson(value));
return toWrapper(value);
}
@Override
public <T> T get(Object key, Class<T> aClass) {
key = getKey(key.toString());
T value = fromStoreValue(this.cache.getIfPresent(key), aClass);
log.info("getKey = {}, getObject = {}", key, JsonUtil.objectToJson(value));
return value;
}
@Override
public <T> T get(Object o, Callable<T> callable) {
return null;
}
@Override
public void put(Object key, Object value) {
key = getKey(key.toString());
this.cache.put(key, toStoreValue(value));
log.info("getKey = {}, getObject = {}", key, JsonUtil.objectToJson(value));
}
@Override
public ValueWrapper putIfAbsent(Object key, Object value) {
PutIfAbsentCallable callable = new PutIfAbsentCallable(value);
try {
Object result = this.cache.get(key, callable);
return (callable.called ? null : toWrapper(result));
} catch (ExecutionException e) {
throw new IllegalStateException(e);
}
}
@Override
public void evict(Object key) {
this.cache.invalidate(key);
log.info("deleteKey = {}", key);
}
@Override
public void clear() {
this.cache.invalidateAll();
log.info("clearAll");
}
private ValueWrapper toWrapper(Object value) {
return (value != null ? new SimpleValueWrapper(fromStoreValue(value, null)) : null);
}
private static class NullHolder implements Serializable {
}
private Object toStoreValue(Object userValue) {
if (this.allowNullValues && userValue == null) {
return NULL_HOLDER;
}
return userValue;
}
private <T> T fromStoreValue(Object storeValue, Class<T> aClass) {
if (this.allowNullValues && storeValue == NULL_HOLDER) {
return null;
}
if (storeValue != null && aClass != null && !aClass.isInstance(storeValue)) {
throw new IllegalStateException("Cached value is not of required type [" + aClass.getName() + "]: " + storeValue);
}
return (T) storeValue;
}
private class PutIfAbsentCallable implements Callable<Object> {
private final Object value;
private boolean called;
public PutIfAbsentCallable(Object value) {
this.value = value;
}
@Override
public Object call() throws Exception {
this.called = true;
return toStoreValue(this.value);
}
}
private String getKey(String key) {
return name + ":" + key;
}
}

测试代码 以及测试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static String testCachePut(){
Cache cache = GuavaCacheUtil.builder();
cache.put("user_id:1","20");
String user_id = cache.get("user_id:1", String.class);
System.out.println(user_id);
return user_id;
}
public static String testCacheGet(){
Cache cache = GuavaCacheUtil.builder();
cache.put("user_id:2","30");
String user_id = cache.get("user_id:1", String.class);
System.out.println(user_id);
System.out.println(cache.get("user_id:2",String.class));
return user_id;
}
public static void main(String[] args) {
testGuavaCachePut();
testGuavaCacheGet();
}

测试结果 : 测试结果