Tag: caching

AppFabric缓存 – 对象的序列化和反序列化要求是什么?

问题:当缓存一个类的实例并立即将其从缓存中取回时,我得到了对象(它不是null),但它的所有属性/字段都是null或默认值。 _cacheHelper.PutInCache(“testModuleControlInfoOne”, mci); //mci has populated fields var mciFromCacheOne = _cacheHelper.GetFromCache(“testModuleControlInfoOne”); //mciFromCacheOne now has null or default fields 所以我怀疑对象的结构方式是问题,AppFabric没有因某种原因正确地序列化对象。 但是,当我使用下面的序列化方法时,我得到的对象包含序列化之前的所有属性/字段。 public T SerializeThenDeserialize(T o) where T : class { BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream()) { bf.Serialize(ms, o); ms.Position = 0; return (T)bf.Deserialize(ms); } } 如何使用二进制格式化程序正确地序列化和反序列化,而不是通过缓存完全相同的事情? 有没有人遇到这个或有没有人有任何建议或提示一般要注意什么?

如何在ASP.NET WebApi2中管理缓存?

我已经使用WebAPI2实现了REST服务,该服务实现为管理由访问服务的不同客户端创建和加入的不同会话。 会话包含有关访问应用程序function的信息以及已加入同一会话的参与者的信息。 每个客户端从服务器获取会话信息和访问列表,以便每秒进行同步。 根据访问权限的更改,客户端function将更改(启用/禁用)。 我正在使用MemoryCache类在WebAPI服务中存储会话信息,如下所示。 public static class SessionManager{ private static object objForLock = new object(); public static List SessionCollection { get { lock (objForLock) { MemoryCache memoryCache = MemoryCache.Default; return memoryCache.Get(“SessionCollection”) as List; // return HttpContext.Current.Application[“SessionCollection”] as List; } } set { lock (objForLock) { MemoryCache memoryCache = MemoryCache.Default; memoryCache.Add(“SessionCollection”, value, DateTimeOffset.UtcNow.AddHours(5)); //HttpContext.Current.Application[“SessionCollection”] = […]

Power shell:Import-Module

我一直试图在win2008标准服务器上使用app fabric缓存。 当我执行follwowing命令时,我得到:Import-Module DistributedCacheAdministration Import-Module:未加载指定的模块“DistributedCacheAdministration”,因为在任何模块目录中找不到有效的模块文件。 该目录位于何处,如何使用该模块 此外,似乎我有PowerShell 1.我似乎无法安装PowerShell 2

异步/等待和缓存

我的服务层正在缓存很多对memcached的Db请求,这是否使得无法使用Async / Await? 例如,我怎么能等待这个? public virtual Store GetStoreByUsername(string username) { return _cacheManager.Get(string.Format(“Cache_Key_{0}”, username), () => { return _storeRepository.GetSingle(x => x.UserName == username); }); } 注意:如果密钥存在于缓存中,它将返回“Store”(而不是Task ),如果缓存中不存在该密钥,则它将执行lambda。 如果我将Func更改为 return await _storeRepository.GetSingleAsync(x => x.UserName == username); 并且方法签名为 public virtual async Task GetStoreByUsername(string username) 由于缓存返回类型,这显然不起作用。

在C#中缓存FileInfo属性

从FileInfo.Name属性的MSDN文档中,我看到该属性的数据在第一次被调用时被缓存,并且随后将仅使用Refresh方法进行更新。 我有以下问题,我在文档中找不到或不太清楚: 是否同时缓存了所有属性的数据? 是在创建FileInfo时调用Refresh方法,还是仅在第一次调用属性时调用? 如果我调用了一个属性,例如Name属性,并且它被称为Refresh ,则会首次调用另一个属性(例如DirectoryName属性)使其再次调用Refresh ,或者仅由访问的第一个属性调用它在整个class级(见问题#1 )? 我可以通过手动调用Refresh预缓存所有属性吗? (假设它没有在构造对象时预先缓存) 是否手动调用Refresh会导致预先缓存的属性(例如CreationTime )也被刷新?

C#架构建议:在结构中缓存数据的方法?

我想就C#中可行的架构问你的专家建议。 我有一个C#服务,它响应LAN上本地用户的请求,从互联网上获取数据包,并收集数据以生成结构中的数据数组。 每个数据请求大约需要2秒,并返回4000个字节。 每天可能会有成千上万的请求。 为了加快速度并减少带宽,我需要缓存数据处理的结果,以便第二次和后续访问立即提供给LAN上的任何其他用户(可能有> 50个用户)。 约束: 基础数据永远不会改变,即我不必担心“脏”数据(太棒了!)。 我想要缓存的数据是一个相当复杂的结构,包含DateTime,double等嵌套数组。数据来自互联网提供的数据,使用大量数学。 无论缓存多少数据(即缓存必须限制大小),我都不能使用超过100MB的内存。 我无法通过数字索引索引缓存中的数据,我必须使用日期(“YYYY-MM-DD”)和唯一ID字符串(“XXXXXXXX”)的组合对其进行索引。 它必须很快,即它必须从RAM中提供大部分响应。 缓存中的数据必须每24小时持久保存到磁盘。 以下是我的选择: 使用私有变量(即私有列表或字典)缓存服务器类中的数据,然后偶尔将其序列化为磁盘; 使用数据库; 我对你的专家意见感兴趣。

GMap .net离线

我在c#(伟大的API,顺便说一句)中使用Gmap开发应用程序,不要与google-map API混淆,从那以后我做了一些非常酷且有用的东西。 我的问题是我的一些客户没有互联网连接,这就是为什么我需要能够离线显示背景(地图)。 我以前使用属性GMap.NET.AccessMode.ServerAndCache; 从服务器获取我的数据,现在我希望能够使用带有完整缓存的GMap.NET.AccessMode.CacheOnly 。 让他们加载带有连接的缓存以准备离线使用不是一种选择,PC永远不会连接到互联网。 经过一番研究,我了解到OpenStreetMap是唯一允许我免费使用地图的开源地图(这很好,因为它们有非常好的地图)。 我下载了20GB的欧洲地图,但我不知道如何将其指定为缓存(我知道如何找到缓存文件夹)。 大多数时候,我的谷歌搜索向我展示了人们试图创建一个虚拟sqlite服务器,其中包含通过localhost访问的数据库中的所有地图块,但老实说,我认为这非常复杂,我想知道是否有人有想法允许我离线使用这些地图或者这个api的文档链接,不可能在网上找到(我找到了消息来源,但几乎没有评论也没有解释)。 提前谢谢,抱歉我的英语不好。 réponsesenfrançaisbundvenues。

.NET 4 ObjectCache – 我们可以陷入“缓存过期”事件吗?

我有一个像这样缓存的简单对象: _myCache.Add(someKey, someObj, policy); 其中_myCache被声明为ObjectCache (但通过DI注入为MemoryCache.Default ), someObj是我正在添加的对象,而policy是CacheItemPolicy 。 如果我有这样的CacheItemPolicy : var policy = new CacheItemPolicy { Priority = CacheItemPriority.Default, SlidingExpiration = TimeSpan.FromHours(1) }; 这意味着它将在1小时后到期。 凉。 但是会发生的事情是,一小时后不幸的第一个用户将不得不等待命中。 有什么方法可以挂钩到“过期”事件/委托并手动刷新缓存? 我看到有一个提到CacheEntryChangeMonitor但是在我的例子中找不到任何关于如何利用它的有意义的doco /例子。 PS。 我知道我可以使用CacheItemPriority.NotRemovable并手动过期,但我不能在我当前的例子中这样做,因为缓存的数据有点太复杂(例如,我需要在我的代码中的10个不同位置“无效” )。 有任何想法吗?

ConcurrentDictionary替代可移植类库

我正在编写一个面向.NET 4.5,Windowsapp store应用程序和Windows Phone 8的可移植类库。我需要一个高效的内存缓存机制,因此我考虑使用ConcurrentDictionary ,但它不可用于WP8。 会有很多读取和相对较少的写入,所以理想情况下我想要一个支持来自多个线程的无锁读取的集合,并由单个线程写入。 根据MSDN ,非通用Hashtable具有该属性,但不幸的是它在PCL中不可用… PCL中是否有另一个符合此要求的集合类? 如果没有,那么在不锁定读取的情况下实现线程安全的好方法是什么? (锁定写入是可以的,因为它不会经常发生) 编辑:感谢JaredPar的指导,我最终使用来自Microsoft.Bcl.Immutable的 ImmutableDictionary以完全无锁的方式实现了我的缓存: class Cache { private IImmutableDictionary _cache = ImmutableDictionary.Create(); public TValue GetOrAdd(TKey key, [NotNull] Func valueFactory) { valueFactory.CheckArgumentNull(“valueFactory”); TValue newValue = default(TValue); bool newValueCreated = false; while (true) { var oldCache = _cache; TValue value; if (oldCache.TryGetValue(key, out value)) return value; // […]

何时缓存任务?

我正在观看异步的禅:最佳性能的最佳实践和Stephen Toub开始谈论任务缓存,而不是缓存任务作业的结果,你自己缓存任务。 据我所知,为每项工作开始一项新任务是昂贵的,应尽量减少。 在28:00左右,他展示了这种方法: private static ConcurrentDictionary s_urlToContents; public static async Task GetContentsAsync(string url) { string contents; if(!s_urlToContents.TryGetValue(url, out contents)) { var response = new HttpClient().GetAsync(url); contents = response.EnsureSuccessStatusCode().Content.ReadAsString(); s_urlToContents.TryAdd(url, contents); } return contents; } 首先看起来像是一个很好的思考方法,你缓存结果,我没有考虑缓存获取内容的工作。 而且他展示了这种方法: private static ConcurrentDictionary<string, Task> s_urlToContents; public static Task GetContentsAsync(string url) { Task contents; if(!s_urlToContents.TryGetValue(url, out contents)) { contents […]