- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 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/
我有一个 CacheService使用 GetOrCreateAsync基于键创建缓存。我正在缓存一个照片实体,它有一个 byte[]属性(property)。 这可以很好地缓存并按预期检索。但是,如
我正在尝试将我的 .Net 框架应用程序迁移到 .Net Core,在此过程中,我想将我的内存缓存从 System.Runtime.Caching/MemoryCache至Microsoft.Exte
我创建了一个全新的 ASP.NET Core Web API 项目。这是 Startup.cs 中的 ConfigureServices: public void ConfigureServi
我对 ASP.Net Core、C#、OOP、Javascript ……基本上是我目前使用的所有内容的新手。过去几个月我一直在阅读和学习以开始一个新的开发项目。总而言之,我正在稳步前进,但我遇到了 I
我正在使用 asp net core 1.0 和 xunit。 我正在尝试为一些使用 IMemoryCache 的代码编写单元测试。但是,每当我尝试在 IMemoryCache 中设置一个值时,我都会
我正在尝试模拟 IMemoryCache最小起订量。我收到此错误: An exception of type 'System.NotSupportedException' occurred in Mo
我目前正在执行以下操作以将列表存储在 IMemoryCache 中: _memoryCache.Set("PriceList", horsepricelist); 并访问它/返回数据: public
我正在创建一个 .net core 3.1 Worker Service 应用程序。我有一个使用 IMemoryCache 接口(interface)进行依赖注入(inject)的类。我有以下类的构造
我正在使用 IMemoryCache缓存从身份服务器检索到的 token 。 过去我用过 GetOrCreateAsync Microsoft.Extensions.Caching.Abstracti
我有一个从 Visual Studio 2015 Community Edition 创建的 ASP.NET Web 应用程序。 .NET Framework 是 4.6.1。 我不知道我的 Web
我一直在使用类似于示例 1 的操作来为我的 .NET Core API 异步缓存 json 结果。 MemoryCache 是 IMemoryCache 的实例。 示例 1(按预期工作): [Http
我正在尝试使用 Microsoft.Extensions.Caching.Memory.IMemoryCache 接口(interface)/类。 我需要向缓存中添加一个新项目,并确保我不会覆盖任何其
我有一个带有 API 的 ASP.NET Core MVC 项目。 然后我在名为 Infrastructure. 的同一个解决方案中有一个类库。 我的 API 在类库基础结构中调用存储库方法,在类 U
我们正在使用 .NET Core 3.1 和 Microsoft.Extensions.Caching.Memory.IMemoryCache (v3.1.24) 及其实现 Microsoft.Ext
.Net Core 为两个接口(interface)( MemoryCache 和 DistributedMemoryCache )提供内存实现,但假设我们有一个可用的 IDistributedCac
我知道 IMemoryCache.Set 是一个扩展方法,所以它不能被模拟。人们已经为这种情况提供了解决方法,例如 NKosi here 的解决方法。 .我想知道如何为我的 MemoryCache 返
我正在寻找一种方法来包装为某些数据调用远程 WCF 服务的服务。例如,这样的服务可能看起来像这样 public interface IAsyncSvc { Task GetData(int k
我正在编写一个简单的测试用例来测试我的 Controller 在调用我的服务之前调用缓存。我正在使用 xUnit 和 Moq 来完成这项任务。 我遇到了一个问题,因为 GetOrCreateAsync
我向 IMemoryCache 添加一个值 _cache.Set("Key", "Value", DateTimeOffset.UtcNow); 我想通过其他方法获取这个key的绝对过期值。 或者 我
我正在使用 IMemoryCache 将数据存储在缓存中...但它会不断向 SQL Server 发送 sql 调用,即使在缓存存在的情况下执行不会运行该代码。 我的查找服务 public class
我是一名优秀的程序员,十分优秀!