Подтвердить что ты не робот

NHibernate и Memcached - следует использовать параметр_minimal_puts?

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

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

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

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

Я бы выиграл от включения cache.use_minimal_puts в этом сценарии?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

CacheMode.REFRESH будет обходить эффект hibernate.cache.use_minimal_puts