我想知道是否有任何分布式缓存系统,例如 memcached、velocity 或 sharedcache,它允许我用不仅仅是名称来标记内容,或者可以将项目相互关联,所以如果我使一个项目的缓存无效,它也使相关项目无效。
例如。如果我有两个引用相同数据的页面并且数据发生更改,我希望这两个引用页面的缓存无效。
- 或者这是对其中一个乞求开发的项目的补充?:)
编辑:我在asp.net
我想知道是否有任何分布式缓存系统,例如 memcached、velocity 或 sharedcache,它允许我用不仅仅是名称来标记内容,或者可以将项目相互关联,所以如果我使一个项目的缓存无效,它也使相关项目无效。
例如。如果我有两个引用相同数据的页面并且数据发生更改,我希望这两个引用页面的缓存无效。
编辑:我在asp.net
我相信可以使用 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
即使存在写入冲突,这些算法最终也会终止,因为一个写入者总是会“通过”。
Velocity 支持标记,其中每个标记都是一个字符串。对象可以通过一个标签或多个标签来检索,例如“调味品”和“免费送货”。
然而,Velocity 不支持依赖项——IIRC Velocity 团队表示依赖项不会出现在 v1 中。
实现依赖是相当困难的,但也许共享缓存 ( http://www.sharedcache.com || http://sharedcache.codeplex.com ) 的所有其他功能都将满足您对缓存的需求。
问候,罗尼