hot_redis
项目描述
HOT Redis是redis-py客户端的包装库。HOT Redis 不是直接从客户端库调用Redis命令,而是提供各种数据类型,模仿Python提供的许多内置数据类型,例如列表,字符串,集合等等,以及许多在整个标准库中找到的类,例如在队列,线程和集合模块中找到的类。
这些类型然后由Redis支持,允许通过网络原子地操作对象 - 在HOT Redis中对象上实现的方法的原子性质是其核心功能之一,其中许多由Redis中执行的Lua代码支持,这确保了适用的原子操作。
HOT Redis这个名字最初代表“Redis的高阶类型”,但由于实现并不严格符合定义,因此递归的首字母缩略词“Hot Object Toolkit for Redis”应该能够安抚最有胡子的脖子。
HOT Redis来自Kouio RSS阅读器背后的基础设施 ,这是谷歌阅读器的一种流行替代品。
Installation
安装hot-redis
的最简单方法是使用pip直接从PyPi 运行以下命令:
$ pip install -U hot-redis
否则,您可以直接从源代码下载并安装它:
$ python setup.py安装
Usage
HOT Redis提供的每种类型都努力实现与Python内置和标准库对应的相同方法签名和返回值。主要区别在于每种类型的 __init__
方法。每HOT Redis的类型的__init__
方法将任选接受初始
和键
关键字参数,其被用于定义要被存储在Redis的用于对象的初始值,以及应该分别使用的,密钥。如果没有提供密钥,将生成一个密钥,然后可以通过密钥
属性访问该 密钥
:
>>> from hot_redis import List
>>> my_list = List()
>>> my_list.key
'93366bdb-90b2-4226-a52a-556f678af40e'
>>> my_list_with_key = List(key="foo")
>>> my_list_with_key.key
'foo'
一旦确定了命名密钥的策略,就可以创建HOT Redis对象并通过网络与它们进行交互,例如,这是在我们称为计算机A的计算机上创建的列表
,下面的代码要注意开启redis数据库
>>> list_on_computer_a = List(key =“foo”,initial = [“a”,“b”,“c”])
然后在另一台计算机上,我们将创造性地称为计算机B:
>>> list_on_computer_b = List(key="foo")
>>> list_on_computer_b[:] # Performs: LRANGE foo 0 -1
['a', 'b', 'c']
>>> list_on_computer_b += ['d', 'e', 'f'] # Performs: RPUSH foo d e f
并回到电脑A:
>>> list_on_computer_a[:] # Performs: LRANGE foo 0 -1
['a', 'b', 'c', 'd', 'e', 'f']
>>> 'c' in list_on_computer_a # Works like Python lists where expected
True
>>> list_on_computer_a.reverse()
>>> list_on_computer_a[:]
['f', 'e', 'd', 'c', 'b', 'a']
这里的最后一次互动是一个有趣的互动。Python的 list.reverse()
是列表的就地反转,也就是说,它修改现有列表,而不是返回反向副本。如果我们要天真地实现这一点,我们首先会从Redis中读取列表,在本地反转它,然后再将反向列表存储回Redis中。但是,如果另一个客户几乎同时修改列表呢?一台计算机对列表的修改肯定会覆盖另一台计算机。在这种情况下,以及许多 其他方面,HOT Redis提供了自己的Lua例程,专门用于原子地在Redis中就地反转列表。我在Redis的Bitwise Lua Operations博客文章中详细介绍了这一点
Configuration
默认情况下,HOT Redis尝试连接到默认端口6379上本地运行的Redis实例。在实例化任何HOT Redis对象之前,可以通过调用hot_redis.configure
函数来配置默认客户端。给configure
的参数传递给底层的redis-py客户端:
>>> from hot_redis import configure
configure(host ='myremotehost',port = 6380)
或者,如果您希望为每个对象使用不同的客户端,则可以显式创建HotClient
实例,并将其传递给每个对象:
>>> from hot_redis import HotClient, Queue
>>> client = HotClient(host="myremotehost", port=6380)
>>> my_queue = Queue(client=client)
Transactions
使用Redis MULTI
和EXEC
命令提供对线程安全事务的基本支持:
>>> from hot_redis import List, Queue, transaction
>>> my_list = List(key="foo")
>>> my_queue = Queue(key="bar")
>>> with transaction():
... for i in range(20):
... my_list.append(i)
... my_queue.put(i)
在上面的示例中,所有append
和put
调用都被一起批处理为单个事务,该事务
在退出transaction()
上下文后执行 。
数据类型
下表是HOT Redis提供的完整类型列表,映射到它们的Python对应物和底层Redis类型,以及值得注意的任何特殊注意事项。
HOT Redis | Python | Redis | Notes |
---|---|---|---|
List | list | list | |
Set | set | set | |
Dict | dict | hash | |
String | string | string | Mutable - string methods that normally create a new string object in Python will mutate the string stored in Redis |
ImmutableString | string | string | Immutable - behaves like a regular Python string |
Int | int | int | |
Float | float | float | |
Queue | Queue.Queue | list | |
LifoQueue | Queue.LifoQueue | list | |
SetQueue | N/A | list + set | Extension of Queue with unique members |
LifoSetQueue | N/A | list + set | Extension of LifoQueue with unique members |
BoundedSemaphore | threading.BoundedSemaphore | list | Extension of Queue leveraging Redis’ blocking list pop operations with timeouts, while using Queue’s maxsize arg to provide BoundedSemaphore’s value arg |
Semaphore | threading.Semaphore | list | Extension of BoundedSemaphore without a queue size |
Lock | threading.Lock | list | Extension of BoundedSemaphore with a queue size of 1 |
RLock | threading.RLock | list | Extension of Lock allowing multiple acquire calls |
DefaultDict | collections.DefaultDict | hash | |
MultiSet | collections.Counter | hash |