Polly 缓存策略未向缓存添加值
Polly cache policy is not adding values to the cache
我对使用 Polly 项目的缓存策略一头雾水。
我都按照例子设置了,基本可以了
我已经编写了一个单元测试,其中值被成功检索,放入缓存并在以后的调用中从缓存中读取。
但是,当我 运行 asp.net 核心上下文中的代码时,它没有按预期工作。执行包装的操作并检索值。但是,永远不会执行放入缓存的方法。
我尝试使用自己的 IAsyncCacheProvider 来调试问题。它的 PutAsync 方法从不在 asp.net 上下文中调用。虽然在单元测试中 运行ning 时会调用它。
这是我的服务配置
services.AddSingleton<IAsyncCacheProvider, MemoryCacheProvider>();
services.AddSingleton<IPolicyRegistry<string>, PolicyRegistry>();
此处摘自导致问题的 class。
public Bar(
IPolicyRegistry<string> policyRegistry,
IService service,
IAsyncCacheProvider cacheProvider)
{
this.policyRegistry = policyRegistry;
this.service = service;
this.cacheProvider = cacheProvider;
}
public Task<bool> Foo(Guid id)
{
var cachePolicy = this.GetPolicy();
return cachePolicy.ExecuteAsync(
_ => this.service.Foo(id),
new Context("policyKey" + id));
}
private CachePolicy<bool> GetPolicy()
{
if(!this.policyRegistry.TryGet(PolicyKey, out CachePolicy<bool> policy))
{
policy = Policy.CacheAsync<bool>(
this.cacheProvider.AsyncFor<bool>(),
TimeSpan.FromMinutes(5),
(c, s) => { },
(c, s) => { },
(c, s) => { },
(c, s, e) => { },
(c, s, e) => { });
this.policyRegistry.Add(PolicyKey, policy);
}
return policy;
}
任何想法,什么可能导致这种行为?当我放置断点时,它永远不会尝试将 return 值添加到缓存中。也不例外。
我想我在源代码中找到了答案。
在class缓存引擎中有如下代码。
if (ttl.Timespan > TimeSpan.Zero && result != null && !result.Equals(default(TResult)))
{
try
{
await cacheProvider.PutAsync(cacheKey, result, ttl, cancellationToken, continueOnCapturedContext).ConfigureAwait(continueOnCapturedContext);
onCachePut(context, cacheKey);
}
catch (Exception ex)
{
onCachePutError(context, cacheKey, ex);
}
}
因此,每当此服务的 return 值(布尔值)恰好为 false 时,它不会被放入缓存,因为这实际上是该类型的默认值。在单元测试中,我碰巧使用 true 作为 returned 值,因此缓存有效。
我对使用 Polly 项目的缓存策略一头雾水。 我都按照例子设置了,基本可以了
我已经编写了一个单元测试,其中值被成功检索,放入缓存并在以后的调用中从缓存中读取。 但是,当我 运行 asp.net 核心上下文中的代码时,它没有按预期工作。执行包装的操作并检索值。但是,永远不会执行放入缓存的方法。 我尝试使用自己的 IAsyncCacheProvider 来调试问题。它的 PutAsync 方法从不在 asp.net 上下文中调用。虽然在单元测试中 运行ning 时会调用它。
这是我的服务配置
services.AddSingleton<IAsyncCacheProvider, MemoryCacheProvider>();
services.AddSingleton<IPolicyRegistry<string>, PolicyRegistry>();
此处摘自导致问题的 class。
public Bar(
IPolicyRegistry<string> policyRegistry,
IService service,
IAsyncCacheProvider cacheProvider)
{
this.policyRegistry = policyRegistry;
this.service = service;
this.cacheProvider = cacheProvider;
}
public Task<bool> Foo(Guid id)
{
var cachePolicy = this.GetPolicy();
return cachePolicy.ExecuteAsync(
_ => this.service.Foo(id),
new Context("policyKey" + id));
}
private CachePolicy<bool> GetPolicy()
{
if(!this.policyRegistry.TryGet(PolicyKey, out CachePolicy<bool> policy))
{
policy = Policy.CacheAsync<bool>(
this.cacheProvider.AsyncFor<bool>(),
TimeSpan.FromMinutes(5),
(c, s) => { },
(c, s) => { },
(c, s) => { },
(c, s, e) => { },
(c, s, e) => { });
this.policyRegistry.Add(PolicyKey, policy);
}
return policy;
}
任何想法,什么可能导致这种行为?当我放置断点时,它永远不会尝试将 return 值添加到缓存中。也不例外。
我想我在源代码中找到了答案。
在class缓存引擎中有如下代码。
if (ttl.Timespan > TimeSpan.Zero && result != null && !result.Equals(default(TResult)))
{
try
{
await cacheProvider.PutAsync(cacheKey, result, ttl, cancellationToken, continueOnCapturedContext).ConfigureAwait(continueOnCapturedContext);
onCachePut(context, cacheKey);
}
catch (Exception ex)
{
onCachePutError(context, cacheKey, ex);
}
}
因此,每当此服务的 return 值(布尔值)恰好为 false 时,它不会被放入缓存,因为这实际上是该类型的默认值。在单元测试中,我碰巧使用 true 作为 returned 值,因此缓存有效。