Когда вы используете распределенный кеш, каждый объект реплицируется из нескольких независимых машин, несколько узлов кэша.
Если ваши объекты неизменяемы, репликация не является проблемой: поскольку объекты никогда не меняются, любой экземпляр кеша будет предоставлять точно такие же объекты.
Как только объекты становятся изменяемыми, возникает проблема согласованности: когда вы запрашиваете экземпляр кеша для объекта, как вы можете быть уверены, что объект, который доставляется вам, является актуальным? Что делать, если один экземпляр кэша обслуживал вас, объект был изменен другим пользователем в другом экземпляре кеша? В этом случае вы не получите последнюю версию, вы получите устаревшую версию.
Для решения этой проблемы необходимо сделать выбор. Одним из вариантов является принятие некоторой степени стойкости, которая обеспечивает лучшую производительность. Другой вариант - использовать какой-то протокол синхронизации, чтобы вы никогда не получали устаревшие данные: но, очевидно, для этой синхронизации данных между удаленными узлами кеша, возможно, требуется штраф за производительность.
И наоборот, представьте, что вы загружаете на узел кэша некоторые модификации объекта. Что делать, если в то же время другой пользователь загружает некоторые изменения одного и того же объекта в другой узел кеша? Должно ли это разрешаться или должно быть запрещено каким-либо запирающим механизмом?
Кроме того, должны ли изменения объектов на вашем узле кеша сразу же появляться для пользователей этого узла кэша? Или они станут видимыми только после того, как они будут реплицированы на другие узлы?
В конце дня изменяемые объекты делают вещи более сложными при совместном использовании распределенного кеша среди нескольких пользователей. Тем не менее, это не означает, что этот кеш нельзя использовать: это просто означает, что для изучения всех доступных опций требуется больше времени и более осторожности, и выберите соответствующий кеш для каждого приложения.