redis 使用管道提升写入的性能[pipeline]

看了手册的都知道multi这个命令的作用就好比是mysql的事务的功能,但是大家都知道事务吗,就是在操作的过程中,把整个操作当作一个原子来处理,避免由于中途出错而导致最后产生的数据不一致,而产生BUG ,Mysql的事务功能可以做到这点,但是在redis中的multi,手册中说是把多个命令当作个事务来处理,但是在真正的测试之后发现并没有所说的事务的功能,个人经过测试发现,只有把他watch命令结合起来用,方可显现出其具有事务的功能,所以这点很是迷惑,关键是有一点很诧异,当启用了multi命令之后整个redis的读写会相对于没有使用multi的的读写要慢一点,我通过读写100W条数据发现,他们的速度相差600多毫秒,搞不清楚为什么相差这么多!个人觉得没有必要,还是不要使用这个multi的为好!
至于redis的pipeline命令,看手册都知道,它能够让(多条)执行命令简单的,更加快速的发送给服务器,但是没有任何原子性的保证,能不能保证原子性这个我没有测试,但是这个速度我测试了下,确实是吃了一惊啊!相比于没有使用pipeline的读写操作,使用了pipeline命令的操作要快12倍不止啊!这个效率高的。。。。
下面是我的测试代码:欢迎拍砖。

<?php

set_time_limit(0);

//计时函数
function G($start,$end=‘‘,$dec=4)
{
    static $_info = array();
    if (!empty($end))
    {
        if(!isset($_info[$end])) $_info[$end] = microtime(TRUE);
        $sconds = number_format(($_info[$end]-$_info[$start]), $dec) * 1000;
        echo "{$sconds}ms<br />";
    }
    else
    {
        $_info[$start] = microtime(TRUE);
    }
}

$redis = new Redis();
$redis->connect(‘127.0.0.1‘);

G(‘t‘);
$redis->pipeline();
for ($i=0; $i < 100000 ; $i++) {
   $redis->set("test_{$i}", pow($i, 2));
   $redis->get(‘test_{$i}‘);
}
$redis->exec();
G(‘t‘,‘r‘);

G(‘m‘);
$redis->multi();
for ($i=0; $i < 100000 ; $i++) {
   $redis->set("test_{$i}", pow($i, 2));
   $redis->get(‘test_{$i}‘);
}
$redis->exec();
G(‘m‘,‘i‘);

$redis->flushdb();

G(‘f‘);
for ($i=0; $i < 100000 ; $i++) {
   $redis->set("test_{$i}", pow($i, 2));
   $redis->get(‘test_{$i}‘);
}
G(‘f‘,‘e‘);

?>

这是返回的结果:
//pipeline的执行时间
1926.5ms
//multi的执行时间
27725.7ms
//正常情况下
24832.1ms

时间: 2024-10-26 14:01:44

redis 使用管道提升写入的性能[pipeline]的相关文章

使用Redis管道提升性能

Redis 的 管道 (pipelining)是用来打包多条无关命令批量执行,以减少多个命令分别执行带来的网络交互时间.在一些批量操作数据的场景,使用管道可以显著提升 Redis 的读写性能. 原理演示 Redis 的管道实质就是命令打包批量执行,多次网络交互减少到单次.使用管道和不使用管道时的交互过程如下: 我们使用 nc 命令来直观感受下 Redis 管道的使用过程: # 安装nc命令 $ yum install nc # nc打包多个命令 $ (printf "PING\r\nPING\r

psutil 是因为该包能提升 memory_profiler 的性能

python 性能分析入门指南 一点号数据玩家昨天 限时干货下载:添加微信公众号"数据玩家「fbigdata」" 回复[7]免费获取[完整数据分析资料!(包括SPSS.SAS.SQL.EXCEL.Project)!] 英文:yexiaobai 译文:yexiaobai 虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 用 time 粗粒度的计算时间 $time pythonyou

jQuery 做好七件事帮你提升jQuery的性能

1. Append Outside of Loops 凡是触及到DOM都是有代价的.如果你向DOM当中附加大量的元素,你会想一次性将它们全部附加进来,而不是分多次进行.当在循环当中附加元素就会产生一个常见的问题. 1 $.each( myArray, function( i, item ) { 2 3 var newListItem = "<li>" + item + "</li>"; 4 5 $( "#ballers"

采用表达式树提升属性访问性能

项目背景, 采用贫血模式, 但希望在使用业务实体机业务规则上的数据属性,使用同一规则. 比如:在页面中, “RS_Department.Code" , "Department.Code"都可以正常访问. 业务实体类 直接使用Linq to Sql 自动生成的代码,跟数据库表一一对应. 如:RS_Requisition, RS_Department 业务规则类 实现数据库增删改查,扩展属性,其他业务规则等. public class Requisition : BLLTable

如何从请求、传输、渲染3个方面提升Web前端性能

什么是WEB前端呢?就是用户电脑的浏览器所做的一切事情.我们来看看用户访问网站,浏览器都做了哪些事情: 输入网址 –> 解析域名 -> 请求页面 -> 解析页面并发送页面中的资源请求 -> 渲染资源 -> 输出页面 -> 监听用户操作 -> 重新渲染. 通过上面的路径可以看出浏览器分为请求.传输.渲染三部分来实现用户的访问,本文就从这三个部分来浅析如何提升WEB前端性能. 请求浏览器为了减少请求传输,实现了自己的缓存机制.浏览器缓存就是把一个已经请求过的Web资源

redis 的管道操作

#-*- coding: utf8 -*- import redis pool = redis.ConnectionPool() r = redis.Redis(connection_pool=pool) # 支持事务 pipe = r.pipeline(transaction=True) pipe.multi() pipe.set("user", "egon") pipe.set("role", "sb") pipe.exe

【转帖】AMD Zen 3处理器IPC性能提升17% 浮点性能大涨50%

AMD Zen 3处理器IPC性能提升17% 浮点性能大涨50% https://www.cnbeta.com/articles/tech/925543.htm AMD YES 下个月初发布7nm锐龙APU及移动版锐龙4000之后,AMD在7nm Zen2架构上就算是功德圆满了,剩下的就要全力以赴2020年要发布的7nm Zen3处理器了.最新消息对Zen3的性能提升非常乐观,认为浮点性能大涨50%,推动平均IPC性能提升17%,远超之前的预期. 访问购买页面: AMD旗舰店 目前我们能知道的就

redis使用管道pipeline提升批量操作性能(php演示)

Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户端. 如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依次执行,并返回结果, 为了解决此类问题,设计者设计出了redis管道命令: 客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复,从而大大增加了协议性能 做了测试,使用pipeline

redis之管道——pipeline

redis 是 CS 模式,Redis客户端与Redis之间使用TCP协议进行连接,一个客户端可以通过一个socket连接发起多个请求命令,每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行.如果一次性批量数据单次操作,会有网络延迟.而redis也是单线程的. 而Pipelining可以满足批量的操作,把多个命令连续的发送给Redis Server,然后