【发布时间】:2020-10-11 04:24:20
【问题描述】:
我有一个方法可以生成我们的缓存键,它是一个字符串,如下所示:
private static readonly HashSet<string> CacheKeys = new HashSet<string>();
public string Generate(int clientId, int processId)
{
StringBuilder sb = new StringBuilder();
sb.Append("data:").Append("c:").Append(clientId).Append("::");
sb.Append("pi::").Append(processId);
// do I need to store everything in my CacheKeys?
// or this can be improved so that I can fullfill below 3 requirements
// CacheKeys.Add(sb.ToString());
return sb.ToString();
}
然后这个字符串和它们的值一起被缓存在MemoryCache 中(这里没有显示,因为它不相关)。
_memoryCache.Set<T>(cacheKey, value, memoryCacheOptions);
我有一个要求,我需要根据以下要求从内存缓存中删除特定的 key 或 keys -
- 我需要从内存缓存中删除特定的
processId+clientId键。 - 无论
processId是什么,我都需要从内存缓存中删除与特定clientId键匹配的所有键。 - 我还需要从内存缓存中删除与特定
processId键匹配的所有键,无论clientId是什么。
现在在阅读了 SO 和 MemoryCache 教程之后,似乎没有办法遍历所有键(或找到匹配特定正则表达式模式的键)并将其从缓存中删除。
问题陈述
在经历了各种link 之后,看起来我需要将我的缓存键存储在单独的数据结构中,然后使用它来删除它。
- 我应该如何在上述方法中以这种方式存储我的
cacheKey,以便我可以通过迭代此数据结构或任何线程安全数据结构轻松删除上述 3 个要求的关键基础? - 此外,指定要删除哪些键(遵循上述 3 模式)的输入结构来自其他一些服务,并且也没有定义,我非常愿意以任何可以帮助我做到这一点的格式表示高效地完成任务。
基本上,我正在尝试为上述所有三种模式提供一个示例,通过该示例我可以有效地从使用RemoveByPattern 或Remove 方法的MemoryCache 中删除键。到目前为止,我无法弄清楚如何为所有这三个案例准备一个示例或测试案例,这些案例可以使用我的 RemoveByPattern 或 Remove 方法并有效地清除密钥。
public void RemoveByPattern(MemoryCache memoryCache, string pattern)
{
var keysToRemove = CacheKeys
.Where(k => Regex.IsMatch(k, pattern, RegexOptions.IgnoreCase))
.ToArray();
foreach (var ktr in keysToRemove)
Remove(memoryCache, ktr);
}
public void Remove(MemoryCache memoryCache, string key)
{
memoryCache.Remove(key);
CacheKeys.Remove(key);
}
如何以能够理解我的上述三个要求的方式表示我的输入结构,然后轻松地将其提供给RemoveByPattern 或Remove 方法?
【问题讨论】:
标签: c# regex asp.net-core data-structures memorycache