遗憾的是,MemoryCache.Set的MSDN文档没有明确说明它是否是线程安全的.
是否可以安全地使用.Get()并且.Set()没有显式锁定的几个线程?
缓存由缓存硬件透明地控制到处理器,因此如果我们在C程序中使用volatile变量,我的程序如何保证每次从指定的实际内存地址而不是缓存中读取数据.
我的理解是,
Volatile关键字告诉编译器不应优化变量引用,并应按代码中的编程读取.
缓存由缓存硬件透明地控制,因此当处理器发出地址时,它不知道数据是来自缓存还是来自内存.
因此,如果我需要每次都需要读取一个内存地址,我怎样才能确保它不是从缓存引用而是从所需的地址引用?
有些怎么样,这两个概念并不合适.请说明它是如何完成的.
(想象一下我们在缓存中有回写策略(如果需要分析问题))
谢谢你,Microkernel :)
c computer-science volatile computer-architecture memorycache
.NET 4.0 MemoryCache性能计数器在哪里?
我正在寻找他们的名字,我找不到任何名字.
谢谢,
MemoryCache.AddOrGetExisting的行为描述为:
使用指定的键以及值和绝对到期值将高速缓存条目添加到高速缓存中.
它返回:
如果存在具有相同密钥的高速缓存条目,则存在现有高速缓存条目; 否则,null.
具有这些语义的方法的目的是什么?这是什么一个例子?
我需要添加缓存功能,并找到一个名为MemoryCache的新闪亮类.但是,我发现MemoryCache有点瘫痪(我需要区域功能).除了其他东西,我需要添加像ClearAll(区域)这样的东西.作者努力保持这个类没有区域支持,代码如下:
if (regionName != null)
{
throw new NotSupportedException(R.RegionName_not_supported);
}
Run Code Online (Sandbox Code Playgroud)
几乎每种方法都有.我没有看到一种简单的方法来覆盖这种行为.我能想到的添加区域支持的唯一方法是添加一个新类作为MemoryCache的包装,而不是作为一个继承自MemoryCache的类.然后在这个新类中创建一个Dictionary并让每个方法"缓冲"区域调用.听起来很讨厌和错误,但最终......
你知道更好的方法来添加区域到MemoryCache吗?
在控制器类中,我有
using Microsoft.Extensions.Caching.Memory;
private IMemoryCache _cache;
private readonly MemoryCacheEntryOptions CacheEntryOptions = new MemoryCacheEntryOptions()
.SetSize(1)
// Keep in cache for this time
.SetAbsoluteExpiration(TimeSpan.FromSeconds(CacheExpiryInSeconds));
Run Code Online (Sandbox Code Playgroud)
在 Startup.cs 中,我有
public class MyMemoryCache
{
public MemoryCache Cache { get; set; }
public MyMemoryCache()
{
Cache = new MemoryCache(new MemoryCacheOptions
{
SizeLimit = 1024,
});
}
}
Run Code Online (Sandbox Code Playgroud)
这些不同的尺寸设置是什么意思?
这是 .NET Core 2.1。
我正在使用新的.NET 4.0 Caching命名空间:System.Runtime.Caching.
现在,我只是做一些原型/摆弄新的API,以便找出真正的应用程序的最佳选择.
与此一致,我正在尝试创建一个页面(ASP.NET MVC),它基本上会转储缓存中的所有内容,尤其是以下信息:
但是,除了键/对象之外,我似乎无法获得任何东西.
这是我正在玩的代码:
public ActionResult Index()
{
var cache = MemoryCache.Default;
// i can get the list of cache keys like this:
var cacheKeys = cache.Select(kvp => kvp.Key).ToList();
// i can also get a strongly-typed "CacheItem" like this:
CacheItem item = cache.GetCacheItem("someKey");
}
Run Code Online (Sandbox Code Playgroud)
我希望"CacheItem"类会暴露我需要的信息(到期,依赖等 - 至少作为"getters").
但事实并非如此.它拥有的只是键,值和区域名称的属性.
我如何检查缓存中的项目并吐出我需要的信息?
我缺少名称空间/类吗?
编辑
看起来有一个ChangeMonitor类,但是再次 - 这不会给出过期信息,它只允许您在删除缓存项时订阅事件.
有必须是一个办法只有抢在缓存中的项目,而当他们到期.
编辑2
不知道这是否应该是一个单独的问题,而且 - 我对我应该给我的ObjectCache的生命周期感到困惑.MSDN说它不是单例,你实际上可以创建多个ObjectCache实例.这意味着什么,我必须在访问ObjectCache实例时使用完全锁定的单例?
我正在尝试MemoryCache使用.Net 4中的新功能来缓存我们的一个应用程序中的一些数据.我遇到的麻烦是对象被更新,缓存似乎是持久的变化,例如
public IEnumerable<SomeObject> GetFromDatabase(){
const string _cacheKeyGetDisplayTree = "SomeKey";
ObjectCache _cache = MemoryCache.Default;
var objectInCache = _cache.Get(_cacheKeyGetDisplayTree) as IEnumerable<SomeObject>;
if (objectInCache != null)
return objectInCache.ToList();
// Do something to get the items
_cache.Add(_cacheKeyGetDisplayTree, categories, new DateTimeOffset(DateTime.UtcNow.AddHours(1)));
return categories.ToList();
}
public IEnumerable<SomeObject> GetWithIndentation(){
var categories = GetFromDatabase();
foreach (var c in categories)
{
c.Name = "-" + c.Name;
}
return categories;
}
Run Code Online (Sandbox Code Playgroud)
如果我GetWithIndentation()先调用然后再调用GetFromDatabase()我希望它返回原始列表,SomeObject但它会返回修改后的项目(名称上带有" - "前缀).
我以为ToList()破坏了参考,但似乎仍然存在变化.我敢肯定这很明显,但是有人能发现我哪里出错吗?
我正在从.NET 4.6到.NET Core移植一些代码,并且遇到了MemoryCache的一些问题.4.6代码使用MemoryCache.Default来实例化缓存,但这似乎在.NET Core中不可用.在.NET Core中是否有相同的内容,或者我是否应该将我自己的MemoryCache作为单例创建并通过IOC注入它?
我有一个java Web服务器,目前正在使用Guava库来处理我的内存缓存,我大量使用它.我现在需要扩展到多个服务器(2+)以进行故障转移和负载平衡.在此过程中,我从进程内缓存切换到Memcache(外部服务).但是,我对结果并不十分印象深刻,就像现在几乎所有的调用一样,我必须对另一台服务器进行外部调用,这比内存缓存慢得多.
我在考虑不是从Memcache获取数据,而是可以继续在每台服务器上使用本地缓存,并在需要更新缓存时使用RabbitMQ通知其他服务器.因此,如果一台服务器对底层数据进行了更改,它还会向所有其他服务器广播一条消息,告诉它们它们的缓存现在无效.每个服务器都广播和监听缓存失效消息.
有谁知道这种方法的任何潜在缺陷?我有点紧张,因为我找不到其他人在生产中这样做.我看到的唯一问题是每个服务器需要更多内存(内存缓存),并且任何给定服务器可能需要更长时间才能获得更新数据.还要别的吗?