Skip to main content
Warning: You are using the test version of PyPI. This is a pre-production deployment of Warehouse. Changes made here affect the production instance of TestPyPI (testpypi.python.org).
Help us improve Python packaging - Donate today!

Smart caching for nameko using evenlet to refresh cached items asynchronously

Project Description
nameko-cacheback
================

这里通过eventlet协程异步地刷新缓存。

``nameko-cacheback`` 是我为nameko微服务写的一个通过rabbit message queue
解耦异步地刷新过期缓存的插件。
这里的关键是我们容许获取一个刚刚过期的缓存,但不会阻塞用户的请求,
所以这就避免了由于缓存过期引起的惊群现象。


``nameko-cacheback`` 通过一个装饰器便可以简单方便替我们构造缓存系统。

初始化
------------

1. 安装
~~~~~~~~~~~~
``nameko-cacheback`` 依赖于redis服务

::

pip install nameko-cacheback

会自动安装 ``nameko-redis`` 模块,可以参考https://github.com/etataurov/nameko-redis

2. 设置缓存服务
~~~~~~~~~~~~~~~~~
为了确保 ``nameko-cacheback`` 依赖的
`nameko-redis <https://github.com/etataurov/nameko-redis>`__ 服务配置正常,
需要在config中增加如下配置

.. code:: yaml

AMQP_URI: 'amqp://guest:guest@localhost'
REDIS_URIS:
cacheback: 'redis://localhost:6379/0'


然后再代码中设置缓存依赖

.. code:: python

from nameko_redis import Redis

class YourNamekoService(object):
name = "you_service"
cache = Redis("cacheback") # required namek-redis

3. 日志
~~~~~~~~~~

日志将打到名为 ``nameko_cacheback`` 的logger中。

用法
-----

1. 装饰器用法
~~~~~~~~~~~~~~~~~

通过装饰器将需要缓冲的函数包装一下,比如 ``your_svr_func`` 的结果需要缓存

.. code:: python


from nameko.events import EventDispatcher
from nameko_cacheback import CachebackEventHandlerMixin, cacheback, multi_cacheback

class YourNamekoService(CachebackEventHandlerMixin):
name = "you_service"
dispatch = EventDispatcher() # required
cache = Redis("cacheback") # required namek-redis

@cacheback(lifetime=60) # 装饰器用法
def your_svr_func(self, *args):
balabala

@multi_cacheback(lifetime=60)
def get_user_info(self, uid_list, gender):
balabala


主要上面的 ``cache`` 和 ``dispatch`` 属性是必须的,前者是redis缓存服务,后者用于消息队列解耦。
这里``cacheback``装饰器起到2个作用

- 将函数结果缓存1分钟.
- 当缓存过期程序自动异步的刷新缓存结果,但是当缓存不存在时,会同步的获取最新数据。

``multi_cacheback``是一个自动处理批量接口的装饰器,他要求你的处理函数返回一个字典,其
key是批量的参数。

比如 ``get_user_info([11, 22, 33], 'female')``,你的函数应该返回
.. code:: python

{
'11': user_infoxxxxxxxx,
'22': user_infoxxxxxxxx,
'33': user_infoxxxxxxxx,
}

装饰器会逐个处理,将key和函数的其他参数合并构造一个缓存key,然后用redis的pipeline
一并存入缓存中。

当有下次请求时 ``get_user_info([22, 33, 44, 55], 'female')``,根据请求中的批量参数,构造出待查询的key列表,用redis的pipeline一并查询

如果没有查到的,则再执行一次 ``get_user_info([44, 55], 'female')``

这样就每次只需要增量的查询


2. 失效缓存
~~~~~~~~~~~~~~~

你可以通过函数的job属性使缓存失效,


.. code:: python

your_svr_func.job.invalidate(self, *args)

他将触发一个异步事件执行缓存更新操作

你也可以简单的删除一个缓存,然后当下次请求的时候再同步的获取最新缓存。

.. code:: python

your_svr_func.job.delete(self, *args)

3. 控制缓存的4个时间概念
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

nameko-cacehback中我们使用了4个时间概念临时缓存时间、业务缓存时间、失效时间、过期时间

1. 默认配置
临时缓存时间 = 10s、业务缓存时间 = 60s 、失效时间 = 1h、过期时间 = 1 week

2. 业务缓存时间,也即是我们上面代码中 lifetime=60 ,和我们一般理解的缓存时间一样。 当达到这个业务缓存时间之后,有新的请求进来将触发一个异步任务执行刷新缓存的操作, 同时将这个刚刚过期的缓存返回给用户。

3. 在触发缓存刷新的同时,也会将当前这个刚刚过期的缓存重新再存入redis, 只是以一个较短的临时缓存时间再存进去。这样可以避免重复的触发异步刷新操作。

4. 当达到业务缓存时间之后,迟迟未有新请求,直到过了失效时间,为了避免用户拿到 过久的数据,此时将触发同步刷新缓存操作

5. 过期时间这是一个redis的有效时间,达到过期时间之后,将从物理上删除这个缓存。


API
---

``cacheback`` 装饰器的参数如下:

- ``lifetime`` : 业务缓存时间. 过来该时间之后的请求将触发异步刷新缓存操作。默认为1分钟
- ``fetch_on_miss`` : 当缓存不存在时,是同步的获取最新数据,或者返回设置的默认值。 默认为同步获取最新数据
- ``default_result`` : 默认值
- ``cache_name`` : nameko服务中用于存储数据的Redis缓存模块,默认为self的cache属性
- ``key_prefix`` : 自动构造缓存key值时的前缀,默认是系统名称
- ``fetch_on_stale_threshold`` : 失效时间.
- ``event_dispatcher_name`` : nameko服务中用户事件分发的属性,默认为self的dispatch属性


``multi_cacheback`` 的参数与``cacheback``相似
Release History

Release History

This version
History Node

0.6.0

History Node

0.5.1

History Node

0.5.0

History Node

0.4.2

History Node

0.4.1

History Node

0.4

History Node

0.3

History Node

0.2

History Node

0.1

Download Files

Download Files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

File Name & Checksum SHA256 Checksum Help Version File Type Upload Date
nameko-cacheback-0.6.0.tar.gz (10.1 kB) Copy SHA256 Checksum SHA256 Source Jul 12, 2017

Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting