JK.Li 登录

Redis 与 Java 静态变量缓存去读记录

Posted by 2017/5/8 15:32:43  •  Author:JK.Li

测试数据:4198条的一个数据列表。

Redis采用Key Value 存储形式,直接缓存4198条的一个List对象。

下文说到的Code代表的是一个唯一的Key.


分别测试1000次、10000次读取耗时:

测试一:

    通过Code获取对象,流程:从redis取出所有数据,遍历查找所需的数据,查询到后,放入redis,下次查找直接从redis返回:

public DictionaryDto getDictionaryByCode(String code) {        
    DictionaryDto dictionaryDto = (DictionaryDto) setCacheKey(DICTIONARY_SINGLE_PREFIX + code).getCacheContent();
    if (dictionaryDto == null) {
        dictionaryDto = getAll().stream().filter(t -> t.getCode().equals(code)).findFirst().get();
        setCacheKey(DICTIONARY_SINGLE_PREFIX + code).setCacheContent(dictionaryDto).save();
    }
    return dictionaryDto;
}

   耗时:4385ms,41728ms


测试二:

 通过Code获取对象,流程:从redis取出所有数据放入静态变量,下次查找出在静态变量中遍历查询,不再连接redis:

private static List<DictionaryDto> tempList = null;
public DictionaryDto getDictionaryByCode(final String code) {
    if(tempList == null){
        tempList = getAll();
    }
    return tempList.stream().filter(t -> t.getCode().equals(code)).findFirst().get();
}

   耗时:229ms,307ms


测试三:

 通过Code获取对象,流程:从redis取出所有数据放入静态变量Hashtable中:

private static Hashtable<String, DictionaryDto> tempHt = new Hashtable<>();
public DictionaryDto getDictionaryByCode(String code) {
    if (tempHt.containsKey(code)) {
        return tempHt.get(code);
    } else {
        DictionaryDto dictionaryDto = getAll().stream().filter(t -> t.getCode().equals(code)).findFirst().get();
        tempHt.put(code, dictionaryDto);
        return dictionaryDto;
    }
}

   耗时:207ms,224ms


先把数据全部放入Hashtable中:

private static Hashtable<String, DictionaryDto> tempHt = null;
public DictionaryDto getDictionaryByCode(String code) {
    if (tempHt == null) {
        tempHt = new Hashtable<>();
        List<DictionaryDto> list = getAll();
        for (DictionaryDto dictionaryDto : list) {
            tempHt.put(code, dictionaryDto);
        }
    }
    return tempHt.get(code);
}

耗时:204ms,210ms

Tagged: redis  java  

Comments (0)  • 

0 评论列表

发表评论

京公网安备 11010702001442号