广告
返回顶部
首页 > 资讯 > 数据库 >redis中pipeline的介绍
  • 330
分享到

redis中pipeline的介绍

2024-04-02 19:04:59 330人浏览 薄情痞子
摘要

今天小编就为大家带来一篇介绍Redis中pipeline的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。一、pipeline出现的背景:redis执行一条命令有四个过程:发送命令、

今天小编就为大家带来一篇介绍Redis中pipeline的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。

一、pipeline出现的背景:

redis执行一条命令有四个过程:发送命令、命令排队、命令执行、返回结果;

这个过程称为Round trip time(简称RTT, 往返时间),mget mset有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个问题。

二、pepeline的性能

1、未使用pipeline执行N条命令

redis中pipeline的介绍

2、使用了pipeline执行N条命令

redis中pipeline的介绍

3、两者性能对比

redis中pipeline的介绍

小结:这是一组统计数据出来的数据,使用Pipeline执行速度比逐条执行要快,特别是客户端与服务端的网络延迟越大,性能体能越明显。

下面贴出测试代码分析两者的性能差异:

	@Test
	public void pipeCompare() {
		Jedis redis = new Jedis("192.168.1.111", 6379);
		redis.auth("12345678");//授权密码 对应redis.conf的requirepass密码
		Map<String, String> data = new HashMap<String, String>();
		redis.select(8);//使用第8个库
		redis.flushDB();//清空第8个库所有数据
		// hmset
		long start = System.currentTimeMillis();
		// 直接hmset
		for (int i = 0; i < 10000; i++) {
			data.clear();  //清空map
			data.put("k_" + i, "v_" + i);
			redis.hmset("key_" + i, data); //循环执行10000条数据插入redis
		}
		long end = System.currentTimeMillis();
		System.out.println("    共插入:[" + redis.dbSize() + "]条 .. ");
		System.out.println("1,未使用PIPE批量设值耗时" + (end - start) / 1000 + "秒..");
		redis.select(8);
		redis.flushDB();
		// 使用pipeline hmset
		Pipeline pipe = redis.pipelined();
		start = System.currentTimeMillis();
		//
		for (int i = 0; i < 10000; i++) {
			data.clear();
			data.put("k_" + i, "v_" + i);
			pipe.hmset("key_" + i, data); //将值封装到PIPE对象,此时并未执行,还停留在客户端
		}
		pipe.sync(); //将封装后的PIPE一次性发给redis
		end = System.currentTimeMillis();
		System.out.println("    PIPE共插入:[" + redis.dbSize() + "]条 .. ");
		System.out.println("2,使用PIPE批量设值耗时" + (end - start) / 1000 + "秒 ..");
//--------------------------------------------------------------------------------------------------
		// hmget
		Set<String> keys = redis.keys("key_*"); //将上面设值所有结果键查询出来
		// 直接使用Jedis hgetall
		start = System.currentTimeMillis();
		Map<String, Map<String, String>> result = new HashMap<String, Map<String, String>>();
		for (String key : keys) {
			//此处keys根据以上的设值结果,共有10000个,循环10000次
			result.put(key, redis.hgetAll(key)); //使用redis对象根据键值去取值,将结果放入result对象
		}
		end = System.currentTimeMillis();
		System.out.println("    共取值:[" + redis.dbSize() + "]条 .. ");
		System.out.println("3,未使用PIPE批量取值耗时 " + (end - start) / 1000 + "秒 ..");

		// 使用pipeline hgetall
		result.clear();
		start = System.currentTimeMillis();
		for (String key : keys) {
			pipe.hgetAll(key); //使用PIPE封装需要取值的key,此时还停留在客户端,并未真正执行查询请求
		}
		pipe.sync();  //提交到redis进行查询
		
		end = System.currentTimeMillis();
		System.out.println("    PIPE共取值:[" + redis.dbSize() + "]条 .. ");
		System.out.println("4,使用PIPE批量取值耗时" + (end - start) / 1000 + "秒 ..");

		redis.disconnect();
	}

redis中pipeline的介绍

三、原生批命令(mset, mget)与Pipeline对比

1、原生批命令是原子性,pipeline是非原子性

(原子性概念:一个事务是一个不可分割的最小工作单位,要么都成功要么都失败。原子操作是指你的一个业务逻辑必须是不可拆分的. 处理一件事情要么都成功,要么都失败,原子不可拆分)

2、原生批命令一命令多个key, 但pipeline支持多命令(存在事务),非原子性

3、原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成

四、Pipeline正确使用方式

使用pipeline组装的命令个数不能太多,不然数据量过大,增加客户端的等待时间,还可能造成网络阻塞,可以将大量命令的拆分多个小的pipeline命令完成。

1、Jedis中的pipeline使用方式

大家知道redis提供了mset、mget方法,但没有提供mdel方法,如果想实现,可以借助pipeline实现。

2、Jedis中的pipeline使用步骤:

  • 获取jedis对象(一般从连接池中获取)

  • 获取jedis对象的pipeline对象

  • 添加指令

  • 执行指令

测试类方法:

	 @Test
	public void testCommond() {
		// 工具类初始化
		JedisUtils jedis = new JedisUtils("192.168.1.111", 6379, "12345678");

		for (int i = 0; i < 100; i++) {
			// 设值
			jedis.set("n" + i, String.valueOf(i));
		}
		System.out.println("keys from redis return =======" + jedis.keys("*"));

	}

	// 使用pipeline批量删除
	 @Test
	public void testPipelineMdel() {
		// 工具类初始化
		JedisUtils jedis = new JedisUtils("192.168.1.111", 6379, "12345678");
		List<String> keys = new ArrayList<String>();
		for (int i = 0; i < 100; i++) {
			keys.add("n" + i);
		}
		jedis.mdel(keys);
		System.out.println("after mdel the redis return ---------" + jedis.keys("*"));
	}

JedisUtils下的mdel方法:

	
	public boolean mdel(List<String> keys) {
		Jedis jedis = null;
		boolean flag = false;
		try {
			jedis = pool.getResource();//从连接借用Jedis对象
			Pipeline pipe = jedis.pipelined();//获取jedis对象的pipeline对象
			for(String key:keys){
				pipe.del(key); //将多个key放入pipe删除指令中
			}
			pipe.sync(); //执行命令,完全此时pipeline对象的远程调用 
			flag = true;
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return flag;
	}

使用pipeline提交所有操作并返回执行结果:

@Test
	public void testPipelineSyncAll() {
		// 工具类初始化
		Jedis jedis = new Jedis("192.168.1.111", 6379);
		jedis.auth("12345678");
		// 获取pipeline对象
		Pipeline pipe = jedis.pipelined();
		pipe.multi();
		pipe.set("name", "james"); // 调值
		pipe.incr("age");// 自增
		pipe.get("name");
		pipe.discard();
		// 将不同类型的操作命令合并提交,并将操作操作以list返回
		List<Object> list = pipe.syncAndReturnAll();

		for (Object obj : list) {
			// 将操作结果打印出来
			System.out.println(obj);
		}
		// 断开连接,释放资源
		jedis.disconnect();
	}

五、redis事务

pipeline是多条命令的组合,为了保证它的原子性,redis提供了简单的事务。

1、redis的简单事务,

一组需要一起执行的命令放到multi和exec两个命令之间,其中multi代表事务开始,exec代表事务结束。

redis中pipeline的介绍

2、停止事务discard

redis中pipeline的介绍

3、命令错误,语法不正确,导致事务不能正常结束

redis中pipeline的介绍

4、运行错误,语法正确,但类型错误,事务可以正常结束

redis中pipeline的介绍

5、watch命令:

使用watch后, multi失效,事务失效

redis中pipeline的介绍

WATCH的机制是:在事务EXEC命令执行时,Redis会检查被WATCH的key,只有被WATCH的key从WATCH起始时至今没有发生过变更,EXEC才会被执行。如果WATCH的key在WATCH命令到EXEC命令之间发生过变化,则EXEC命令会返回失败。

看完上述内容,你们对redis中的pipeline大概了解了吗?如果想了解更多相关文章内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: redis中pipeline的介绍

本文链接: https://www.lsjlt.com/news/35442.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis中pipeline的介绍
    今天小编就为大家带来一篇介绍redis中pipeline的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。一、pipeline出现的背景:redis执行一条命令有四个过程:发送命令、...
    99+
    2022-10-18
  • redis介绍
    Ø开源的(BSD协议),使用ANSI  C 编写,基于内存的且支持持久化,高性能的Key-Value的NoSQL数据库 Ø支持数据结构类型丰富,有如 字符串(strings), 散列(hashes), 列表(lists),...
    99+
    2015-04-14
    redis介绍
  • 【redis】Redis专题介绍
    1、Redis 持久化 Redis 提供了不同级别的持久化方式,Redis持久化也是消耗内存的操作,特别是写比较频繁的数据库;了解redis数据库持久化的工作方式,选择合适的数据持久化方式。 RDB持久化方式能够在指定的时间间隔能对你的数据...
    99+
    2020-09-20
    【redis】Redis专题介绍
  • Redis中的Cluster集群介绍
    这篇文章主要介绍“Redis中的Cluster集群介绍”,在日常操作中,相信很多人在Redis中的Cluster集群介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redi...
    99+
    2022-10-18
  • Redis集群中的节点介绍
    这期内容当中的小编将会给大家带来有关Redis集群中的节点介绍,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Redis 集群中的节点分为主节点(master)和从节点(slave),其...
    99+
    2022-10-18
  • Redis中锁的介绍和使用
    其实说多线程修改数据也不合适,毕竟redis服务端是单线程的,所有命令串行执行,只是在客户端并发发送命令的时候,导致串行的命令一些排列问题和网络时间差等造成数据不一致。本文虽然是数字的加减,但是为了说明锁的...
    99+
    2022-10-18
  • Redis的LRU机制介绍
    在Redis中,如果设置的maxmemory,那就要配置key的回收机制参数maxmemory-policy,默认volatile-lru,参阅Redis作者的原博客:antirez weblog >...
    99+
    2022-06-04
    机制 Redis LRU
  • Redis的持久化介绍
    一、持久化的作用1.什么是持久化redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上2.持久化的实现方式快照:某时某刻数据的一个完成备份    -mysql的Dump &n...
    99+
    2022-10-18
  • redis持久化的介绍
    1. RDB 1.1 RDB简介 RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。 工作机制:每隔一段时间,就把内存中的数据保...
    99+
    2022-10-18
  • Redis中GETBIT和SETBIT的详细介绍
    本篇内容介绍了“Redis中GETBIT和SETBIT的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2022-10-18
  • 初学Redis(一)--介绍
    1. 什么是NoSql NoSQL(Not Only SQL):不仅仅是SQL NoSQL是一项全新的数据库理念 NoSQL属于非关系型的数据库,没有表的概念,目的只是存储数据。 2. 为什么要使用NoSQL 使用NoSQL数据库为了...
    99+
    2018-09-14
    初学Redis(一)--介绍
  • Redis-Predis 扩展介绍
    主要功能 支持各个版本的 Redis(从 2.0 到 3.0 以及 unstable) 使用哈希方式或用户自定义方式进行集群中节点的客户端分片 支持 Redis-cluster(集群) (Redis>= 3.0). 支...
    99+
    2015-04-16
    Redis-Predis 扩展介绍
  • Redis的数据结构介绍
    今天就跟大家聊聊有关Redis的数据结构介绍,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。redis提供了持久化机制和数据同步,避免了宕机后的雪崩的...
    99+
    2022-10-18
  • Redis性能监控的介绍
    本篇内容主要讲解“Redis性能监控的介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis性能监控的介绍”吧! redis_...
    99+
    2022-10-18
  • redis中key命令的介绍和使用
    这篇文章将为大家详细讲解有关redis中key命令的介绍和使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、概述:进入redis-cli之后,我们通常比较关心的是有哪...
    99+
    2022-10-18
  • 深入理解redis中multi与pipeline
    背景 由于对redis缓存中数据有批量操作,例如预热缓存数据,或者在列表页批量去获取缓存数据,在使用了multi批量提交事务后,发现redis压力高居不下,而使用了pipeline...
    99+
    2022-11-12
  • redis介绍以及安装
        前面2篇文章我们简单了解了memcached的安装以及结合php。现在我介绍另一个nosql键值数据库redis,通过学习查资料发现redis使用的场合比me...
    99+
    2022-10-18
  • redis 五种类型介绍
    1.  Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问...
    99+
    2022-10-18
  • redis启动流程介绍
    1. 准备运行环境 * 设置oom handler,zmalloc分配内存失败时调用 * 初始化随机种子,用于生成随机数 * 将server参数初始化为默认值 * 创建命令与处理函数的映射表 2. 解析...
    99+
    2022-06-04
    流程 redis
  • Redis哨兵模式介绍
    哨兵简介 主机"宕机" 将宕机的 master 下线找一个 slave 作为 master通知所有的 slave 连接新的 master启动新的 master ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作