CacheWrapper

Model 类中的数据查询接口的缓存版实现

如何命中缓存

声明 primary_key

单个查询(get, get_by)和批量查询(gets, gets_by), 查询条件是 primary_key

class Dummy(BaseModel):
    # 声明 primary key
    id = Field(int, primary_key=True)

# 以下都命中缓存
Dummy.cache.get(1)
Dummy.cache.gets([1,2, 3])
Dummy.cache.get_by(id=1)
Dummy.cache.gets_by(id=1)

声明 unique_key

单个查询(get, get_by), 查询条件是 unique_key

class Dummy(BaseModel):
    id = Field(int, primary_key=True)
    key = Field(str)
    age = Field(int)
    name = Field(str)

    # 声明 unique keys
    __unique_keys__ = (
        ('key',),
        ('age', 'name'),
    )

# 以下都命中缓存
Dummy.cache.get_by(key='test')
Dummy.cache.get_by(age=12, name='foo')

声明 index_key

批量查询(gets_by)和数量查询(count_by), 查询条件是 index_key

注: gets_by 需要指定 limit 因为 OLO 的批量缓存的实现是缓存了前 200 条数据, 所以不指定 limit 或者 offset + limit > 200 将无法命中缓存

class Dummy(BaseModel):
    id = Field(int, primary_key=True)
    key = Field(str)
    age = Field(int)
    name = Field(str)

    # 声明 index keys
    __index_keys__ = (
        ('key',),
        ('age', 'name'),
    )

# 以下都命中缓存
Dummy.cache.gets_by(key='test', limit=20)
Dummy.cache.gets_by(age=12, name='foo', limit=20)
Dummy.cache.gets_by(age=12, limit=20)
Dummy.cache.count_by(age=12, name='foo')
Dummy.cache.count_by(age=12)

如上所示, OLO 的缓存对索引的处理和 MySQL 是一致的:

`gets_by(age=12)` 命中索引 `('age', 'name')`

声明 order_by

如果需要在查询中排序,还需声明 __order_bys__:

class Dummy(BaseModel):
    id = Field(int, primary_key=True)
    key = Field(str)
    age = Field(int)
    name = Field(str)

    # 声明 index keys
    __index_keys__ = (
        ('key',),
        ('age', 'name'),
    )

    # 声明 order bys
    __order_bys__ = (
        'age', '-age',
        ('name', '-age')
    )

# 以下都命中缓存
Dummy.cache.gets_by(key='test', order_by='age', limit=20)
Dummy.cache.gets_by(age=12, name='foo', order_by='-age', limit=20)
Dummy.cache.gets_by(age=12, order_by=('name', '-age'), limit=20)

其实 OLO 会根据 __primary_key__ 自动生成 __order_bys__:

__order_bys__ = (
    'id', '-id'
)

不根据 __index_keys__ 自动生成 __order_bys__ 的原因是会生成指数级的 __order_bys__, 导致清缓存时清除大量无用的 key,造成极度的资源浪费

实例方法

get

Model.get

gets

Model.gets

get_by

Model.get_by

gets_by

Model.gets_by

count_by

Model.count_by