#c# #.net #asp.net-core #memcached
#c# #.net #asp.net-ядро #memcached
Вопрос:
У меня есть игра, написанная на C #. У меня есть два API. Первый обновляет запись в БД и отправляет ответ, а второй получает запись.
Я использую Memcached
его для получения из кэша, а не из базы данных, поскольку вызывающих API много, и я не хочу перегружать количество обращений к базе данных. Что я делаю, так это обновляю данные в базе данных и вручную обновляю значение ключа в кэше. Я использую этот подход, а не тот, при котором вы очищаете ключ из кэша и в следующий раз получаете его из БД и сохраняете обратно в кеш.
Теперь мой вопрос в том, верен ли мой код? Это хорошая практика? А что, если запись сохраняется в базе данных, а не в кэше? Как предотвратить это?
private async Task UpdateStateAsync(State State)
{
await _unitOfWork.State
.UpdateAsync(ts => ts.Id == State.Id, ts => new State()
{
Status = State.Status
});
}
private async Task UpdateStateCacheItemAsync(State state)
{
await _cache.SaveAsync($"State_{state.GameId}", state); //override data if same key exists
}
Вот как я вызываю их в своем теле API
//some logic here
await UpdateStateAsync(state); //update the record in DB
await _unitOFWork.Complete(); //commit changes to DB
await UpdateStateCacheItemAsync(state); //update item in cache
Ответ №1:
Идея хорошая. Именно так мы и хотели бы, чтобы кэш был реализован. Хотя в этой логике есть изъян. Вы знаете, что Memcache — это форма кэша, которая хранит свои объекты в памяти. Сам Memcache может принять решение удалить любой объект, если он не используется в течение длительного времени. Или сервер может выйти из строя, и все объекты в Memcache могут быть удалены.
Итак, ваша логика записи верна. Запись / обновление в базу данных, а затем также обновление в кеш.
Однако для чтения я бы прочитал из Memcache, если я не получу то, что хочу, моим запасным вариантом будет чтение из базы данных.
Для дальнейшего улучшения при записи обновлений в Memcache я бы написал его только в том случае, если он уже присутствует в Memcache. Предполагается, что если он еще не присутствует, он может не потребоваться, и Memcache может в любом случае удалить этот объект. Кроме того, при добавлении ненужных объектов вы можете удалить необходимые объекты.
Комментарии:
1. Спасибо за ваш ответ. На самом деле у меня есть эта логика, реализованная в методе getState. Я сохраняю эти данные в кэше в течение некоторого периода. Для получения, если он существует в кэше, мы получаем его оттуда, если нет, мы получаем его из базы данных. Но мне было интересно, если я обновлю БД, и мои данные не будут обновлены в кэше (по какой-то причине), это доставит много проблем. потому что в 99,99% случаев я получаю данные из кэша, потому что вызовы происходят каждые несколько секунд.
2. Да .. но с этим нам придется смириться. Единственное, что мы можем сделать, это написать логику обновления кэша, которая не дает сбоев. Вы можете запустить его за очередью и убедиться, что он выполняется. Эта проблема будет существовать в обоих сценариях, либо вы обновляете кеш, либо очищаете кеш, вам нужно будет убедиться, что это сделано.