Redis

Redis 是一个开源的基于内存的数据结构存储器。通常可作为数据库,缓存和消息中介。它支持的数据结构有:字符串、哈希表、列表、集合、支持范围查询的有序集合、位图、hyperloglogs和带查询半径的地理空间索引。Redis有内置的复制、Lua脚本、LRU缓存、事务和不同层级的磁盘持久化功能,还通过Redis Sentinel提供了高可用性,通过Redis集群实现了自动化分割。

Pipeline

当业务需要发送多个相互独立的消息给redis,而不需要阻塞等待回答的时候,可以使用pipeline,将几个消息打包发送,这样可以减少网络的传输次数,提高性能。

#!/usr/bin/python3
import redis
import time key = 'Redis:Test'
num = 100 def test_with_out_pipeline(count=1):
r = redis.Redis(host='192.168.192.34',port=6379)
for i in range(num):
r.incr(key, count) def test_with_pipeline(count=1):
r = redis.Redis(host='192.168.192.34', port=6379)
pipe = r.pipeline()
for i in range(num):
pipe.incr(count)
res = pipe.execute()
return res def bench(desc):
start = time.clock()
desc()
end = time.clock()
cost = end - start
print("function {} cost {}".format(desc.__name__, str(cost))) if __name__ == '__main__':
bench(test_with_out_pipeline)
bench(test_with_pipeline)

使用场景,通过redis记录某种现象出现的次数,例如消费次数。pipline有优点,那就肯定有缺点,缺点是:

1.如果pipeline包含的信息太长,redis在处理的时候就会占用更多的内存。同时pipeline在处理的时候回独占链接(没仔细研究过),这期间的其他任何操作都会失败。建议就是给pipeline使用一个单独的Client。

2.pipeline只是将数据批量打包发送,很可能里面有部分请求处理失败的情况。这个时候使用LUA脚本会更加合适,而且LUA脚本可以保证原子性。

参考:

http://shift-alt-ctrl.iteye.com/blog/1863790

http://www.redis.cn/commands/eval.html

List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

#!/usr/bin/python3
import redis
import time key = 'Redis:ListTest' if __name__ == '__main__':
r = redis.Redis(host='192.168.192.34',port=6379)
r.lpush(key, '1')
r.lpush(key, '2')
r.rpush(key, '3')
print(r.llen(key))
res = r.rpop(key)
print(res)
res = r.lpop(key)
print(res)

在做爬虫的过程中,需要保留从网页上分析之后的URL,那就可以使用列表。可以使用不同的key来保存不同的优先级队列,在爬取得时候先获取优先级最高的队列,如果该队列为空,获取优先级比较低的队列。

Redis pipeline and list的更多相关文章

  1. redis pipeline

    redis pipeline 简而言之就是把多个redis命令打包,一起发送给redis server,并且一起返回结果,减少客户端和服务器之间的多次“折返跑”

  2. 如何用好redis pipeline

    编者注:pipeline是Redis的一个提高吞吐量的机制,适用于多key读写场景,比如同时读取多个key的value,或者更新多个key的value.工作过程中发现挺多小伙伴都对pipeline多少 ...

  3. 【spring boot】spring boot 基于redis pipeline 管道,批量操作redis命令

    spring boot 2.x 使用RedisTemplate 操作 =================================== 1.pom.xml <!--spring2.0集成r ...

  4. laravel中redis pipeline用法说明

    $res = Redis::pipeline(function($pipe) use($params) { for ($i = 0; $i < 1000; $i++) { $pipe->g ...

  5. redis 学习(11)-- redis pipeline

    redis pipeline 什么是流水线(pipeline) 首先来看 redis 执行一次操作所需要的时间: 1 次时间 = 1 次网络时间 + 1次命令时间 执行 n 次就需要: n 次时间 = ...

  6. 等待 Redis 应答 Redis pipeline It's not just a matter of RTT

    小结: 1.When pipelining is used, many commands are usually read with a single read() system call, and ...

  7. 说说 Redis pipeline

    更多技术文章,请关注我的个人博客 www.immaxfang.com 和小公众号 Max的学习札记. Redis 客户端和服务端之间是采用 TCP 协议进行通信的,是基于 Request/Respon ...

  8. (7)redis pipeline

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常 会阻塞并等待redi ...

  9. Redis Pipeline原理分析

    转载请注明出处:http://www.cnblogs.com/jabnih/ 1. 基本原理 1.1 为什么会出现Pipeline Redis本身是基于Request/Response协议的,正常情况 ...

随机推荐

  1. DB2中字符、数字和日期类型之间的转换

    DB2中字符.数字和日期类型之间的转换 一般我们在使用DB2或Oracle的过程中,经常会在数字<->字符<->日期三种类 型之间做转换,那么在DB2和Oracle中,他们分别 ...

  2. Android百度地图开发02之添加覆盖物 + 地理编码和反地理编码

    下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码. 添加覆盖物 在地图上添加覆盖物,一般需要以下几个步骤: 1. 定义坐标点,有可能是一个,有可能是多个(比如:多边形覆盖物). 2. 构造Ov ...

  3. Git设置及GitHub的使用

    把github上的help略略翻译一遍.备忘. First : 安装:ubuntu 下,终端输入命令: sudo apt-get install git-core git-gui git-doc Ne ...

  4. 【Tech】Ganglia安装配置

    基础配置: Hadoop 2.2.0,Hbase 0.96. 四台集群机器,一台master,三台slave. 三台slave上分别装gmond:namenode机器上设置datasource. 客户 ...

  5. 如何在User版本开启串口(Uart),抓取上层Log,开启输入控制台

    [原][FAQ03891] 如何在User版本开启串口(Uart),抓取上层Log,开启输入控制台 2014-11-26阅读1369 评论0 FAQ Content [Description]如何在U ...

  6. leetcode:Reverse Linked List II

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  7. Hadoop集群(第6期)_WordCount运行详解

    1.MapReduce理论简介 1.1 MapReduce编程模型 MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然 ...

  8. hibernate的save()和persit()之间的区别

    这个问题啊,我在传智的Hibernate 视频上有小段讲解,save() 和persist() 都是持久化的保存,这两个方法在已经开启事物的情况下没多大区别:在不开启事物的时候save()方法会把数据 ...

  9. Android使用 LruCache 缓存图片

    摘要:在你应用程序的UI界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复杂起来. 使用图片缓存技术 在 你应用程序的UI界面加载一张图片是一件很简单的事情,但 ...

  10. 函数lock_rec_get_first_on_page

    lock结构体 详见 /*********************************************************************//** Gets the first ...