Java8优化优先检索缓存的代码

来源:互联网 发布:手机淘宝怎么评论差评 编辑:程序博客网 时间:2024/05/01 22:08

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";    }}