为schematics提供的Redis存储后端。
项目描述
为Schematics模型提供可定制抽象级别的Redis持久化。
安装
使用pip
pip install redis_schematics
理解持久化层
在Redis等键值集数据库上实现复杂对象的持久化有几种方法。最佳方法取决于您的应用程序限制。我们认为为您的应用程序提供良好的存储模型是允许您选择您想要使用的抽象。以下您可以找到不同提供的抽象层的比较。
目前我们只支持SimpleRedisMixin和SimpleRedisModel,但您可以使用BaseRedisMixin来构建自己的持久化层。
SimpleRedisMixin
使用简单方法将Redis持久化添加到对象中。每个对象对应于Redis中的一个键,键以对象命名空间为前缀,对应于序列化对象。要使用此混合,您只需声明一个主键,如下例所示。
当您有频繁的主键和集合操作匹配、唯一过期、硬内存约束或只想使用1-1对象-键方法时,您可以使用此混合。如果您需要非主键操作上的
HashRedisMixin
使用单个哈希方法将 Redis 持久性添加到对象中。每种类型对应 Redis 中的一个单个键,该键包含一个哈希集,其中每个实例作为集合中的一个条目,包含序列化的对象。
当您经常在主键、集合和所有操作上进行匹配,或者有严格的内存限制,或者希望使用单个键方法时,可以使用此 Mixin。如果您需要在非主键操作上进行 filter 和 get 操作时,则不能使用此 Mixin。
快速入门
创建具有持久性的模型
注意:您应该包含一个 pk,但不必手动设置其值。我们可以从 id 字段推断它,或者通过使用 __unique_together__ 设置字段名称的元组。
from datetime import datetime, timedelta
from redis import StrictRedis
from redis_schematics import SimpleRedisMixin
from schematics import models, types
class IceCreamModel(models.Model, SimpleRedisMixin):
pk = types.StringType() # Just include a pk
id = types.StringType()
flavour = types.StringType()
amount_kg = types.IntType()
best_before = types.DateTimeType()
Redis 上的设置
保存就像 set() 一样简单。
vanilla = IceCreamModel(dict(
id='vanilla',
flavour='Sweet Vanilla',
amount_kg=42,
best_before=datetime.now() + timedelta(days=2),
))
chocolate = IceCreamModel(dict(
id='chocolate',
flavour='Delicious Chocolate',
amount_kg=12,
best_before=datetime.now() + timedelta(days=3),
))
vanilla.set()
chocolate.set()
从 Redis 获取
从 Redis 获取元素有两种基本方法:通过 pk 或通过值。您可以使用类方法 match_for_pk(pk) 或 match_for_values(**Kwargs) 或简单地使用 match(**kwargs) 来让我们选择其中一种。请注意,两种方法的表现力有很大差异,因此在高性能环境中您可能需要避免对值进行匹配。您还可以使用 refresh 来重新加载已修改的对象。
IceCreamModel.match_for_pk('vanilla')
IceCreamModel.match_for_values(amount__gte=30)
IceCreamModel.match(id='vanilla') # match on pk
IceCreamModel.match(best_before__gte=datetime.now()) # match on values
vanilla.refresh()
获取全部并过滤
您还可以使用 all() 来反序列化所有内容并过滤。请注意,这涉及反序列化所有存储的对象。
IceCreamModel.all()
IceCreamModel.filter(amount__gte=30)
删除和过期
要删除对象,您可以设置 __expire__ 或使用 delete() 方法。请注意,在单键和多键方法中,过期的工作方式不同。
class MyVolatileModel(models.Model, SimpleRedisMixin):
__expire__ = 3600 # model expire (in seconds)
pk = types.StringType()
vanilla.delete()
JSON
如果您想进行 JSON 序列化,您至少有两个选项
修改默认序列化程序。
编写自定义 JSONEncoder。
我们实现了一个方便的补丁函数,您需要将此代码添加到所有内容的顶部,以自动添加 JSON 序列化功能
from redis_schematics.patches import patch_json
patch_json()
路线图
我们仍然是 0.x,但我们非常接近一个稳定的 API。查看 我们的路线图,了解缺少的内容。