sunliwen / poco

Poco v1.6
0 stars 1 forks source link

提供刷新缓存的接口,以保证在特殊的情况下使用。 #14

Open kalakala opened 10 years ago

kalakala commented 10 years ago

为了保证运营的需要,有时会对搜索数据的准确做及时的刷新, 孙总曾在微信上说过要提供这种接口。 麻烦明确一下什么时候会提供这样的接口。

aoeuidht commented 10 years ago

Jacob, 我读了一下代码,

涉及到以下几种缓存:

search-result-cache property-cache suggestion-keyword-list api-key-to-site-id-dict site-id-to-api-key-dict

用户更新商品后,涉及到的缓存是search-resultproperty-cache.

有两种方式可以实现:

  1. 使用django自带的 cache.clear().
    • 好处是实现比较容易
    • 坏处就是会使所有的cache都失效,每次clear都会影响其他种类、其他site的cache; 提供接口之后,用户会倾向于每次更新商品信息都会清除cache,这样对性能影响又会被放大
  2. 更改 **get_cache_key 的实现,将site_id 放到cache_key 的起始位置(),清空cache时只需要清空redis中以site_id做为前缀的key,同时不会影响 suggestion、key-to-id、id-to-key 相关的缓存。 不过这种方式会带来两个问题
    • (非显式地)要求以后任何一个 **get_cache_key 都将 site_id 做为前缀
    • 绕过django cache,直接操作redis会为后续开发造成理解困难

我个人更倾向第二种使用方式。

jacobfan commented 10 years ago

我们用的django cache backend是django-redis,该backend支持cache.delete_pattern,应该能满足需要。(https://django-redis.readthedocs.org/en/latest/

另外,请设计一下相应的清缓存的api。考虑一下如何请求清不同部分的缓存。得设计成私有的管理api。参见(http://search.tuijianbao.net/docs/v1.6/management_api_items.html

aoeuidht commented 10 years ago

jacob, api 设计如下:

Authentication: 与 /v1.6/private/items/ 相同 API URI: POST /v1.6/private/cache/ 参数:

    flush = all | search | category | brand
    categories = [cid, cid, cid...]  (if flush == 'category')
    brands = [bid, bid, bid ....] (if flush == 'brand')
jacobfan commented 10 years ago

@lisztli category/brand部分暂时不需要。

如果我没有记错,在更新category和brand时,cache会自动更新。请检查一下是否如此。如果不是,那么应该改成更新这两者时自动更新。

aoeuidht commented 10 years ago

@jacobfan category、brand目前无法自动清空缓存,复现步骤如下: