首页 > 数据库 >Redis批量查询

Redis批量查询

时间:2023-01-29 21:11:55浏览次数:64  
标签:Pipeline 批量 Redis pipeline 查询 poolConfig key hget

Redis 批量处理

在开发中,有时需要对Redis 进行大批量的处理。

比如Redis批量查询多个Hash。如果是在for循环中逐个查询,那性能会很差。

这时,可以使用 Pipeline (管道)。

Pipeline (管道)

Pipeline (管道) 可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间,而且 Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。

Redis批量查询多个Hash

Redis批量查询多个Hash,可以使用 Pipeline (管道)。源码见: PipelineBase.java。

hget()方法,跟普通hash的hget()一样。

    public Response<String> hget(String key, String field) {
        this.getClient(key).hget(key, field);
        return this.getResponse(BuilderFactory.STRING);
    }

示例:

public void testPipLine() {
        Map<String, Response<String>> responseMap = new HashMap<>();
        //try-with-resources, 自动关闭资源
        //先连接jedis,再拿到 pipeline
        try (Jedis jedis = getJedis();
            Pipeline pipeline = jedis.pipelined()) {
            for (String id : idList) {
                //前缀加唯一id
                String key = KEY_PREFIX +  id;
                //使用pipeline.hget查询hash的数据
                Response<String> response = pipeline.hget(key, field);
                responseMap.put(id, response);
            }
            pipeline.sync();
        } catch (Exception ex) {
            log.error("responses error.", ex);
        }

        Map<String, String> map = new HashMap<>();
        //组装map。response.get()有在pipeline关闭后才能执行
        responseMap.forEach((k,response) -> map.put(k, response.get()));

        map.forEach((k,v)-> System.out.println(k+",val:"+v));

}


  private static Pool<Jedis> jedisPool = null;

  /**
   * 连接redis,获取jedisPool
   * @return
   */
    public Jedis getJedis() {
        if (jedisPool == null) {
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(maxTotal);
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMaxWaitMillis(maxWaitMillis);
            poolConfig.setTestOnBorrow(testOnBorrow);
            //配置可以写在配置中心/文件
            jedisPool = new JedisPool(poolConfig, host, port, timeout, password, database);
        }
        return jedisPool.getResource();
    }

参考资料

https://redis.io/docs/manual/pipelining/
https://www.cnblogs.com/expiator/p/11127719.html

标签:Pipeline,批量,Redis,pipeline,查询,poolConfig,key,hget
From: https://www.cnblogs.com/expiator/p/17073834.html

相关文章

  • 神马权重是什么?神马权重怎么在线查询?
    神马搜索是阿里旗下基于UC浏览器的搜索引擎,依托阿里大数据,专注移动互联网,打通淘宝、优酷等多维全场景数据端,智能化满足用户搜索需求。而UC是移动端浏览器产品中月活人数排名......
  • Table类:后台自定义条件筛选查询
    1、首先需要在控制器中定义开启变量,例如控制器:dayrui/App/Demo/Controllers/Admin/Home.php//数据表初始化protectedfunction_init($data){$this->......
  • 学习笔记——redis事务、乐观锁、悲观锁
    2023-01-29一、redis事务与乐观锁相关命令1、redis事务(1)redis事务的含义redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不......
  • .net core 使用redis
    参照:.NET6使用Redis-Lulus-博客园(cnblogs.com)九、.netcore(.NET6)添加通用的Redis功能-WeskyNet-博客园(cnblogs.com)......
  • abp分页查询时,如果IQueryable返回的是IQueryable<DTO>,不能使用.OrderBy().PageBy()
    今天在做分页查询时,需要联表查询,然后将 this.GetQueryableForMobile(input)方法的返回结果改成了IQueryable<ExternalAssignmentWorkOrderDetailListDto>,而不是具体的某......
  • redis的简易哨兵模式
    某一天突然收到通知说redis的服务器挂了,因为是支付服务用到的redis,所以赶紧去查一下对服务流程有没有影响,结果是一切正常,松了一口气。后面看了一下代码发现里面自己封装的......
  • 复杂条件查询功能
     复杂条件查询功能-分析   复杂条件查询功能-代码实现-每页数据条件查询packagecom.example.day17_case.service.impl;importcom.example.day17_case.dao......
  • C++ Day10 统计圣经文本的词频 &文本查询程序
    一、编程题--统计圣经出现的单词以及词频统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频,输入:某篇文章的绝对路径;输出:词典(词典中的内容为每一行都是一个“单词......
  • 使用Python实现高效摸鱼,批量识别银行卡号码并且自动写入Excel表格
    每当有新员工入职,人事小姐姐都要收集大量的工资卡信息,并且生成Excel文档,看到小姐姐这么辛苦,我就忍不住要去帮她了…于是我用1行代码就实现了自动识别银行卡信息并且自......
  • SpringBoot中配置Redis
    SpringBoot中整合Redis缓存背景:工作中需要用到缓存之前都是用ConcurrentHashMap公司不让用redis那我就小试牛刀一下前端的App、网页在登录时,或是用户在进行一些敏感......