Redis ORM

1 历史

之前一直使用的 meetbill/redis-orm 库

> xxxxxxxxxx 表示 instance id: 如 39NzUg3sOmD7ZDe1
+------------------------------------------------------------+
| string: redisorm:{model_name}:object:{xxxxxxxxxx}          | 通过 pickle 序列化为二进制数据进行存储
| string: redisorm:{model_name}:object:{xxxxxxxxxx}:expire   | 记录对象的过期时间
| set, redisorm:{model_name}:tags:{field_name1:field_value1} | 记录了此 tag 的 instance id 集合
| set, redisorm:{model_name}:tags:{field_name2:field_value2} | # 使用 set 交集可以获取多个 tag 的 instance 集合
| set, redisorm:{model_name}:__all__                         | 记录了此 model 的所有 instance id
| zset, redisorm:{model_name}:__expire__                     | 使用 zset 可方便批量删除过期 instance
+------------------------------------------------------------+

需求:
(1) 二级索引:支持,通过 tag 方式写入特定的 set,然后使用 Smembers 进行返回对应的 id,然后再根据 id 查询对应的对象
(2) model: 支持,通过设置固定的前缀实现不同 model 的区分
(3) 搜索:仅支持普通搜索,即搜索固定 tag

但有如下不足:
(1) 存储的 key 为 redisorm:{model_name}:object:{xxxxxxxxxx} 方式,instance id 是个无意义的字符串,查找不方便
    假如设置了唯一键的话,应该设置为唯一键标识,查找时可以直接拼接对应的 key,无需查找两次
(2) 无法根据范围查找 instance
    比如 field_value 为数字时,无法根据查询特定条件的 instance

看到 coleifer/walrus 满足条件,进而逐渐替换为 coleifer/walrus

2 model

例子

2.1 增

2.2 查

2.2.1 查询单个数据

load(primary_key)

get_or_none(primary_key)

2.2.2 检索所有记录

2.2.3 排序

排序

2.2.4 过滤(根据范围查询时需要使用 lua)

范围查询

等式

不等式 (set 交集运算)

备注

2.3 改

2.4 删

3 自定义连接以及 namespace

对应 redis 记录

3.1 例子

3.2 注意

3.2.1 在 ListField 中添加值

使用 TextField 时直接可以用 cls.create() 给 redis 设置值,但是 ListField 时会报错

ListField 中插入值必须先实例化一个对象,如 SetField 例子

4 实践

4.1 Redis key

4.1.1 EventHistory 数据库

主键是自增 ID

model

4.1.2 Event 数据库

model

4.2 Redis 内部操作

4.2.1 记录总数

4.2.2 排序

4.2.3 删除

4.2.4 删除所有索引

索引 key

例子

4.2.5 删除单个索引

索引 key

主键 key

例子

4.2.6 泄露 key

4.2.7 主键 key 自增 id

如果主键 key 是自增 id, 则存储当前 id 的 key 为:

4.3 规范

4.3.1 禁止修改主键 key

主键 key 修改后会导致存量 key 无法找到主键,故而无法删除

4.4 异常情况处理

4.4.1 索引中可以找到,但是却没有找到 key

4.4.2 索引数据和记录数据不一致

4.5 批量删除 key

4.6 多个可选的搜索条件

传送门

Last updated