繁体   English   中英

更新数据库和缓存中数据的最佳实践

[英]Best practice updating data in DB and in cache

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

这个主意不错。 这正是我们希望缓存实现的方式。 虽然逻辑有问题。 你知道 Memcache 是一种缓存形式,它把它的对象存储在内存中。 如果长时间不使用,Memcache 本身可能会决定驱逐任何对象。 或者服务器可能会失败并且 Memcache 中的所有对象都可能被删除。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM