面试题:手写LRU(今日头条面试题)
面试题:手撕LFU,要求get和put都为O(1)
一、Guava Cache适用场景
1、你愿意消耗一部分内存来提升速度;
2、你已经预料某些值会被多次调用;
3、缓存数据不会超过内存总量;
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好。
二、Guava Cache有以下两种创建方式
Guava提供两种不同的方法来加载数据:
CacheLoader:在build cache的时候定义一个CacheLoader来获取数据,适用的情况:有固定的方式可以根据key来加载或计算value的值,比如从数据库中获取数据
Callable:在get的时候传入一个Callable对象,适用的情况:如果从缓存中获取不到数据,则另外计算一个出来,并把计算结果加入到缓存中
本项目采用的是第一种方式:
public class TokenCache {
private static Logger logger = LoggerFactory.getLogger(TokenCache.class);
public static final String TOKEN_PREFIX = "token_";
//生成本地缓存,初始化为1000,最大为10000,当超过10000时就会使用LRU算法(最小使用算法)进行清除,有效期是12小时
private static LoadingCache<String,String> localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).expireAfterAccess(12, TimeUnit.HOURS) //缓存有效期12小时
.build(new CacheLoader<String, String>() {
//默认的数据加载实现,当调用get取值的时候,如果key没有对应的值,就调用这个方法进行加载.
@Override
public String load(String s) throws Exception {
return "null";
}
});
public static void setKey(String key,String value){
localCache.put(key,value);
}
public static String getKey(Strin