Caching Memcached依赖项

Caching Memcached依赖项,caching,memcached,enyim,Caching,Memcached,Enyim,我正在使用(特别是)并且我希望能够使缓存中的键依赖于其他键,即如果键a依赖于键B,那么每当键B被删除或更改时,键a也会失效 如果可能,我还希望确保在集群中的节点出现故障的情况下保持数据完整性,即如果键B在某个点不可用,如果键B无效,则键a仍应无效 基于以上原因,我相信这是可能的,但我正在努力理解算法,以说服自己这是如何/为什么工作的 有人能帮我吗?我认为这不是一个直接的解决方案,但请尝试在memcache密钥中创建一个名称空间系统,例如。简而言之,这些键是生成的,并且包含其他memcached键

我正在使用(特别是)并且我希望能够使缓存中的键依赖于其他键,即如果键a依赖于键B,那么每当键B被删除或更改时,键a也会失效

如果可能,我还希望确保在集群中的节点出现故障的情况下保持数据完整性,即如果键B在某个点不可用,如果键B无效,则键a仍应无效

基于以上原因,我相信这是可能的,但我正在努力理解算法,以说服自己这是如何/为什么工作的


有人能帮我吗?

我认为这不是一个直接的解决方案,但请尝试在memcache密钥中创建一个名称空间系统,例如。简而言之,这些键是生成的,并且包含其他memcached键的当前值。在名称空间问题中,其思想是使某个名称空间中的整个密钥范围无效。这是通过增加名称空间键的值来实现的,任何引用先前名称空间值的键在重新生成键时都不会匹配

您的问题看起来有点不同,但我认为通过将键a设置在键B命名空间中,如果节点B不可用,则计算键a的完整命名空间键,例如

"Key A|Key B:<whatever Key B value is>"
“A键| B键:”

将返回false,从而允许您确定B不可用,并使键A的缓存查找无效

我最近一直在使用memcached,我确信您试图用memcached“按原样”处理依赖性是不可能的“但需要从客户端处理。另外,数据复制应该在服务器端进行,而不是从客户端进行,这是两个不同的域。(至少使用memcached,因为它缺少数据存储逻辑。memcached的要点就是,为了获得更好的性能,它采用了极端的极简主义)

对于数据复制(针对物理故障群集节点的保护),您应该改为签出membased

对于deps算法,我可以在客户机中看到类似的情况:对于任何给定的密钥,都有一个可疑的附加密钥保存依赖密钥的列表/数组

# - delete a key, recursive:
function deleteKey( keyname ):
    deps = client.getDeps( keyname ) #
    foreach ( deps as dep ):
        deleteKey( dep )
        memcached.delete( dep )
    endeach
    memcached.delete( keyname )
endfunction

# return the list of keynames or an empty list if the key doesnt exist
function client.getDeps( keyname ):
    return memcached.get( key_name + "_deps" ) or array()
endfunction

# Key "demokey1" and its counterpart "demokey1_deps". In the list of keys stored in
# "demokey1_deps" there is "demokey2" and "demokey3".
deleteKey( "demokey1" );
# this would first perform a memcached get on "demokey1_deps" then with the
# value returned as a list of keys ("demokey2" and "demokey3") run deleteKey()
# on each of them.
干杯