最近看了一道面试题(先查缓存,缓存中没有再查数据库),其实很久以前就遇到过,我以为已经掌握了,
但是今天再看,分析起来总觉得有些吃力,有种拿着答案分析过程的感觉,没有真正理解。
根据我的经验,应该在大脑中形成一个足够抽象的结构图,下次遇到这类问题,都可以套用。
想问问 v 友们如何分析这类问题?思维过程是怎样的?会在大脑中构建图像吗?
private final Map<Long, Shop> shopCache = new ConcurrentHashMap<>();
public Shop getShopById(Long shopId) {
// 1. 先查本地缓存
Shop shop = shopCache.get(shopId);
if (shop != null) {
return shop;
}
// 2. 同一个 shopId 加锁
synchronized (getLock(shopId)) {
// 3. 双重检查
shop = shopCache.get(shopId);
if (shop != null) {
return shop;
}
// 4. 缓存没有,查数据库
shop = shopMapper.selectById(shopId);
// 5. 放入本地缓存
if (shop != null) {
shopCache.put(shopId, shop);
}
return shop;
}
}
private final Map<Long, Object> locks = new ConcurrentHashMap<>();
private Object getLock(Long shopId) {
return locks.computeIfAbsent(shopId, k -> new Object());
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.