【发布时间】:2017-09-26 04:42:36
【问题描述】:
IMemoryCache 中没有可用的方法允许遍历每个缓存项。我的项目很小,我不想使用 Redis 之类的其他选项。
namepsace Microsoft.Extensions.Caching.Memory{
public static class CacheExtensions
{
public static object Get(this IMemoryCache cache, object key);
public static TItem Get<TItem>(this IMemoryCache cache, object key);
public static TItem GetOrCreate<TItem>(this IMemoryCache cache, object key, Func<ICacheEntry, TItem> factory);
[AsyncStateMachine(typeof(CacheExtensions.<GetOrCreateAsync>d__9<>))]
public static Task<TItem> GetOrCreateAsync<TItem>(this IMemoryCache cache, object key, Func<ICacheEntry, Task<TItem>> factory);
public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value);
public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value, DateTimeOffset absoluteExpiration);
public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value, TimeSpan absoluteExpirationRelativeToNow);
public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value, IChangeToken expirationToken);
public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value, MemoryCacheEntryOptions options);
public static bool TryGetValue<TItem>(this IMemoryCache cache, object key, out TItem value);
}
}
https://github.com/aspnet/Caching/blob/dev/src/Microsoft.Extensions.Caching.Memory/MemoryCache.cs
【问题讨论】:
-
我不认为有这样的功能,你可以做的简单的事情是将内存缓存包装在一个新的类中,该类存储缓存的键(预存储+每个项目集上的新条目)和一种迭代它们的方法,从 MemoryCache 调用 Get 方法。
-
迭代 MemoryCache 根本不是该类的用例。当然,您可以通过将缓存包装在另一个类中来添加它,但是您必须处理并发访问缓存导致的所有问题。
-
我想知道你为什么要遍历整个缓存中的所有项目?
-
@Evk 说我有一些带有键模式的缓存项目:“abc.xyz-{0}”=> 用于单个项目,“abc.xyz”=> 用于所有项目。现在,如果我对项目数据进行更改,例如更改名称...,我想使用正则表达式或其他任何方式删除所有缓存的项目,以确保下一个请求将获得刷新更新的数据。
-
@Evk 好吧,MVC 5 中的内存缓存,你可以这样写。 System.Runtime.Caching.MemoryCache.Default.Select(p=> p.Key) 我知道 .net 核心一开始很简单。
标签: c# asp.net-core memorycache