首页 > 解决方案 > 更新数据库和缓存中的数据的最佳实践

问题描述

我有一个用 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

标签: c#.netasp.net-corememcached

解决方案


这个想法很好。这正是我们希望实现缓存的方式。虽然逻辑有缺陷。你知道 Memcache 是一种缓存形式,它将其对象存储在内存中。如果长时间不使用,Memcache 本身可能会决定驱逐任何对象。或者服务器可能会出现故障,并且 Memcache 中的所有对象都可能会被删除。

所以你写的逻辑是正确的。写入/更新到数据库,然后更新到缓存。

不过要阅读,我会从 Memcache 中读取,如果我没有得到我想要的,我的后备是从数据库中读取。

为了在向 Memcache 写入更新时进一步改进,如果它已经存在于 Memcache 中,我只会编写它。假设如果它不存在,则可能不需要它,并且 Memcache 可能无论如何都会驱逐该对象。另外,在添加不必要的对象时,您可能会驱逐必要的对象。


推荐阅读