Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新数据库和缓存中的数据的最佳实践_C#_.net_Asp.net Core_Memcached - Fatal编程技术网

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

C# 更新数据库和缓存中的数据的最佳实践,c#,.net,asp.net-core,memcached,C#,.net,Asp.net Core,Memcached,我有一个用C写的游戏。我有两个API。第一个更新数据库中的记录并发送响应,第二个获取记录 我使用Memcached从缓存中获取它,而不是从数据库中获取它,因为API的调用方很多,我不想让对数据库的调用次数过多。我所做的是更新数据库中的数据,并手动更新缓存中密钥的值。我使用的是这种方法,而不是从缓存中清除密钥,然后下次从数据库中获取密钥并将其保存回缓存中的方法 现在,我的问题是,我的代码正确吗?这是个好习惯吗?如果记录保存在数据库中而不是缓存中呢?如何防止这种情况发生 private async

我有一个用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可能会以任何方式逐出该对象。另外,在添加不必要的对象时,您可能会逐出必要的对象。

感谢您的回复。我实际上在GetState方法中实现了该逻辑。我将数据保存在缓存中一段时间。对于获取,如果它存在于缓存中,我们从那里获取,如果不存在,我们从数据库获取。但是我想知道如果我更新了数据库,而缓存中的数据没有更新(出于某种原因),那会带来很多麻烦。因为99.99%的时间我都是从缓存中获取数据的,因为调用恰好是每隔几秒钟一次。是的……但这是我们不得不忍受的。我们唯一能做的就是编写一个不会失败的缓存更新逻辑。您可以在队列后面运行它,并确保它运行。在这两种情况下都会存在此问题,无论是更新缓存还是清除缓存,都必须确保已完成。