作者:三千仇人-奈我何 | 来源:互联网 | 2023-09-15 22:52
目的
缓存降低耗时接口的结果, 重复查询时候可以减少时间消耗
例子代码
最近 <乘风破浪的姐姐们> 开播, 我作为一名资深宅男, 肯定不会放过这个综艺, 当我们想要查询根据 id 获取每个姐姐的信息的时候, 可能会比较耗时, 而这些信息基本不会变, 这时候就是缓存模式出场了.
缓存模式
定义一个查询:
public interface QueryAction<T, R> {T queryFromCache(String key);T query(R r);void putToCache(String key, T t);
}
定义一个抽象的缓存实现:
public abstract class AbstractQueryAction<T, R> implements QueryAction<T, R> {&#64;Overridepublic T queryFromCache(String key) {return (T) App.CACHE_MAP.get(key);}&#64;Overridepublic void putToCache(String key, T t) {App.CACHE_MAP.put(key, t);}
}
定义一个模板:
public class CacheTemplate {public <T, R> T queryByCaching(QueryAction<T, R> queryAction, R r, String key) {T resultFromCahce &#61; queryAction.queryFromCache(key);if (resultFromCahce !&#61; null) {return resultFromCahce;}T result &#61; queryAction.query(r);queryAction.putToCache(key, result);return result;}
}
这里有一个比较耗时的方法:
public class UserService {&#64;SneakyThrowspublic static String queryUserName(String userId) {Thread.sleep(1000);if(Objects.equals("1",userId)) {return "黄圣依";}if(Objects.equals("2",userId)) {return "伊能静";}if(Objects.equals("3",userId)) {return "张雨绮";}if(Objects.equals("4",userId)) {return "宁静";}return "codog代码狗";}
}
使用:
System.out.println(cacheTemplate.queryByCaching(new AbstractQueryAction<String, String>() {&#64;Overridepublic String query(String userId) {return UserService.queryUserName(userId);}
}, "123", "userid-123"));
课后作业
- 将抽象缓存类换成 redis 实现
- 思考如何保证缓存与接口的一致性
- 了解缓存雪崩, 缓存穿透, 缓存击穿, 并改进文中的代码
微信: