5

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

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

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

编辑:我在asp.net

4

3 回答 3

3

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

要添加依赖项时,请执行

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

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

于 2009-09-04T11:11:51.207 回答
0

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

然而,Velocity 不支持依赖项——IIRC Velocity 团队表示依赖项不会出现在 v1 中。

于 2009-09-06T21:43:24.617 回答
0

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

问候,罗尼

于 2009-09-08T06:50:47.837 回答