1、模拟Redis的缓存客户端
提供优化首先从缓存获取、缓存取不到则从数据获取并更新缓存的方法。
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;
/**
* @author: wangyingjie1
* @version: 1.0
* @createdate: 2017-09-21 10:52
*/
public class RedisCache {
//模拟Redis 缓存
private Map<String, Object> map = new HashMap<>();
/**
* 首先从缓存获取、缓存取不到则从数据获取并更新缓存
*
* @param supplier
* @param key 缓存key
* @param exp 过期时间
* @param <T>
* @return
*/
public <T> T getCacheFirst(Supplier<T> supplier, String key, long exp) {
T obj = (T) getObject(key);
if (obj != null) {
return obj;
}
obj = supplier.get();
if (Objects.nonNull(obj)) {
setObject(key, obj, exp);
}
return obj;
}
/**
* @param key
* @param obj
* @param exp redis失效时间
* @param <T>
*/
public <T> void setObject(String key, T obj, long exp) {
map.put(key, obj);
}
public Object getObject(String key) {
return map.get(key);
}
}
2、测试代码
import org.junit.Test;
import java.util.Objects;
/**
* 使用Java8优化优先查缓存的代码
*
* @author: wangyingjie1
* @version: 1.0
* @createdate: 2017-09-21 10:50
*/
public class RedisCacheTest {
private RedisCache redisCache = new RedisCache();
//优化缓存的使用
@Test
public void testCache() {
//java8 before
Object data = getFirstCacheData();
System.out.println("data=====>" + data);
//java8
String value = redisCache.getCacheFirst(() -> getDateFromDB(), "key", 100);
System.out.println("value=====>" + value);
}
//优先从缓存获取数据,如果缓存不存在则从数据库、接口进行获取数据
private Object getFirstCacheData() {
Object value1 = redisCache.getObject("key1");
String data = null;
if (Objects.isNull(value1)) {
data = getDateFromDB();
if (Objects.isNull(null)) {
redisCache.setObject("key1", data, 10000);
}
}
return data;
}
private String getDateFromDB() {
//todo 可以从数据库、接口进行检索数据
return "Hello World";
}
}