Redis的Python客户端redis-py安装使用说明文档
1.安装
redis-py是Redis key-value 数据库的 Python 接口,安装如下,后面我们会讲hiredis这个库
$ sudo pip install redis$ sudo pip install hiredis
2.入门
import redispool = redis.ConnectionPool(host= localhost , port=6379, db=0)
r = redis.StrictRedis(connection_pool = pool)
r.set( foo , bar )
True
r.get( foo )
bar
3.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,这个类只是做兼容用的
4.详细说明
4.1 连接池
在后台,redis-py 采用了连接池(ConnectionPool)来管理对 Redis 服务器的连接。缺省情况下,每个Redis 实例都创建自己的连接池。也可以采用向 Redis 类的 connection_pool 参数传递已创建的连接池的方式。通过这种方式,可以实现客户端分片或精确控制连接的管理:
pool = redis.ConnectionPool(host= localhost , port=6379, db=0)r = redis.StrictRedis(connection_pool=pool) 4.2 连接
ConnectionPool 管理一组 Connection 实例。redis-py 提供两种类型的 Connection。缺省情况下,Connection 是一个普通的 TCP 连接。 UnixDomainSocketConnection 允许和服务器运行在同一个设备上的客户端通过 unix 套接字进行连接。要使用 UnixDomainSocketConnection 连接, 只需要通过unix_socket_path 参数传递一个 unix 套接字文件的字符串。另外,确保redis.conf 文件配置了unixsocket 参数(缺省情况下是注释掉的):
r = redis.StrictRedis(unix_socket_path= /tmp/redis.sock ) 也可以自己创建 Connection 子类。这个特性可以在使用异步框架时用于控制 socket 的行为。要使用自己的Connection 初始化客户端类,需要创建一个连接池,通 connection_class 参数把自己的类传递进去。传递的其它关键字参数会在初始化时传递给自定义的类: pool = redis.ConnectionPool(connection_ >4.3 分析器
分析类提供了控制如何对 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 hiredis4.4 响应回调函数
客户端类使用一系列回调函数来把 Redis 响应转换成合适的 Python 类型。有些回调函数在 Redis 客户端类的字典 RESPONSE_CALLBACKS 中定义。
通过 set_response_callback 方法可以把自定义的回调函数添加到单个实例。这个方法接受两个参数:一个命令名和一个回调函数。通过这种方法添加的回调函数只对添加到的对象有效。要想全局定义或重载一个回调函数,应该创建 Redis 客户端的子类并把回调函数添加到类的 RESPONSE_CALLBACKS(原文误为REDIS_CALLBACKS) 中。
响应回调函数至少有一个参数:Redis 服务器的响应。要进一步控制如何解释响应,也可以使用关键字参数。这些关键字参数在对 execute_command 的命令调用时指定。通过 “withscores” 参数,ZRANGE 演示了回调函数如何使用关键字参数。
4.5 线程安全
Redis 客户端实例可以安全地在线程间共享。从内部实现来说,只有在命令执行时才获取连接实例,完成后直接返回连接池,命令永不修改客户端实例的状态。
但是,有一点需要注意:SELECT 命令。SELECT 命令允许切换当前连接使用的数据库。新的数据库保持被选中状态,直到选中另一个数据库或连接关闭。这会导致在返回连接池时,连接可能指定了别的数据库。
因此,redis-py 没有在客户端实例中实现 SELECT 命令。如果要在同一个应用中使用多个 Redis 数据库,应该给第一个数据库创建独立的客户端实例(可能也需要独立的连接池)。
在线程间传递 PubSub 和 Pipeline 对象是不安全的。
4.6 Pipeline
Pipeline 是 StrictRedis 类的子类,支持在一个请求里发送缓冲的多个命令。通过减少客户端和服务器之间往来的数据包,可以大大提高命令组的性能。
Pipeline 的使用非常简单:
r = redis.Redis( )r.set( bing , baz )
# Use the pipeline() method to create a pipeline instance
pipe = 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 = unicode(int(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 )
current_value = pipe.get( OUR-SEQUENCE-KEY )
next_value = unicode(int(current_value) + 1)
pipe.multi()
pipe.set( OUR-SEQUENCE-KEY , next_value)
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 = unicode(int(current_value) + 1)
pipe.multi()
pipe.set( OUR-SEQUENCE-KEY , next_value)
r.transaction(client_side_incr, OUR-SEQUENCE-KEY )
4.7 版本计划
redis-py 跟随 Redis 发布版本。如 redis-py 2.0.0 应该支持 Redis 2.0.0 的所有命令。
4.8 作者
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.
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 Redis的Python客户端redis-py安装使用说明文档
相关文章
- Python基础24-MySQL模块pymysql
- 【说站】Python中deque的操作整理
- python设置时间过期改变状态_Python Redis设置过期时间「建议收藏」
- 和 php 如何配合使用Redis类库搭配PHP编程:高效开发与灵活操作(redis类库)
- python使用Python轻松操作Redis(redis-)
- Redis官方中文文档(redis中文文档)
- Redis文件夹:存储和访问你的数据(redis文件夹)
- Redis进入命令行操作步骤(redis进入命令行)
- Python玩转Redis:提升缓存效率(python使用redis)
- Python实现快速连接Redis数据库(python连接redis)
- Redis与Cache:应用程序性能优化利器(redis和cache)
- RedisPy: A HighPerformance Python Client for Redis Database(redis-py)
- ymysql在Python中使用Redis CLI和Pymysql(redis cli p)
- Redis哨兵模式下的客户端连接实践(redis哨兵模式客户端)
- 用Python封装Redis,让工作更轻松(怎么封装redis)
- Redis虚拟机提升性能让业务运行更快(虚拟机 redis 性能)
- 使用Python快速轻松构建Redis客户端(简单实现redis客户端)
- 玩转Redis新手从入门到精通(玩转redis文档)
- Redis最佳实践最全面最可靠的文档指南(最好用的redis文档)
- 利用Python实现文本数据导入Redis库(文本数据导入redis)
- 解决内存溢出优化利用Redis缓存(内存溢出redis缓存)
- 如何获取Redis授权突破你的挑战(如何获取redis授权)
- 借助Redis提升验证码安全性(使用redis生成验证码)
- 深入理解Redis默认的DB数量(redis默认几个db)
- 系统基于Redis的高性能评论系统(redis高并发评论)
- 精通Redis集群模式完整文档指南(redis集群模式文档)
- 文档Redis集群官方文档指南(redis集群官方)
- 分布式缓存Redis集群技术实现的自动化运维之BAT(redis 集群 bat)
- 操作利用Redis连接命令简洁的为用户操作提供便利(redis连接命令 用户)
- Redis实现同步读写锁保障事务安全性(redis读写同步锁)
- Redis缓存设计文档提升数据性能(redis 设计 文档)
- 值对Redis支持无限键值对(redis能支持多少键)
- mysql比拼Redis和MySQL谁才是数据存储首选(redis能不能访问)
- python用Redis与Python实现大数据收集与分析(redis 联合)
- 存储Redis实现持久化存储的实践研究(redis进行持久话)