当对Redis进行高频次的命令发送时,由于网络IO的原因,会耗去大量的时间。所以Redis提供了管道技术,就是将命令一次性批量的发送给Redis,从而减少IO。

一、Jedis对redis的管道进行操作

1、获取管道对象

String redisIp = "192.168.110.110";
        int reidsPort = 6379;
Jedis jedis = new Jedis(redisIp, reidsPort);
        Pipeline pl = jedis.pipelined();

获得到Pipeline 对象之后的操作跟redis类似,由于管道的返回对象Response<T>

所以要对应你的命令创建接收集合

2、声明接收对象(注意类型匹配)

HashMap<String, Response<String>> map = new  HashMap<String,Response<String>>(20);
        HashMap<String, Response<Long>> map1 = new  HashMap<String,Response<Long>>(20);

map.put("shiqing1", pl.set("shiqing1", "tiancai"));
        map1.put("shi", pl.sadd("shi", "frefbrier"));
        map.put("shiqing1value", pl.get("shiqing1"));
        map1.put("shiqing", pl.lpush("shiqing", "name"));
        map1.put("qing", pl.hsetnx("qing", "name", "sq"));

现在把所有要执行的命令都放进管道对象中,下一步就是执行这些命令

3、一次性执行所有命令

pl.sync();

这一步就是将所有命令都一次性执行,将结果保存在之前的map和map1中。

System.out.println(map.get("shiqing1").get());
        System.out.println(map1.get("shi").get());
        System.out.println(map.get("shiqing1value").get());
        System.out.println(map1.get("shiqing").get());
        System.out.println(map1.get("qing").get());

结果打印:

OK
0
tiancai
9
0

最后不要忘记关掉管道

try {
pl.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

二、Redisson对redis的批量进行操作

1、获取批量对象

Config config = new Config();

config. useSingleServer().setAddress("127.0.0.1:6379");

RedissonClient redisson = Redisson.create(config);

RBatch batch = redisson.createBatch();

获取到RBatch对象之后,跟jedis一样,要先把要执行的命令都放进Rbatch。

batch.getSet("setkey").readAllAsync();
batch.getList("listkey").readAllAsync();
batch.getMap("hashkey").addAndGetAsync("hashfiled", 2);
batch.getAtomicDouble("key1");
batch.getAtomicLong("key2");
batch.getBitSet("key3");

2、声明接收对象

List<?> res = new ArrayList<?>();

Redisson的管道返回对象是一个任意类型的list

3、一次性执行所有命令

res = batch.execute();

Redisson的批量操作是异步的。

然后就可以拿到对应的结果。res里面包括全部的命令执行结果。

Redis中RedisTemplate和Redisson管道的使用的更多相关文章

  1. .NET客户端实现Redis中的管道(PipeLine)与事物(Transactions)

    序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次性响应多个命令. Redis使用的是客户端-服务器模型和请求/响应协议的T ...

  2. redis-cli 通过管道 --pipe 快速导入数据到redis中

    最近有个需求,需要把五千万条数据批量写入redis中,方法倒是有很多种!效率最高的就是通过redis-cl管道的方式写入 一:先看看命令 cat redis.txt | redis-cli -h 12 ...

  3. 从redis中取值如果不存在设置值,使用Redisson分布式锁【我】

    用到的jar包: <!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> < ...

  4. SpringBoot 中使用redis以及redisTemplate

    1.首先在pom.xml中添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  5. Redis中的管道(PipeLine)与事物(Transactions)

    Redis中的管道(PipeLine)与事物(Transactions) 序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次 ...

  6. JAVA整合Redis使用redisTemplate清除库中的所有键值对数据

    JAVA整合Redis使用redisTemplate清除库中的所有键值对数据,清除所有缓存数据 Set<String> keys = redisTemplate.keys("*& ...

  7. 往redis中存储数据是利用pipeline方法

    在redis中保存数据时,保存和设置有效时间是分开写的话,如果中间出现的异常,这会导致数据永久有效,因此就可以采用pipeline方法. # 创建redis管道对象,可以一次执行多个语句 pipeli ...

  8. 在redis中使用lua脚本

    在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...

  9. spring中redistemplate不能用通配符keys查出相应Key的问题

    有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除.但是在keys(patten+"*")时每次取出的 ...

随机推荐

  1. js 一些基础知识

    数据类型: 作用域 每个函数都有自己的执行环境,执行环境定义了变量有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有 ...

  2. 20165330 2017-2018-2 《Java程序设计》第9周学习总结

    课本知识总结 第十三章 Java网络编程 URL类 URL类是java.net包中的一个重要的类 一个URL对象包含的三个基本信息:协议.地址和资源 协议:必须是URL对象所在的Java虚拟机支持的协 ...

  3. 01. Java序列化与反序列化简介

    Java对象的序列化与反序列化 ; 给大家讲解一下什么是序列化 & 反序列化  当两个进程进行远程通讯的时候,彼此相互可以发送各种类型的数据,如文本,图片,语音和视频等无论是任何类型,最终都会 ...

  4. CGI/FastCGI/mod_php工作原理

    先了解一下普通cgi的工作流程:web server收到用户请求,并把请求提交给cgi程序,cgi程序根据请求提交的参数作相应处理,然后输出标准的html语句返回给web server,web ser ...

  5. 火狐不支持backgroundPosition的js插件

    用js backgroundPositionX,backgroundPositionY设置在firefox下无法识别,用backgroundPosition同样在火狐无法识别.要识别只能用js插件来实 ...

  6. LeetCode题目_Reverse Integer

    最近在LeetCode上做题,写点东西记录一下,虽然自己做的都是些很水的题目,但是重在练手. 题号7:Reverse Integer,题目描述: Reverse digits of an intege ...

  7. oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件

    [本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情 ...

  8. 004-集成maven和Spring boot的profile功能打包

    参考地址:https://blog.csdn.net/lihe2008125/article/details/50443491 一.主要目标 1.通过mvn在命令行中打包时,可以指定相应的profil ...

  9. Spring第五弹—–配置Spring管理的bean的作用域和生命周期

    singleton (默认方式) 在每个Spring IoC容器中一个bean定义只有一个对象实例.默认情况下会在容器启动时初始化bean,但我们可以指定bean节点的lazy-init=“true” ...

  10. CCF 201312-4 有趣的数[dp][难]

    问题描述 试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, ...