我正在使用System.Runtime.Caching.MemoryCache来模拟在AppHarbor上部署的正在运行的.NET MVC应用程序上的重复任务.
在高速缓存条目被使用含有一个AbsoluteExpiration偏移CacheItemPolicy和调用的方法和重新触发的项目的增加在高速缓存中(如所描述的一个RemovedCallback加入此处)
MemoryCache首次在Application_Start中填充.它在本地工作正常,但在AppHarbor上部署后似乎无法工作(也尝试使用HttpRuntime.Cache,结果相同).
我的应用程序在AppHarbor上的CANOE(免费)帐户下运行,该帐户只有一个工作人员.这是否意味着在升级到付费计划之前我无法模拟后台任务?
谢谢!
我在我的Application_Start中有这个:
var crumbsCache = new MemoryCache("breadCrumbsNames");
var crumbsList = new List<CacheItem>
{
//list of new CacheItem();
};
foreach (var cacheItem in crumbsList)
{
crumbsCache.Add(cacheItem, new CacheItemPolicy());
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的控制器中,我这样做:
var cache = new MemoryCache("breadCrumbsNames");
var cacheItem = cache.GetCacheItem("nameOfCacheItem");
Run Code Online (Sandbox Code Playgroud)
但是然后cacheItem总是为null,我做错了什么?
我正在寻找我的web api中的缓存,我可以使用一个api方法的输出(在12小时内更改一次)进行后续调用,然后我在SO上找到了这个解决方案,但是我很难理解并使用下面的代码
private IEnumerable<TEntity> GetFromCache<TEntity>(string key, Func<IEnumerable<TEntity>> valueFactory) where TEntity : class
{
ObjectCache cache = MemoryCache.Default;
var newValue = new Lazy<IEnumerable<TEntity>>(valueFactory);
CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30) };
//The line below returns existing item or adds the new value if it doesn't exist
var value = cache.AddOrGetExisting(key, newValue, policy) as Lazy<IEnumerable<TEntity>>;
return (value ?? newValue).Value; // Lazy<T> handles the locking itself
}
Run Code Online (Sandbox Code Playgroud)
我不确定如何在下面的上下文中调用和使用此方法? 我有一个方法Get
public IEnumerable<Employee> Get()
{
return repository.GetEmployees().OrderBy(c => c.EmpId); …Run Code Online (Sandbox Code Playgroud) 我想只在内存中加载和缓存图像,而不是将它们传递给视图,稍后当我需要将它们加载到UI上时,如果它们存在于内存中,则从内存缓存中获取它们.
我试过了:
Glide.with().load(uri).into(new SimpleTarget<GlideDrawable>(WIDTH,HEIGHT)
{
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
//left empty
}
}
);
Run Code Online (Sandbox Code Playgroud)
但是当我稍后调用在ImageView中加载uri时,它仍然会从路径加载它而不是内存.
是否有另一种方法可以将图像缓存在内存中而无需在UI上加载它们?
TL; DR我正在寻找一种方式来获得IEqualityComparer<T>的IComparer<T>,无论哪个数据类型是T,包括在不区分大小写的选项T是string.或者我需要针对此问题的不同解决方案.
以下是完整的故事:我正在使用LFU策略实现简单的通用缓存.要求是必须能够选择缓存是区分大小写还是不区分大小写 - 如果string恰好是缓存键的数据类型(这不是必需的).在解决方案中,我主要开发缓存,我期望数百亿的缓存查找,以及最多100,000个条目的缓存大小.由于这些数字,我立即停止使用导致分配的任何字符串操作(例如.ToLower().GetHashCode()等),而是选择使用IComparer和IEqualityComparer,因为它们是标准的BCL功能.此缓存的用户可以将比较器传递给构造函数.以下是代码的相关片段:
public class LFUCache<TKey,TValue>
{
private readonly Dictionary<TKey,CacheItem> entries;
private readonly SortedSet<CacheItem> lfuList;
private class CacheItem
{
public TKey Key;
public TValue Value;
public int UseCount;
}
private class CacheItemComparer : IComparer<CacheItem>
{
private readonly IComparer<TKey> cacheKeyComparer;
public CacheItemComparer(IComparer<TKey> cacheKeyComparer)
{
this.cacheKeyComparer = cacheKeyComparer;
if (cacheKeyComparer == null)
this.cacheKeyComparer = Comparer<TKey>.Default;
}
public int Compare(CacheItem x, CacheItem y) …Run Code Online (Sandbox Code Playgroud) 我想检索使用MemoryCache添加的所有缓存对象.
我尝试了以下但它没有检索它们
System.Web.HttpContext.Current.Cache.GetEnumerator(); System.Web.HttpRuntime.Cache.GetEnumerator();
注意:Retreive all不仅仅意味着我所知道和创建的,我的意思是在应用程序中创建的每个缓存对象.
System.Runtime.Caching.MemoryCache是.NET Framework(版本4+)中的一个类,它使用字符串作为键来缓存内存中的对象.除了System.Collections.Generic.Dictionary <string,object>之外,这个类还有各种各样的铃声和口哨声,可以让你配置缓存增长到多少(绝对或相对术语),设置不同的过期策略不同的缓存项目,以及更多.
我的问题与记忆限制有关.MSDN上的所有文档似乎都没有令人满意地解释这一点,并且Reference Source上的代码相当不透明.很抱歉将所有这些都写成一个"问题",但我无法弄清楚如何将一些问题纳入他们自己的问题,因为他们只是对一个整体问题的不同观点:"你如何调和惯用的C# /.NET有一个通常有用的内存缓存的概念,它有可配置的内存限制几乎完全在托管代码中实现?"
Player. Player有一些特定于玩家的状态被封装在一个public PlayerStateData PlayerState { get; }属性中,该属性封装了玩家正在看的方向,他们持有的链轮数等等,以及对整个游戏状态的引用public GameStateData GameState { get; },可以用来回到游戏(更大)状态来自只知道玩家的方法.PlayerState以及GameState何时考虑缓存贡献的大小?GameState仅仅因为5个玩家被缓存而将大小的贡献大小乘以5 是愚蠢的......但是再一次,一个可能的实现可能就是这样,并且很难计算PlayerState而不计算GameState.我自己的研究使我SRef.cs,我放弃了在试图让后了解这里,后来导致这里.猜测所有这些问题的答案将围绕寻找和冥想最终填充存储在该句柄中的INT64的代码.
是否可以读取MemoryCache中项目的到期时间?
System.Runtime.Caching.MemoryCache在我从数据库重新加载之前,我使用.NET 将配置信息存储30分钟.作为状态页面的一部分,我想显示特定缓存项目的年龄或它何时到期.
object config = LoadSomeStuffFromDatabase();
CacheItemPolicy cachePolicy = new CacheItemPolicy() { AbsoluteExpiration = DateTime.Now.AddMinutes(30) };
Cache.Add("MyConfigKey", config, cachePolicy);
// And now I want to do something like this :-)
DateTime dt = Cache.SomeMagicMethod("MyConfigKey");
Run Code Online (Sandbox Code Playgroud)
今天我正在使用每次重新加载配置时更新的变量.但是从缓存本身读取这些信息会更好.
AuthenticationRequiredAttribute类
public class AuthenticationRequiredAttribute : ActionFilterAttribute
{
ILoginTokenKeyApi _loginTokenKeyApi;
IMemoryCache _memoryCache;
public AuthenticationRequiredAttribute(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
_loginTokenKeyApi = new LoginTokenKeyController(new UnitOfWork());
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var memory = _memoryCache.Get(Constants.KEYNAME_FOR_AUTHENTICATED_PAGES);
string requestedPath = filterContext.HttpContext.Request.Path;
string tokenKey = filterContext.HttpContext.Session.GetString("TokenKey")?.ToString();
bool? isLoggedIn = _loginTokenKeyApi.IsLoggedInByTokenKey(tokenKey).Data;
if (isLoggedIn == null ||
!((bool)isLoggedIn) ||
!Constants.AUTHENTICATED_PAGES_FOR_NORMAL_USERS.Contains(requestedPath))
{
filterContext.Result = new JsonResult(new { HttpStatusCode.Unauthorized });
}
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
Run Code Online (Sandbox Code Playgroud)
HomeController的
public class HomeController : Controller
{
IUserApi …Run Code Online (Sandbox Code Playgroud) 我们需要使用 MemoryCache 缓存两种类型的数据。
我们不想在安全令牌缓存上设置 SizeLimit,因为这意味着缓存中的每个条目都需要根据.NET Core doco指定大小。这是因为安全令牌是由我们无法控制的已编译 nuget 类型插入的。
因此,创建另一个 MemoryCache 实例来仅保存 Book 项目是有意义的,这样我们就可以在向缓存添加书籍时设置项目的大小限制和大小。
此外,.NET Core 文档建议开发人员需要管理缓存的限制。
我在这里和这里读过相互冲突的帖子,它们支持/拒绝多个内存缓存实例。此外,这些与 .NET 有关,与 .NET Core 无关。
由于 .NET Core 的 MemoryCache 需要开发人员管理缓存项的逐出,并且考虑到缓存中的书籍比令牌多得多,因此我们倾向于拥有 2 个 MemoryCache 实例。
在 .NET Core Web 应用程序中使用多个 MemoryCache 实例是否可能会遇到任何问题?
我们使用.NET Core 2.1和Microsoft.Extensions.Caching.Memory v=2.1.2.0
memorycache ×10
c# ×8
caching ×4
.net ×3
asp.net ×3
asp.net-mvc ×3
.net-core ×1
android ×1
appharbor ×1
asp.net-core ×1
icomparer ×1