天天看點

Java8優化優先檢索緩存的代碼

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", );

        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, );
            }
        }
        return data;
    }

    private String getDateFromDB() {
        //todo 可以從資料庫、接口進行檢索資料

        return "Hello World";
    }
}
           

繼續閱讀