文档章节

python redis 模块 官方文档(上)

xiaoanyunfei
 xiaoanyunfei
发布于 2015/04/29 14:17
字数 2123
阅读 78
收藏 0
点赞 0
评论 0

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)。Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

StrictRedis:

select#没有实现,参见下面线程安全小节

del#与python的del冲突,用delete代替

CONFIG GET|SET#config_get config_set

MULTI/EXEC#被当做Pipeline的一部分,执行时默认被 MULTI 和EXEC状态包裹,可以用transaction=False 关闭SUBSCRIBE/LISTEN#和Pipeline类似,PubSub作为单独的类实现,它生成潜在的连接状态,此时无法执行非pubsub命令,在redis-client端执行PubSub会返回一个pubsub实例,可以用它来订阅频道,监听信息,注意只能在client端执行

SCAN/SSCAN/HSCAN/ZSCAN#*scan命令在redis文件中实现,每个方法都有一个迭代器方法,这样纯粹时为了方便用户,不用记录迭代器的游标,用scan_iter/sscan_iter/hscan_iter/zscan_iter实现

StrictRedis的子类Redis重写了一些方法实现了后向兼容

LREM#num和value顺序颠倒了,以便num可以提供缺省值0

ZADD#在value前指明score,实现时意外交换了顺序,人们已经使用时才发现,Redis期望*args格式是name1, score1, name2, score2, …
SETEX#time和value的顺序颠倒

redis使用连接池管理与redis-server的连接,默认每个redis实例会创建自己的连接池,可以用已经存在的连接池覆盖实例redis的connection_pool参数来覆盖这一行为,你可以通过这种方式实现客户端的切分或连接池的管理

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

ConnectionPools管理着连接实例的集合,redis实线两种类型的连接,默认使用基于tcp socket的连接,

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 服务器的响应。要进一步控制如何解释响应,也可以使用关键字参数。这些关键字参数在对 execute_command 的命令调用时指定。通过 “withscores” 参数,ZRANGE 演示了回调函数如何使用关键字参数。

线程安全

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

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

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

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

Pipeline

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

Pipeline 的使用非常简单:

>>> r = redis.Redis(...)
>>> r.set('bing', 'baz')
>>> # 使用 pipeline()方法创建 pipeline 对象
>>> pip3 = r.pipeline()
>>> # 下面的set方法被缓存
>>> pipe.set('foo', 'bar')
>>> pipe.get('bing')
>>> # 调用execute发送所有缓存命令到服务器端,并返回响应的list,每个命令对应着list的一项
>>> 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 中加1, 设置(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 用作上下文管理器(如上面的例子所示,with r.pipeline() as pipe:), 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 设置成缓冲模式

存在一种方便的方法“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')

原文https://pypi.python.org/pypi/redis/

© 著作权归作者所有

共有 人打赏支持
xiaoanyunfei
粉丝 0
博文 12
码字总数 11094
作品 0
海淀
Python学习你掌握对方法了吗?python自动化

阅读官方文档即可满足日常需求,官方文档有中文翻译,更加方便学习。但这些都是基础的语法和常见的模块,Python学习重要的是模块,快速、高效的开发依赖的是模块的应用,站在前人的肩膀会省时...

老男孩Linux培训 ⋅ 06/12 ⋅ 0

156个Python网络爬虫资源,妈妈再也不用担心你找不到资源了

本列表包含Python网页抓取和数据处理相关的库。 前几天有私信小编要Python的学习资料,小编整理了一些有深度的Python教程和参考资料,从入门到高级的都有,文件已经打包好了,正在学习Pytho...

雁横 ⋅ 05/02 ⋅ 0

python开源工具列表【持续更新】

以下是个人在工作中整理的一些python wheel,供参考。 这个列表包含与网页抓取和数据处理的Python库 网络 通用urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库(基于pycurl)。...

武耀文 ⋅ 04/25 ⋅ 0

python-35:urllib 和 urllib2 模块

首先,urllib 和 urllib2 是python 自带的模块,所以我们可以通过官网文档来查看它们的详细信息,这里依然给出网址,感兴趣的同学可以看一下 urllib模块:http://python.usyiyi.cn/python278...

达岭凹老大 ⋅ 2015/12/01 ⋅ 0

大数据分析挖掘学习方向?数据分析师的就业前景怎么样?

加米谷数据分析挖掘课程明细,从理论到云端实操环境到项目实战,手把手教您从0掌握数据分析与挖掘技术,带您走进数据时代。 第一阶段(python基础) python入门:1、Python版本特性介绍2、P...

加米谷大数据 ⋅ 04/17 ⋅ 0

C/C++ 和 Python混合编程

链接:https://www.zhihu.com/question/23003213/answer/56121859 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 #include int main(int argc, char *...

sirius_0 ⋅ 04/21 ⋅ 0

python任务调度模块celery

python任务调度模块celery celery简介 Celery是一个python开发的异步分布式任务调度模块。 Celery本身并不提供消息服务,使用第三方服务,也就是borker来传递任务,一般使用rabbitMQ或者Red...

laoba ⋅ 05/28 ⋅ 0

Python 模块的设计和编写

简述 在 Python 中,模块是由 Python 代码组成的 文件,任何 Python 文件都可以作为一个模块被引用。 编写模块就像编写任何其他 Python 文件一样,模块可以包含类、函数和变量的定义,然后在...

潘志闻 ⋅ 2017/07/13 ⋅ 0

老司机工作总结!零基础python小白学习编程一定要知道的那些技巧

今天又是一年一度的关键时刻:高考了。高考可谓是牵动着无数普通家庭的心。但是高考就是千军万马过独木桥,是一场没有硝烟的战争,有输有赢。可是高考跟战争不一样的是,高考就算失败也会有其...

Python学习 ⋅ 06/07 ⋅ 0

django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV

使用Django输出CSV 这篇文档阐述了如何通过使用Django视图动态输出CSV (Comma Separated Values)。 你可以使用Python CSV 库或者Django的模板系统来达到目的。 使用Python CSV库 Python自带了...

apachecn_飞龙 ⋅ 2015/09/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 10分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 16分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 19分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 27分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 30分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 52分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 57分钟前 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部