乘风波浪的姐姐们那么多, 缓存模式(Caching Pattern)来介绍

目的

缓存降低耗时接口的结果, 重复查询时候可以减少时间消耗

例子代码

最近 <乘风破浪的姐姐们> 开播, 我作为一名资深宅男, 肯定不会放过这个综艺, 当我们想要查询根据 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> {

    @Override
    public T queryFromCache(String key) {
        return (T) App.CACHE_MAP.get(key);
    }

    @Override
    public 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 = queryAction.queryFromCache(key);
        if (resultFromCahce != null) {
            return resultFromCahce;
        }
        T result = queryAction.query(r);
        queryAction.putToCache(key, result);
        return result;
    }
}

这里有一个比较耗时的方法:

public class UserService {

    @SneakyThrows
    public 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>() {
    @Override
    public String query(String userId) {
        return UserService.queryUserName(userId);
    }
}, "123", "userid-123"));

课后作业

  1. 将抽象缓存类换成 redis 实现
  2. 思考如何保证缓存与接口的一致性
  3. 了解缓存雪崩, 缓存穿透, 缓存击穿, 并改进文中的代码

微信:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值