IMemoryCache 保证唯一的新密钥 .NET-Core

2024-04-18

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

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

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

或者,如何获得有保证的唯一密钥?获得一个可用于以后检索的自动生成的密钥就可以了。

https://learn.microsoft.com/en-us/aspnet/core/performance/caching/memory https://learn.microsoft.com/en-us/aspnet/core/performance/caching/memory有一些例子,但使用.TryGetValue(对象键,对象输出值)对于我生成的用于测试唯一性的每个密钥似乎有点矫枉过正,并且在考虑多线程环境时这可能是一个问题。

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

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

作为额外的,在这种特定情况下,我将密钥作为 url-querystring 参数传递,因此 url 兼容的字符串将是超级的。提前致谢。


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


通常,当我创建缓存时,键基于被缓存的实体或缓存它的方法。但也可以基于值的组合来制作缓存,这些值一起使值变得唯一。

使用实体的示例

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 https://github.com/maartenba/MvcSiteMapProvider/blob/master/src/MvcSiteMapProvider/MvcSiteMapProvider/RequestCacheableSiteMapNode.cs#L226-231:

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" is not与相同的字符串"12" + "_" + "3").


最重要的是,缓存键必须以某种方式表示what位于缓存中才能发挥作用。您的应用程序应该了解如何提供构成密钥的数据,以便在需要再次检索相同数据时可以重新创建密钥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IMemoryCache 保证唯一的新密钥 .NET-Core 的相关文章

  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 编辑用户个人资料详细信息

    如何创建用于编辑用户自定义信息的操作和视图 授权基于 VS 通过 MVC 4 项目创建的成员资格 我添加了其他列 例如 FirstName 等 我需要并且注册工作正常 但我不知道如何让此属性显示在视图中 Html EditorFor并将更改
  • std::bind 重载解析

    下面的代码工作正常 include
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况

随机推荐

  • Android - setRequestedOrientation - 活动和视图生命周期

    我在使用 JNI 的本机代码方面遇到了一些问题 我怀疑这可能是由于调用setRequestedOrientation 当我打电话时活动会发生什么setRequestedOrientation 是刚刚重新启动还是完全被破坏了 另外 视图会发生
  • 如何即时命名变量?

    是否可以动态创建新的变量名称 我想将列表中的数据帧读取到末尾带有数字的新变量中 比如 orca1 orca2 orca3 如果我尝试类似的事情 paste orca i sep list name i 我收到这个错误 target of a
  • NSLocale currentLocale 始终返回“en_US”而不是用户当前的语言

    我正在国际化 iPhone 应用程序 我需要根据用户当前的区域设置对某些视图进行编程更改 我快要疯了 因为无论 iPhone 模拟器或实际硬件上的语言偏好是什么 locale始终评估为 en US NSString locale NSLoc
  • Unity fps 旋转相机

    在我的游戏中 我有一个摄像头 我希望将 FPS 之类的旋转附加到该摄像头上 因此 如果我将光标向左移动 我希望凸轮向左旋转 如果我向上移动光标 那么凸轮应该向上看 等等 我目前已经部分工作 我可以左看 右看 上看 下看 当我向下看然后左右移
  • 从Python中的当前日期获取7天前的日期[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图在 python 中获取从当前日期开始 7 天前的日期 谁能帮我 import datetime as DT today DT da
  • 如何处理在 JQuery 中返回字符串的 JSON 请求?

    json jQuery 新手 如果这有一个明显的答案 我很抱歉 我正在 jQuery 中执行 ajax 请求 如下所示 ajax url theURL dataType jsonp type get success function dat
  • ServiceRoute + WebServiceHostFactory 杀死 WSDL 生成?如何使用 ?wsdl 创建无扩展的 WCF 服务

    我正在尝试使用无扩展名 无 svc WCF 服务 其他人可以确认或否认我遇到的问题吗 我在代码中使用路由 并在 global asax cs 的 Application Start 中执行此操作 RouteTable Routes Add
  • 将用户从 SP 中注销,但不从 IDP 中注销

    是否可以将用户从使用 SAML 身份验证的应用程序中注销 但让他们保持登录 IDP 的状态 以便他们可以继续访问其他服务提供商 我希望能够将用户从应用程序中注销 并让他们在返回应用程序时进行身份验证 而无需将其从 IDP 中注销 即我不想使
  • 放弃支持库 v7。我做错了什么?

    我需要为 2 3 及更高版本的设备添加操作栏 我最近知道了 appcompat v7 支持库 它正是这样做的 我已经按照支持库设置指南 http developer android com tools support library set
  • Debian 在没有桌面的情况下启动 Qt GUI 应用程序

    我在 SBC 上运行 Debian 2 6 我计划在嵌入式设置中使用它 我需要做的是配置它 以便 linux 启动并运行我的 Qt GUI 应用程序 我是否需要窗口管理器来执行此操作 或者我可以使用 X11 来执行此操作吗 另外 因为它将用
  • Vuetify v-select 组件宽度改变

    My v select组件应该有固定的宽度 60px 它们适合表格单元格 我想防止它们在选择值后更改宽度 它们会更改宽度 并且下拉箭头在选择后会向右移动 因此如果有办法减小图标或其填充 边距的大小 可能会有所帮助 真的不知道如何获取这个箭头
  • AVAudioSinkNode 具有非默认但仍然是设备本机采样率

    我已经配置了AVAudioSinkNode附于AVAudioEngine s inputNode像这样 let sinkNode AVAudioSinkNode timestamp frames audioBufferList gt OSS
  • Matplotlib 补丁有漏洞

    以下代码有效 问题是我不知道它为什么有效 该代码绘制一个圆形面片 使用 PathPatch 并从中心切出一个三角形 我的猜测是 内三角形被切掉 因为它是顺时针绘制的 而外圆是逆时针绘制的 如果方向不反转 三角形就不会被剪切 我在文档中没有找
  • 更改所有 Woocommerce 电子邮件通知中的“回复”电子邮件地址

    在 Woocommerce 中 我想更改应始终用作的电子邮件地址回复地址对于所有电子邮件通知 Woocommerce 如何做到这一点 以下操作将更改所有电子邮件通知中的 回复 电子邮件地址 和姓名 add filter woocommerc
  • kendo-numerictextbox' 不是已知元素

    我在尝试在 Angular 7 应用程序中实现 kendo numerictextbox 时遇到错误 我目前正在使用 kendo dropdownlist 和文本框控件 没有任何问题 我不确定缺少哪个包 我是否缺少一些依赖
  • 如何获取接受的入站套接字的 IP 地址?

    我的问题是 服务器将创建一个套接字 绑定到给定端口并使用地址 INADDR ANY 监听 和接受 新连接 然后 我们可以获取客户端的ip地址 来自接受 现在 我想知道服务器的IP地址 因为服务器的主机有 上面有多个网卡 如何知道接受的入站套
  • 使用 mongoose 和 Fixie(Heroku 附加组件)连接到 mongodb

    我有一个托管在 Atlas MongoDB Cloud 集群上的 mongodb 数据库 我目前正在使用 mongoose 访问 Node js 应用程序中的数据库 mongoose connect mongodb user pw clus
  • R:格式化xtable中的数字

    我有数据 transaction lt c 1 2 3 date lt c 2010 01 31 2010 02 28 2010 03 31 type lt c debit debit credit amount lt c 500 1000
  • QML 不显示 svg 图像

    我编写了一个简单的 QML ui 它使用一些 svg 图像 当我在桌面上执行该应用程序时 一切都很好 显示了 UI 以及上面的 svg 图像 当我尝试在嵌入式设备 运行嵌入式 Windows 上执行应用程序时 会出现问题 在这种情况下 会显
  • IMemoryCache 保证唯一的新密钥 .NET-Core

    我正在尝试使用Microsoft Extensions Caching Memory IMemoryCache接口 类 我需要向缓存添加一个新项目 并确保不会覆盖已保存的任何其他内容 目前 所有密钥都是自动生成和随机的 不是顺序的 如何针对