在Azure服务结构中实现缓存

在Azure服务结构中实现缓存,azure,caching,azure-service-fabric,stateful,Azure,Caching,Azure Service Fabric,Stateful,我正在从事一个项目,在该项目中,我经常需要一组数据,目前为了获取这些数据,我必须打电话给第三方服务,这需要花费很多时间。因此,我想维护一个本地缓存。数据很少被修改或几乎保持不变。最好的方法是什么在Azure服务结构中实现这一点的方法。我目前正在考虑使微服务有状态。这样做的最佳方法是什么?当节点停止运行时,它应该将其本地缓存复制到其他节点。如果使其有状态比我如何继续实现更好?那么,您有两种选择: 如果需要性能和地理缓存数据复制,可以使用redis缓存 另一个选择是使用可靠的字典。这是一个服务结构特

我正在从事一个项目,在该项目中,我经常需要一组数据,目前为了获取这些数据,我必须打电话给第三方服务,这需要花费很多时间。因此,我想维护一个本地缓存。数据很少被修改或几乎保持不变。最好的方法是什么在Azure服务结构中实现这一点的方法。我目前正在考虑使微服务有状态。这样做的最佳方法是什么?当节点停止运行时,它应该将其本地缓存复制到其他节点。如果使其有状态比我如何继续实现更好?

那么,您有两种选择: 如果需要性能和地理缓存数据复制,可以使用redis缓存

另一个选择是使用可靠的字典。这是一个服务结构特性,可靠的字典被复制到其他节点

您只能在服务结构状态完整上下文中访问可靠字典

示例如下:

IReliableDictionary<string, string> Dictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, string>>("stringlistcache");
    using (var tx = this.StateManager.CreateTransaction())
    {   
        await pingDictionary.AddOrUpdateAsync(tx, "testkey", "testvalue", (key, value) => "testvalue");
        cachedValue = await Dictionary.TryGetValueAsync(tx, "testkey");
        await Dictionary.TryRemoveAsync(tx, "testkey");
        await tx.CommitAsync();     
    }
IReliableDictionary=wait this.StateManager.GetOrAddAsync(“stringlistcache”);
使用(var tx=this.StateManager.CreateTransaction())
{   
等待pingDictionary.addorUpdateSync(tx,“testkey”,“testvalue”,“key,value)=>“testvalue”);
cachedValue=await Dictionary.TryGetValueAsync(tx,“testkey”);
等待字典.TryRemoveAsync(tx,“testkey”);
wait tx.CommitAsync();
}

我知道这篇文章已经很老了,但是对于那些现在正在寻找解决方案的人来说,你可以使用这个开源项目:

您也可以在GitHub上找到它:

缓存需要什么行为?数据是否应该存储?或者,如果数据丢失,但只是性能下降,这是没有问题的?@WouterB数据应该存储,而不应该丢失。如果您的信息不应该丢失,则可能是您的最佳选择。有一点取决于数据的大小。如果发现性能太低,您也可以使用由可靠集合备份的运行时变量来“缓存”它。@WouterB我应该创建单例分区吗?这取决于您的数据有多大。如果您的数据很大,并且您需要经常访问它,那么对服务进行分区可能是一个好主意。