hot_redis

2020-06-12  本文已影响0人  wit92

项目描述

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 MULTIEXEC命令提供对线程安全事务的基本支持:

>>> 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)

在上面的示例中,所有appendput调用都被一起批处理为单个事务,该事务在退出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
上一篇 下一篇

猜你喜欢

热点阅读