NHibernate и Memcached - должны быть включены use_minimal_puts?

Я использую NHibernate с Memcached в качестве кэша второго уровня и всегда интересовался cache.use_minimal_puts Вариант конфигурации.

Согласно документации:

hibernate.cache.use_minimal_puts: оптимизирует работу кэша второго уровня для минимизации операций записи за счет более частых операций чтения. Этот параметр наиболее полезен для кластерных кэшей и в Hibernate3 включен по умолчанию для реализаций кластерного кэша.

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

Буду ли я полезен от включения cache.use_minimal_puts по этому сценарию?

2 ответа

Решение

У меня нет опыта в NHibernate, но я работал с кэшами второго уровня в Hibernate, и мне сказали, что к обоим применимы одни и те же понятия.

Основная идея предоставления параметра hibernate.cache.use_ minimal_puts заключается в том, что перед тем, как hibernate помещает объект в кэш, он сначала проверяет кэш второго уровня, присутствует ли объект там, а если нет, то только помещает его туда.

Это было бы полезно ТОЛЬКО в тех случаях, когда чтение данных из кэша обходится дешевле, чем обновление данных. Вот что означает документация о следующем

... оптимизация работы кэша второго уровня для минимизации операций записи за счет более частых операций чтения.

Случай, который идеально подходит для такого рода оптимизации, - репликация в кластеризации.

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

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

Одним из факторов, который может снизить производительность, является тип репликации (синхронной или асинхронной), используемый Memcache. Я не использовал MemCache, но EhCache поддерживает обе модели.

Так что в вашем случае, поскольку вы НЕ используете кластеризацию и хотя кэш находится на удаленном процессе, я серьезно сомневаюсь, что при установке этого параметра в значение true будет какое-то преимущество.

Просто чтобы добавить еще несколько деталей.

hibernate.cache.use_minimal_puts, установив это значение на true предотвратит слепую перезапись ранее кэшированных значений, что решает проблемы кластерного кэша. согласно руководству, он включен по умолчанию для реализации кластерного кэша.

Hibernate обеспечивает свойство конфигурации hibernate.cache.use_minimal_puts, который оптимизирует доступ к кешу для кластерных кешей за счет увеличения чтения кеша и уменьшения количества обновлений кеша.

CacheMode.REFRESH обойдет hibernate.cache.use_minimal_puts эффект

Другие вопросы по тегам