gpt4 book ai didi

c# - IMemoryCache 保证唯一的新 key .NET-Core

转载 作者:太空狗 更新时间:2023-10-29 23:20:34 26 4
gpt4 key购买 nike

我正在尝试使用 Microsoft.Extensions.Caching.Memory.IMemoryCache 接口(interface)/类。

我需要向缓存中添加一个新项目,并确保我不会覆盖任何其他已保存的内容。目前,所有 key 都是自动生成和随机化的(不是顺序的)。

如何针对我当前的缓存项测试随 secret 钥的唯一性?

或者,我怎样才能获得一个有保证的唯一 key ?获得一个自动生成的 key 可以用于以后的检索。

https://learn.microsoft.com/en-us/aspnet/core/performance/caching/memory有几个例子,但是对我生成的每个键使用 .TryGetValue(object key, object out value) 来测试唯一性似乎有点矫枉过正,在考虑多线程环境时,这可能是一个问题。

博客https://wildermuth.com/2016/04/14/Using-Cache-in-ASP-NET-Core-1-0-RC1对有意的键使用相同的 TryGetValue(key, out value) 模式。

我希望不必将生成的 key 列表保存在其他地方,即另一个列表分隔列表,因为这会让我回到列表变旧时修剪列表的问题。

另外,在这种特定情况下,我将 key 作为 url-querystring 参数传递,因此与 url 兼容的字符串将是 super 的。提前致谢。

最佳答案

正如您已经发现的那样,使用 GUID 作为缓存键并不是一个好的解决方案。主要问题是在生成 GUID 之后,没有办法可靠地将其重新生成为相同的 key ,以便从缓存中获取数据。


通常,当我创建缓存时,键基于被缓存的实体或缓存它的方法。但也可以根据使值唯一的值组合来创建缓存。

使用实体的例子

public class Employee
{
int Id { get; set; }
string Name { get; set; }
}

要从实体获取键,除了实体的主键外,我们只需使用常量值。

private const string KEY_PREFIX = "Employee_";
private object syncLock = new object();

// innerEmployeeRetriever and cache are populated through the constructor
public Employee GetEmployee(int id)
{
string key = KEY_PREFIX + id.ToString();

// Get the employee from the cache
var employee = cache[key];
if (employee == null)
{
lock (syncLock)
{
// Double-check that another thread didn't beat us
// to populating the cache
var employee = cache[key];
if (employee == null)
{
employee = innerEmployeeRetriever.GetEmployee(id);
cache[key] = employee;
}
}
}
return employee;
}

使用方法名的例子

private object syncLock = new object();

// innerEmployeeRetriever and cache are populated through the constructor
public Employee GetEmployeeList()
{
string key = "GetEmployeeList";

// Get the employee from the cache
var employees = cache[key];
if (employees == null)
{
lock (syncLock)
{
// Double-check that another thread didn't beat us
// to populating the cache
var employees = cache[key];
if (employees == null)
{
employees = innerEmployeeRetriever.GetEmployeeList();
cache[key] = employees;
}
}
}
return employees;
}

使用值组合的示例

您还可以从几个不同的值构建键,这些值组合在一起使实体独一无二。如果您没有要使用的主键,或者您有几个不同的上下文要单独缓存,这将很有帮助。此示例取自 MvcSiteMapProvider :

protected string GetCacheKey(string memberName)
{
// NOTE: We must include IsReadOnly in the request cache key
// because we may have a different
// result when the sitemap is being constructed than when
// it is being read by the presentation layer.
return "__MVCSITEMAPNODE_" + this.SiteMap.CacheKey + "_" + this.Key
+ "_" + memberName + "_" + this.IsReadOnly.ToString() + "_";
}

在这种情况下,我们根据节点所属的父 SiteMap 的唯一键、节点的唯一键、方法或属性名称以及当前是否设置了只读标志来构建键。这些值的每个唯一集合都会产生一个单独的缓存键,从而为每个组合创建一个单独的缓存。

当然,要使其正常工作,值之间应该有某种“安全”定界符,以防止通过连接不同的值来创建相同的键。例如,"1"+ "23""12"+ "3" 是相同的字符串,但您可以通过使用下划线来防止此类冲突,管道字符、逗号或其他一些不会出现在数据本身中的分隔符来分隔值(“1”+“_”+“23”不是"12"+ "_"+ "3") 相同的字符串。


底线是缓存键必须以某种方式代表缓存中的内容,以便它有用。您的应用程序应该了解如何提供构成 key 的数据,以便在需要再次检索相同数据时可以重新制作。

关于c# - IMemoryCache 保证唯一的新 key .NET-Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42463344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com