场景

在开发的时候经常会遇到批量取缓存的问题,例如查询商品信息

  1. 传入一个商品Id列表,查询Redis数据存在则放入返回列表
  2. 不存在的数据查找数据库,并放入Redis
  3. 上面两步数据整合返回

    伪代码为
	list.ForEach(str->{
dto = redis.get(str);
if(dto != null){
resultList.add(dto);
}else{
mustQuerySQL.add(str);
}
if(CollectionUtils.isNotEmpty(mustQuerySQL)){
querysqlList = querySQL(mustQuerySQL);
querySqlList.ForEach(dto->{
resultList.add(dto);
redis.put(dto);
})
}
})
return resultList;

问题是在项目中经常使用这样的模式,有什么办法可以简化步骤呢?

模板方法模式

模板方法模型是一种行为设计模型。模板方法是一个定义在父类别的方法,在模板方法中会呼叫多个定义在父类别的其他方法,而这些方法有可能只是抽象方法并没有实作,模板方法仅决定这些抽象方法的执行顺序,这些抽象方法的实作由子类别负责,并且子类别不允许覆写模板方法。

我们可以使用模板方法模式,具体的从Redis中获取数据以及SQL中获取数据和SQL中数据放入Redis让子类进行实现。

实现

代码如下:

public abstract class RedisUtil<T>  {

    public final List<T> getList(List<String> list){
List<T> resultList = new ArrayList<>();
List<String> mustQuery = new ArrayList<>();
list.forEach(str->{
T o = queryForRedis(str);
if(o != null){
resultList.add(o);
}else {
mustQuery.add(str);
}
});
if(CollectionUtils.isNotEmpty(mustQuery)) {
List<T> sql = queryForSQL(mustQuery);
sql.forEach(dto->{
setForRedis(dto);
resultList.add(dto);
});
}
return resultList;
} protected abstract T queryForRedis(String str); protected abstract List<T> queryForSQL(List<String> list); protected abstract void setForRedis(T t);
}

子类只需要使用匿名类即可实现,但是这样在代码中会有这样的代码

RedisUtil<String> redisUtil = new RedisUtil<String>() {
@Override
protected String queryForRedis(String str) {
return null;
} @Override
protected List<String> queryForSQL(List<String> list) {
return null;
} @Override
protected void setForRedis(String s) { }
};

占据大量的代码段,看起来并不优雅,如何优雅的实现呢?

优化

//TODO

Redis批量查询模板的更多相关文章

  1. .NET Core 实现 Redis 批量查询指定格式的Key

    一. 问题场景 Redis 作为当前最流行的内存型 NoSQL 数据库,被许多公司所使用,作为分布式缓存.我们在实际使用中一般都会为 key 带上指定的前缀或者其他定义的格式.当由于我们程序出现bug ...

  2. Redis批量查询删除KEYS

    对腾讯云的Redis集群不支持很多指令(config get * .flushdb.flushall.等相关指令) redis指令限制:https://www.qcloud.com/document/ ...

  3. stackExchange.redis 实现模糊匹配批量查询

    如果使用redis的频次较高,那么业务中经常会出现需要根据关键字进行批量查询,所以总结一下StackExchange中使用批量查询的方法(如果数据量很大,那么在redis中模糊查询很耗时,请慎用!) ...

  4. redis批量删除key 远程批量删除key

    一.遇到的问题 在开发的过程中,经常会遇到要批量删除某种规则的key,如缓存的课程数据“course-课程uid”,其中课程uid是变量,我们需要删除"course-*"这一类的数 ...

  5. Redis批量删除key的小技巧,你知道吗?

    在使用redis的过程中,经常会遇到要批量删除某种规则的key,但是redis提供了批量查询一类key的命令keys或scan,没有提供批量删除某种规则key的命令,怎么办?看完本文即可,哈哈. 本文 ...

  6. redis范围查询应用 数据库 数据库学习 Redis redis范围查询的方法

    redis范围查询应用. 需求 根据IP找到对应的城市 原来的解决方案 oracle表(ip_country): 查询IP对应的城市: 1.把a.b.c.d这样格式的IP转为一个数字,例如为把210. ...

  7. Zabbix 4.0 API 实践,主机/主机群组 批量添加模板和删除模板

    场景 我们日常在管理Zabbix 的时候,经常会需要批量添加模板和批量删除模板,Zabbix页面是提供的批量链接的功能,但是它链接的也只是当前页的主机,我们想扩展这个功能,在链接的时候,可以批量链接整 ...

  8. 未注册wang域名批量查询工具

    一.支持规则查询 可自定义生成域名进行查询,可生成任意位数的字母数字域名,根据[声母].[韵母]生成单拼,双拼,三拼等域名,还可根据字典生成,支持全拼.首拼识别,全国城市区号.城市全拼.城市首拼.热门 ...

  9. myBatis批量查询操作,xml中使用foreach案例

    使用场景:有一个订单表,实体类为OrderBase.java,订单有个状态为status值可能为"1,2,3,4,5,6",现在需要查询状态为"2,3,4"的订 ...

随机推荐

  1. php使用json_encode中遇见问题?

    注:php版本5.4下,不支持json_encode对中文的处理,要么升级php版本. json_encode($value,$options) 其中有2个比较常用到的参数: 1.JSON_UNESC ...

  2. 关于mybatis使用小于号大于号出错的解决方案

    原文链接:https://blog.csdn.net/weixin_38061311/article/details/99943807 mybatis 使用的xml的映射文件, 所以里面的标签都是在& ...

  3. BUAA_OO_2020_Unit2_总结博客

    BUAA_OO_2020_Unit2_总结 2020年春季学期第八周,OO第二单元落下帷幕,三次多线程任务作罢,萌新在OO的世界里又迈出了艰难但有意义的一步,下作总结: 一.三次作业设计策略 回顾三次 ...

  4. Azure AD B2C(二)使用Azure AD B2C为ASP.NET Core 应用设置社交帐户(邮箱)登录/注册

    一,引言 上次关于Azure AD B2C 讲到一些概念,有介绍到,Azure AD B2C 也是一种身份验证的解决方案,但是它运行客户使用其首选的社交,企业或者本地账户标识对应用程序和API进行单一 ...

  5. 多页面共用sessionStorage的实现(转载)

    sessionStorage的局限: sessionStorage是页面级别的,仅在一个标签页生效,如果同一个浏览器同时打开多个标签页,且都访问同一个域名,sessionStorage是不会在这多个标 ...

  6. pyhton 月份和天数的计算

    http://stackoverflow.com/questions/546321/how-do-i-calculate-the-date-six-months-from-the-current-da ...

  7. C# 9.0 新特性之只读属性和记录

    阅读本文大概需要 2 分钟. 大家好,这是 C# 9.0 新特性系列的第 4 篇文章. 熟悉函数式编程的童鞋一定对"只读"这个词不陌生.为了保证代码块自身的"纯洁&quo ...

  8. GitHub 热点速览 Vol.25:距离优雅编程你差个它

    作者:HelloGitHub-小鱼干 摘要:如何优雅地夸一个程序员呢?vscode-rainbow-fart 作为一个彩虹屁的项目,深得程序员心,能在你编程时疯狂称赞你的除了你自己,还有它.除了鼓励之 ...

  9. SpringMVC 学习笔记(三)数据的校验

    34. 尚硅谷_佟刚_SpringMVC_数据绑定流程分析.avi 例如:在jsp中输入一个String字符串类型,需要转换成Date类型的流程如下 convertservice对传入的数据进行转换 ...

  10. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...