Какие-нибудь системы распределенного кеширования, позволяющие помечать контент?

Я хотел бы знать, есть ли какие-либо системы распределенного кеширования, такие как memcached, speed или sharedcache, которые позволяют мне помечать контент не только его именем, или которые могут связывать элементы друг с другом, поэтому, если я аннулирую кеш для одного элемента, он также делает недействительными связанные элементы.

например. если у меня есть две страницы, которые ссылаются на одни и те же данные, и эти данные меняются, я бы хотел, чтобы кеш для двух ссылающихся страниц стал недействительным.

  • или это дополнение к одному из тех проектов, которые нуждаются в разработке? :)

изменить: я на asp.net


person possan    schedule 04.09.2009    source источник
comment
Меня тоже это заинтересует - хороший вопрос.   -  person Preet Sangha    schedule 04.09.2009


Ответы (3)


Velocity поддерживает теги, где каждый тег представляет собой строку. Объекты могут быть получены с помощью тега или нескольких тегов, например. «Приправа» И «Бесплатная доставка».

Однако Velocity не поддерживает зависимости - IIRC команда Velocity заявила, что зависимости не будут в v1.

person PhilPursglove    schedule 06.09.2009
comment
возможно, тогда я посмотрю на скорость, но моя интуиция подсказывает мне, что memcache - это то, что нужно :) - person possan; 07.09.2009
comment
Я отмечу это как решение. - person possan; 07.09.2009

Я считаю, что удаление зависимых данных может быть выполнено с помощью операции memcached cas (check-and-set). Каждое значение имеет уникальный идентификатор (серийный). Для каждого ключа сохраните еще один 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

Даже при наличии конфликтующих записей эти алгоритмы в конечном итоге прекратят работу, поскольку один писатель всегда «проходит».

person Martin v. Löwis    schedule 04.09.2009
comment
интересно, я посмотрю на это! но я бы очень хотел обернуть его во что-то вроде set ('section # 1', 'section data', 'article # 1, article # 2, article # 3'), а затем просто иметь возможность удалить ('article # 1 '); а затем, когда я пытаюсь получить section1 в следующий раз, он просто должен его регенерировать, но это может создать условия гонки и тупики кеша, и это тоже не смешно: / - person possan; 04.09.2009

реализовать зависимость довольно сложно, но, возможно, все остальные функции общего кэша (http://www.sharedcache.com || http://sharedcache.codeplex.com) будет соответствовать вашим потребностям в кэшировании.

С уважением, Рони

person user258880    schedule 08.09.2009