Это довольно просто, записи в кеше могут быть
Вы должны позаботиться об уничтожении записей кэша при изменении связанных данных (поэтому на уровне приложения помимо обновления данных вы должны уничтожать определенные типы кэшированных записей при обновлении определенных таблиц; вы отслеживаете зависимости, жестко программируя их ).
Если вы хотите проявить смекалку, вы можете сделать так, чтобы ваш объект кеша указывал их зависимости и также кэшировал время последнего обновления для ваших таблиц БД.
Тогда вы могли бы
- выборка кэшированных данных, проверка зависимостей,
- получить время обновления для соответствующих таблиц БД и
- в случае, если запись устарела (время обновления таблицы, от которой зависит ваша запись в кеш большой задницы, позже, чем время записи в кэш), отбросьте ее и получите свежие данные из базы данных.
Вы можете даже интегрировать вышеперечисленное в свой уровень персистентности.
EDIT:
Конечно, выше, для того, когда вы хотите иметь согласованный кеш. Иногда, и для некоторых данных, вы можете ослабить требования согласованности, и есть сценарии, где простой TTL будет достаточно хорош (для тривиального примера, если у вас есть ttl 1 сек, у вас должны быть в основном проблемы с пользователями и они могут помочь обработка данных, и с более высокими временами вы все еще можете быть в порядке - например, допустим, вы кэшируете список кодов ISO стран; ваше приложение может будет в порядке, если вы скажете, давайте кешируем это на 86400 секунд).
Кроме того, вы также можете отслеживать время предоставления информации пользователю, например,
- скажем, пользователь видел данные A из кэша, и мы знаем, что эти данные были созданы / изменены в момент времени t1
- пользователь вносит изменения в данные A (и делает их данными B) и фиксирует изменение
- прикладной уровень может затем проверить, являются ли данные A все еще такими же, как в БД (если кэшированные данные, по которым пользователь принимал решения и / или изменения действительно были свежими)
- если оно было не свежим, то возникает конфликт, и пользователь должен подтвердить изменения
Это имеет дополнительную стоимость чтения данных A из БД, но это происходит только при записи.
Кроме того, конфликт может возникать не только из-за кеша, но также из-за того, что несколько пользователей пытаются изменить данные (т. Е. Это связано со стратегиями блокировки).