C# 更新数据库和缓存中的数据的最佳实践
我有一个用C写的游戏。我有两个API。第一个更新数据库中的记录并发送响应,第二个获取记录 我使用C# 更新数据库和缓存中的数据的最佳实践,c#,.net,asp.net-core,memcached,C#,.net,Asp.net Core,Memcached,我有一个用C写的游戏。我有两个API。第一个更新数据库中的记录并发送响应,第二个获取记录 我使用Memcached从缓存中获取它,而不是从数据库中获取它,因为API的调用方很多,我不想让对数据库的调用次数过多。我所做的是更新数据库中的数据,并手动更新缓存中密钥的值。我使用的是这种方法,而不是从缓存中清除密钥,然后下次从数据库中获取密钥并将其保存回缓存中的方法 现在,我的问题是,我的代码正确吗?这是个好习惯吗?如果记录保存在数据库中而不是缓存中呢?如何防止这种情况发生 private async
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可能会以任何方式逐出该对象。另外,在添加不必要的对象时,您可能会逐出必要的对象。感谢您的回复。我实际上在GetState方法中实现了该逻辑。我将数据保存在缓存中一段时间。对于获取,如果它存在于缓存中,我们从那里获取,如果不存在,我们从数据库获取。但是我想知道如果我更新了数据库,而缓存中的数据没有更新(出于某种原因),那会带来很多麻烦。因为99.99%的时间我都是从缓存中获取数据的,因为调用恰好是每隔几秒钟一次。是的……但这是我们不得不忍受的。我们唯一能做的就是编写一个不会失败的缓存更新逻辑。您可以在队列后面运行它,并确保它运行。在这两种情况下都会存在此问题,无论是更新缓存还是清除缓存,都必须确保已完成。