转自:http://blog.sina.com.cn/s/blog_6262a50e0101574h.html

原文:https://github.com/andymccurdy/redis-py

redis-py¶

Redis key-value 数据库的 Python 接口。

安装¶

$ sudo pip install redis

或采用下面方法(最好是用 pip):

$ sudo easy_install redis

从源代码安装:

$sudo python setup.py install

入门¶

>>> import redis

>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)

>>> r.set('foo', 'bar')

True

>>> r.get('foo')

'bar'

API 参考¶

Redis 官方文档详细解释了每个命令(http://redis.io/commands)。redis-py 提供了两个实现这些命令的客户端类。StrictRedis 类试图遵守官方的命令语法,但也有几点例外:

·SELECT:没有实现。参见下面“线程安全”部分的解释。

·DEL:’del’ 是 Python 语法的保留关键字。因此redis-py 使用 “delete” 代替。

·CONFIG GET|SET:分别用 config_get 和 config_set 实现。

·MULTI/EXEC:作为 Pipeline 类的一部分来实现。若在调用pipeline 方法时指定use_transaction=True,在执行 pipeline 时会用 MULTI 和 EXEC 封装 pipeline 的操作。参见下面 Pipeline 部分。

·SUBSCRIBE/LISTEN: 和 pipeline 类似,由于需要下层的连接保持状态, PubSub 也实现成单独的类。调用 Redis 客户端的 pubsub 方法返回一个 PubSub 的实例,通过这个实例可以订阅频道或侦听消息。两个类(StrictRedis 和 PubSub 类)都可以发布(PUBLISH)消息。

除了上面的改变,StrictRedis 的子类 Redis,提供了对旧版本 redis-py 的兼容:

·LREM:参数 ‘num’ 和 ‘value’ 的顺序交换了一下,这样‘num’ 可以提供缺省值 0.

·ZADD:实现时 score 和 value 的顺序不小心弄反了,后来有人用了,就这样了

·SETEX: time 和 value 的顺序反了

注解

因此不要用 Redis,这个类只是做兼容用的

详细说明¶

连接池¶

在后台,redis-py 采用了连接池(ConnectionPool)来管理对 Redis 服务器的连接。缺省情况下,每个Redis 实例都创建自己的连接池。也可以采用向 Redis 类的 connection_pool 参数传递已创建的连接池的方式。通过这种方式,可以实现客户端分片或精确控制连接的管理:

>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

>>> r = redis.Redis(connection_pool=pool)

连接¶

ConnectionPool 管理一组 Connection 实例。redis-py 提供两种类型的 Connection。缺省情况下,Connection 是一个普通的 TCP 连接。 UnixDomainSocketConnection 允许和服务器运行在同一个设备上的客户端通过 unix 套接字进行连接。要使用 UnixDomainSocketConnection 连接, 只需要通过unix_socket_path 参数传递一个 unix 套接字文件的字符串。另外,确保redis.conf 文件配置了unixsocket 参数(缺省情况下是注释掉的):

>>> r = redis.Redis(unix_socket_path='/tmp/redis.sock')

也可以自己创建 Connection 子类。这个特性可以在使用异步框架时用于控制 socket 的行为。要使用自己的Connection 初始化客户端类,需要创建一个连接池,通 connection_class 参数把自己的类传递进去。传递的其它关键字参数会在初始化时传递给自定义的类:

>>> pool = redis.ConnectionPool(connection_class=YourConnectionClass,

your_arg='...', ...)

分析器¶

分析类提供了控制如何对 Redis 服务器的响应进行分析的途径。redis-py 提供了两个分析类, PythonParser和 HiredisParser。缺省情况下,如果安装了 hiredis 模块, redis-py 会尝试使用 HiredisParser,否则使用 PythonParser。

Hiredis 是由 Redis 核心团队维护的 C 库。 Pieter Noordhuis 创建了 Python 的实现。分析 Redis 服务器的响应时,Hiredis 可以提供 10 倍的速度提升。性能提升在获取大量数据时优为明显,比如 LRANGE 和SMEMBERS 操作。

和 redis-py 一样,Hiredis 在 Pypi 中就有,可以通过 pip 或 easy_install 安装:

$ pip install hiredis

或:

$ easy_install hiredis

响应回调函数¶

客户端类使用一系列回调函数来把 Redis 响应转换成合适的 Python 类型。有些回调函数在 Redis 客户端类的字典 RESPONSE_CALLBACKS 中定义。

通过 set_response_callback 方法可以把自定义的回调函数添加到单个实例。这个方法接受两个参数:一个命令名和一个回调函数。通过这种方法添加的回调函数只对添加到的对象有效。要想全局定义或重载一个回调函数,应该创建 Redis 客户端的子类并把回调函数添加到类的 RESPONSE_CALLBACKS(原文误为REDIS_CALLBACKS) 中。

响应回调函数至少有一个参数:Redis 服务器的响应。要进一步控制如何解释响应,也可以使用关键字参数。这些关键字参数在对 execute_command 的命令调用时指定。通过 “withscores” 参数,ZRANGE 演示了回调函数如何使用关键字参数。

线程安全¶

Redis 客户端实例可以安全地在线程间共享。从内部实现来说,只有在命令执行时才获取连接实例,完成后直接返回连接池,命令永不修改客户端实例的状态。

但是,有一点需要注意:SELECT 命令。SELECT 命令允许切换当前连接使用的数据库。新的数据库保持被选中状态,直到选中另一个数据库或连接关闭。这会导致在返回连接池时,连接可能指定了别的数据库。

因此,redis-py 没有在客户端实例中实现 SELECT 命令。如果要在同一个应用中使用多个 Redis 数据库,应该给第一个数据库创建独立的客户端实例(可能也需要独立的连接池)。

在线程间传递 PubSub 和 Pipeline 对象是不安全的。

Pipeline¶

Pipeline 是 Redis 基类的一个子类,支持在一个请求里发送缓冲的多个命令。通过减少客户端和服务器之间往来的数据包,可以大大提高命令组的性能。

Pipeline 的使用非常简单:

>>> r = redis.Redis(...)

>>> r.set('bing', 'baz')

>>> # Use the pipeline() method to create a pipeline instance

>>> pip3 = r.pipeline()

>>> # The following SET commands are buffered

>>> pipe.set('foo', 'bar')

>>> pipe.get('bing')

>>> # the EXECUTE call sends all bufferred commands to the server, returning

>>> # a list of responses, one for each command.

>>> pipe.execute()

[True, 'baz']

为了方便使用,所有缓冲到 pipeline 的命令返回 pipeline 对象本身。因此调用可以链起来:

>>> pipe.set('foo', 'bar').sadd('faz', 'baz').incr('auto_number').execute()

[True, True, 6]

另外,pipeline 也可以保证缓冲的命令组做为一个原子操作。缺省就是这种模式。要使用命令缓冲,但禁止pipeline 的原子操作属性,可以关掉 transaction:

>>> pipe = r.pipeline(transaction=False)

一个常见的问题是:在进行原子事务操作前需要从 Redis 中获取事务中要用的数据。比如,假设 INCR 命令不存在,但我们需要用 Python 创建一个原子版本的 INCR。

一个不成熟的实现是获取值(GET),在 Python 中增一, 设置(SET)新值。但是,这不是原子操作,因为多个客户端可能在同一时间做这件事,每一个都通过 GET 获取同一个值。

WATCH 命令提供了在开始事务前监视一个或多个键的能力。如果这些键中的任何一个在执行事务前发生改变,整个事务就会被取消并抛出 WatchError 异常。要实现我们的客户 INCR 命令,可以按下面的方法操作:

>>> with r.pipeline() as pipe:

...     while 1:

...         try:

...             # 对序列号的键进行 WATCH

...             pipe.watch('OUR-SEQUENCE-KEY')

...             # WATCH 执行后,pipeline 被设置成立即执行模式直到我们通知它

...             # 重新开始缓冲命令。

...             # 这就允许我们获取序列号的值

...             current_value = pipe.get('OUR-SEQUENCE-KEY')

...             next_value = current_value + 1

...             # 现在我们可以用 MULTI 命令把 pipeline 设置成缓冲模式

...             pipe.multi()

...             pipe.set('OUR-SEQUENCE-KEY', next_value)

...             # 最后,执行 pipeline (set 命令)

...             pipe.execute()

...             # 如果执行时没有抛出 WatchError,我们刚才所做的确实“原子地”

...             # 完成了

...             break

...         except WatchError:

...             # 一定是其它客户端在我们开始 WATCH 和执行 pipeline 之间修改了

...             # 'OUR-SEQUENCE-KEY',我们最好的选择是重试

...             continue

注意,因为在整个 WATCH 过程中,Pipeline 必须绑定到一个连接,必须调用 reset() 方法确保连接返回连接池。如果 Pipeline 用作 Context Manager(如上面的例子所示), reset() 会自动调用。当然,也可以用手动的方式明确调用 reset():

>>> pipe = r.pipeline()

>>> while 1:

...     try:

...         pipe.watch('OUR-SEQUENCE-KEY')

...         ...

...         pipe.execute()

...         break

...     except WatchError:

...         continue

...     finally:

...         pipe.reset()

重点(译者注):

·WATCH 执行后,pipeline 被设置成立即执行模式

·用 MULTI 命令把 pipeline 设置成缓冲模式

·要么使用 with,要么调用 reset()

有一个简便的名为“transaction”的方法来处理这种处理和在 WatchError 重试的模式。它的参数是一个可执行对象和要 WATCH 任意个数的键,其中可执行对象接受一个 pipeline 对象做为参数。上面的客户端 INCR 命令可以重写如下(更可读):

>>> def client_side_incr(pipe):

...     current_value = pipe.get('OUR-SEQUENCE-KEY')

...     next_value = current_value + 1

...     pipe.multi()

...     pipe.set('OUR-SEQUENCE-KEY', next_value)

>>>

>>> r.transaction(client_side_incr, 'OUR-SEQUENCE-KEY')

版本计划¶

redis-py 跟随 Redis 发布版本。如 redis-py 2.0.0 应该支持 Redis 2.0.0 的所有命令。

作者¶

redis-py 由 Andy McCurdy (sedrik@gmail.com) 开发并维护。项目地址在:http://github.com/andymccurdy/redis-py

特别鸣谢:

·Ludovico Magnocavallo, Python Redis 客户端的原作者, 其中一些 socket 代码现在还在使用。

·Alexander Solovyov 提供通用响应回调系统的思想。

·Paul Hubbard for initial packaging support.

redis-py说明文件(转)相关推荐

  1. python idle编辑的代码文件拓展名是_Python IDLE编辑器打开后缀名为.py的文件

    原博文 2020-04-08 17:56 − 在Windows操作系统下默认使用Python自带的IDLE编辑器打开后缀名为.py的文件. 1. win+R打开运行 2. 输入regedit,确定 3 ...

  2. 成功解决Eclipse打开py等文件出现乱码

    成功解决Eclipse打开py等文件出现乱码 目录 解决问题 解决思路 解决方法 解决问题 Eclipse打开py等文件出现中文乱码 解决思路 默认读取文件是以gbk的方式,需要在属性中进行转换一下即 ...

  3. php读取文件和读取redis,本地测试读取redis和普通文件缓存的速度,redis慢一倍?...

    本地电脑测试读取redis和普通文件缓存的速度,分别连续读取缓存文件1次.1千次.1万次,缓存内容大小40KB,redis读取速度总比文件缓存速度慢一倍.如果确实如此,是不是在低并发情况下file缓存 ...

  4. python exe文件运行依赖环境_python将py代码文件转换为EXE脱离环境运行

    如何将python将py代码文件编译成为EXE文件,让其能够脱离python环境独立运行? 方法是有的,下面大家请看如何来操作. 我的环境是VS2017,同时安装了ironpython 一.安装pyi ...

  5. py安装文件时报错usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]

    py安装文件时报错usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] 引言 solved 引言 报错: pyth ...

  6. redis服务器索引文件删除,Redis基本命令整理

    strings类型 设值 设单个值 set key value 如果不存在,设一个值 setnx key value //nx: not exists 设置过期时间(expired time) set ...

  7. php读取文件和读取redis,PHP结合redis实现大文件去重

    本篇文章主要内容是用PHP多个进程配合redis的有序集合实现大文件去重,感兴趣的朋友可以学习一下. 1.对一个大文件比如我的文件为 -rw-r--r-- 1 ubuntu ubuntu 9.1G M ...

  8. fastdfs redis java,大文件上传_断点续传_文件分片传输_fastdfs_前后端一站式解决方案...

    大文件上传,断点续传,秒传,fastdfs 项目介绍 实现h5与fastdfs之间的断点续传,大文件上传,秒传 软件架构 软件架构说明 webuploader+springboot+redis+fas ...

  9. python3-开发进阶-仿博客园项目setting.py的文件的配置,admin,forms(2)

    前面我们先分析了一下,做这个项目需要的几张表,今天我们从配置文件开始一步一步去解释这么的原因 首先先来看setting.py文件: """ Django settings ...

  10. python setup.py 指定文件到指定路径_linux下python安装到指定目录

    由于使用公司服务器时没有root权限,只能把python安装到个人文件夹下,使用源码包方式安装,这里记录一下. 1.python下载 cd到目录/users/w,在此目录下安装python.通过wge ...

最新文章

  1. 打开Delphi 10.1 berlin提示脚本错误的解决方法
  2. 计算一个人出生了多少天(炸窝)
  3. linux 安装jdk tomcat mysql
  4. c语言射击类小游戏任务书,(c语言课程设计报告小游戏“石头剪子布”.doc
  5. 好气!等一年,这个iCloud 账户漏洞竟只值$1.8万?!说好的$35万呢???
  6. python函数里面可以修改一些数据类型
  7. Unity3D之NGUI基础1:NGUI插件介绍
  8. 解决Win10磁盘占用100%
  9. 如何增加mysql字段长度_增加数据库字段长度
  10. 浙江省高考数学python_数学高考与python
  11. 【图像处理】多光谱 波长波段划分 主要波段特性 植被遥感原理 典型植被指数
  12. 转载:《星际争霸》星际争霸战略战术的发展和创新
  13. android highcharts柱状图实例,Highcharts 基本柱形图
  14. 七大江河水系--淮河
  15. MAtlab wavefront,MATLAB:像Wavefront算法一样制作矩阵
  16. FreeRTOS中多种信号量
  17. py 爬取汽车之家新闻案例
  18. 运放构成的电压跟随器
  19. 【ShardingSphere技术专题】「ShardingJDBC实战阶段」SpringBoot之整合ShardingJDBC实现分库分表(JavaConfig方式)
  20. uniapp之小程序扫码如何获取二维码里的参数

热门文章

  1. mysql建表主键_常见的MySQL命令大全second
  2. 学生每日计划表_学霸宅家都干什么?浙大学生近700份居家作息计划表泄露秘密...
  3. PTA18、图的字典表示 (10 分)
  4. ci框架中引入css,php ci框架中载入css和js文件失败的原因及解决方法
  5. 大橙子_【大橙子活动】工程学院新媒体中心第二届总结大会圆满结束!
  6. shell脚本和常用命令
  7. HDU 1512 Monkey King(左偏堆)
  8. 列表操作 - C#开发人员
  9. [译]时间自动机:语义,算法和工具
  10. 浅析继承关系中的方法调用