【问题标题】:Any distributed cache systems that allows for tagging content?任何允许标记内容的分布式缓存系统?
【发布时间】:2009-09-04 09:45:02
【问题描述】:

我想知道是否有任何分布式缓存系统,如 memcached、velocity 或 sharedcache,它允许我用不仅仅是名称来标记内容,或者可以将项目相互关联,所以如果我使缓存无效一项也会使相关项失效。

例如。如果我有两个引用相同数据的页面并且数据发生更改,我希望这两个引用页面的缓存失效。

  • 或者这是对其中一个乞求开发的项目的补充? :)

编辑:我在 asp.net 上

【问题讨论】:

  • 我也会对此感兴趣 - 好问题。

标签: memcached tagging appfabric distributed-caching


【解决方案1】:

我相信可以使用 memcached 的 cas (check-and-set) 操作来删除依赖数据。每个值都有一个唯一的 ID(序列号)。对于每个key,存储另一个key.dependents,里面有数据的序列号,以及所有依赖的key。

当要添加依赖时,做

dependents, dep_serial = fetch(key+".dependents")
data, serial = fetch(key)
if serial != dependents[0]:
    # somebody changed the actual data
    start_over
generate_and_cache_dependent(dep_key, data)
dependents.append(dep_key)
if not cas(dependents, dep_serial):
   # somebody changed dependents
   start_over # can avoid regenerating the data if they are still at serial

当使一个项目无效时,做

dependents, dep_serial = fetch(key + ".dependents")
serial = update(key, new_data)
for dkey in dependents[1:]:
    delete(dkey)
dependents = [serial]
if not cas(dependents, dep_serial):
    start_over

即使存在写入冲突,这些算法最终也会终止,因为一个写入器总是会“通过”。

【讨论】:

  • 很有趣,我会调查的!但我真的很想把它包装成 set('section#1', 'section data', 'article#1,article#2,article#3') 然后就可以删除('article#1 ');然后当我下次尝试获取第 1 节时,它只需要重新生成它,但这可能会产生竞争条件和缓存死锁,而且这些也不好笑:/
【解决方案2】:

Velocity 支持标记,其中每个标记都是一个字符串。对象可以通过一个标签或多个标签来检索,例如“调味品”和“免费送货”。

但是 Velocity 不支持依赖项 - IIRC Velocity 团队表示依赖项不会出现在 v1.1 中。

【讨论】:

  • 也许我会研究速度,但我的直觉告诉我,memcache 是要走的路:)
  • 我会将此标记为解决方案。
【解决方案3】:

实现依赖是相当困难的,但也许共享缓存的所有其他功能 (http://www.sharedcache.com || http://sharedcache.codeplex.com) 将满足您对缓存的需求。

问候,罗尼

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2014-05-21
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多