redis的一些知识-使用pipeline来大幅提升redis的处理速度

redis通过tcp来对外提供服务,client通过socket连接发起请求,每个请求在命令发出后会阻塞等待redis服务器进行处理,处理完毕后将结果返回给client。

其实和一个http的服务器类似,一问一答,请求一次给一次响应。而这个过程在排除掉redis服务本身做复杂操作时的耗时的话,可以看到最耗时的就是这个网络传输过程。每一个命令都对应了发送、接收两个网络传输,假如一个流程需要0.1秒,那么一秒最多只能处理10个请求,将严重制约redis的性能。

在很多场景下,我们要完成一个业务,可能会对redis做连续的多个操作,譬如库存减一、订单加一、余额扣减等等,这有很多个步骤是需要依次连续执行的。这样的场景,网络传输的耗时将是限制redis处理量的主要瓶颈。那么此时就可以引入pipeline了,pipeline管道就是解决执行大量命令时、会产生大量同学次数而导致延迟的技术。

其实原理很简单,pipeline就是把所有的命令一次发过去,避免频繁的发送、接收带来的网络开销,redis在打包接收到一堆命令后,依次执行,然后把结果再打包返回给客户端。

拿例子来演示一下:

Long time = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			stringRedisTemplate.opsForValue().increment("pipline", 1);
		}
		System.out.println("耗时:" + (System.currentTimeMillis() - time));
		time = System.currentTimeMillis();
		stringRedisTemplate.executePipelined(new SessionCallback<Object>() {
			@Override
			public <K, V> Object execute(RedisOperations<K, V> redisOperations) throws DataAccessException {
				for (int i = 0; i < 10000; i++) {
					stringRedisTemplate.opsForValue().increment("pipline", 1L);
				}
				return null;
			}
		});
		System.out.println("耗时:" + (System.currentTimeMillis() - time));
这里就是演示不使用和使用pipeline时,执行10000个increment操作的耗时。使用的是RedisTemplate工具类,在创建Springboot工程时勾选redis即可。


通过多次测试,在本机上耗时差距在10倍以上。

需要注意RedisTemplate执行executePipelined方法是有返回值的,List<Object>,这个list里面就是你在execute方法中执行的所有命令的返回值集合。在execute方法中要return null,否则会抛异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯泪小武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值