场景

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

  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. vue2.0+Element UI 实现动态表单(点击按钮增删一排输入框)

    对于动态增减表单项,Element UI 官方文档表单那一节已经介绍得很清楚了,我之前没有看见,绕了很多弯路,这里针对点击按钮增删一排输入框的问题做一个总结. 效果图如下 存在一排必填的姓名与手机号, ...

  2. String 的格式化

    使用场景 用于生成redis等key-value 结构的key的格式化,方便管理 eg: String.format(RedisKeys.PURCHASE_ADD_BABY_LOCK,form.get ...

  3. Request 对象的主要方法

    setAttribute(String name,Object):设置名字为 name 的 request 的参数值 getAttribute(String name):返回由 name 指定的属性值 ...

  4. [Computer Vision]Harris角点检测的详细推导

    Harris角点检测 思想 为什么要检测角点呢?因为角点的特征比较明显.进行角点检测的朴素思想是利用图像梯度,也就是根据图像强度的变化来寻找角点.如图所示 这里举了个例子,给定一个小的区域(Patch ...

  5. Python爬虫小白入门(七)爬取豆瓣音乐top250

      抓取目标: 豆瓣音乐top250的歌名.作者(专辑).评分和歌曲链接 使用工具: requests + lxml + xpath. 我认为这种工具组合是最适合初学者的,requests比pytho ...

  6. (六)maven 聚合和继承

    项目目录 my_test 聚合pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  7. Docker镜像与容器的常用操作

    Docker镜像加速配置:Docker镜像常用操作:Dcoker容器常用操作. 镜像加速器 国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器.国内很多云服务商都提供了国内加 ...

  8. 通过char与varchar的区别,学习可变长的字符类型

    转自http://www.uphtm.com/database/232.html 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  9. 操作系统 I/O 全流程详解

    我们之前的文章提到了操作系统的三个抽象,它们分别是进程.地址空间和文件,除此之外,操作系统还要控制所有的 I/O 设备.操作系统必须向设备发送命令,捕捉中断并处理错误.它还应该在设备和操作系统的其余部 ...

  10. Jenkins中agent的使用

    [前言] 很多小伙伴都已经会搭建Jenkins环境了,都想要用Jenkins来运行自动化接口,可我们的Jenkins在linux服务器上.服务器上默认的python包是2.6的这样不是很好,那么这边就 ...