我想知道是否有像memcached,velocity或sharedcache这样的分布式缓存系统,它允许我用不仅仅是它的名称来标记内容,或者可以将项目关联到彼此,所以如果我使缓存无效一个项目也会使相关项目无效。
例如。如果我有两个页面引用相同的数据并且数据发生变化,我希望两个引用页面的缓存无效。
编辑:我在asp.net上
答案 0 :(得分: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
即使存在冲突的写入,这些算法最终也会终止,因为一个作家总是“通过”。
答案 1 :(得分:0)
Velocity支持标记每个标记为字符串的位置。可以通过标签或多个标签来检索对象,例如'调味品'和'免费送货'。
然而,Velocity不支持依赖--IndRC Velocity团队表示依赖关系不会出现在v1中。
答案 2 :(得分:0)
实现依赖是非常困难的,但是共享缓存(http://www.sharedcache.com || http://sharedcache.codeplex.com)的所有其他功能都可能适合您的缓存需求。
问候,罗尼