目录
API参考" >3.API参考
4.详细说明
4.1 连接池
4.2 连接
4.3 分析器
回调函数
" >4.4 响应回调函数
4.5 线程安全
4.6 Pipeline
首页 后端开发 Python教程 详解python redis使用方法

详解python redis使用方法

May 28, 2018 pm 03:01 PM

这篇文章详解python redis使用方法

1,安装

pip install redis

2,基本使用

使用:
import redis
r = redis.Redis(host=’localhost’, port=6379, db=0)
r['test'] = ‘test’ #或者可以r.set(‘test’, ‘test’) 设置key
r.get(‘test’) #获取test的值
r.delete(‘test’) #删除这个key
r.flushdb() #清空数据库
r.keys() #列出所有key
r.exists(‘test’) #检测这个key是否存在
r.dbsize() #数据库中多少个条数

>>> import redis

>>> pool = 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://www.php.cn/)。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_class=YourConnectionClass, your_arg='...', ...)
登录后复制

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 hiredis
登录后复制

4.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')
登录后复制

以上是详解python redis使用方法的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何解决Linux终端中查看Python版本时遇到的权限问题? 如何解决Linux终端中查看Python版本时遇到的权限问题? Apr 01, 2025 pm 05:09 PM

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

在Python中如何高效地将一个DataFrame的整列复制到另一个结构不同的DataFrame中? 在Python中如何高效地将一个DataFrame的整列复制到另一个结构不同的DataFrame中? Apr 01, 2025 pm 11:15 PM

在使用Python的pandas库时,如何在两个结构不同的DataFrame之间进行整列复制是一个常见的问题。假设我们有两个Dat...

如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? 如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? Apr 02, 2025 am 07:18 AM

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? 如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

什么是正则表达式? 什么是正则表达式? Mar 20, 2025 pm 06:25 PM

正则表达式是在编程中进行模式匹配和文本操作的强大工具,从而提高了各种应用程序的文本处理效率。

Uvicorn是如何在没有serve_forever()的情况下持续监听HTTP请求的? Uvicorn是如何在没有serve_forever()的情况下持续监听HTTP请求的? Apr 01, 2025 pm 10:51 PM

Uvicorn是如何持续监听HTTP请求的?Uvicorn是一个基于ASGI的轻量级Web服务器,其核心功能之一便是监听HTTP请求并进�...

Python中如何通过字符串动态创建对象并调用其方法? Python中如何通过字符串动态创建对象并调用其方法? Apr 01, 2025 pm 11:18 PM

在Python中,如何通过字符串动态创建对象并调用其方法?这是一个常见的编程需求,尤其在需要根据配置或运行...

哪些流行的Python库及其用途? 哪些流行的Python库及其用途? Mar 21, 2025 pm 06:46 PM

本文讨论了诸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和请求等流行的Python库,并详细介绍了它们在科学计算,数据分析,可视化,机器学习,网络开发和H中的用途

See all articles