Memcached зависимые элементы - PullRequest
       29

Memcached зависимые элементы

7 голосов
/ 28 февраля 2011

Я использую memcahced (в частности, клиент memyached * Enyim ), и я хотел бы иметь возможность сделать ключи в кеше зависимыми от других ключей, т.е. если Ключ A зависит от Ключ B , поэтому всякий раз, когда Ключ B удаляется или изменяется, Ключ A также становится недействительным.

Если возможно, я также хотел бы убедиться, что целостность данных поддерживается в случае сбоя узла в кластере, т.е. если Ключ B в какой-то момент недоступен, Ключ A долженвсе еще будет недействительным, если Ключ B станет недействительным.

На основании этого поста Я считаю, что это возможно, но я изо всех сил пытаюсь понять алгоритм достаточно, чтобыубедить себя, как / почему это работает.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

7 голосов
/ 03 октября 2011

В последнее время я довольно часто использовал memcached, и я уверен, что то, что вы пытаетесь сделать с зависимостями, невозможно с memcached "как есть", но должно быть обработано со стороны клиента. Кроме того, что репликация данных должна происходить на стороне сервера, а не со стороны клиента, это 2 разных домена. (По крайней мере, с memcached, видя недостаток логики хранения данных. Смысл memcached - это просто минимализм для лучшей производительности)

Для репликации данных (защита от физического сбойного узла кластера) вы должны вместо этого использовать проверенную http://www.couchbase.org/get/couchbase/current.

Для алгоритма 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.

Приветствия

0 голосов
/ 30 сентября 2011

Я не думаю, что это прямое решение, но попробуйте создать систему пространств имен в ключах memcache, например, http://www.cakemail.com/namespacing-in-memcached/. Короче говоря, ключи генерируются и содержат текущие значения других ключей memcached. В проблеме с пространством имен идея состоит в том, чтобы лишить законной силы целый ряд ключей, которые находятся в определенном пространстве имен. Это достигается с помощью чего-то вроде увеличения значения ключа пространства имен, и любые ключи, ссылающиеся на предыдущее значение пространства имен, не будут совпадать при регенерации ключа.

Ваша проблема выглядит немного иначе, но я думаю, что установив Key A в пространство имен Key B", если узел B был недоступен, тогда вычисляется Полный ключ пространства имен * A , например,

"Key A|Key B:<whatever Key B value is>"

вернет false, что позволит вам определить, что B недоступен, и аннулировать поиск в кэше для Ключ A .

...