有没有办法可以使用LINQ查询从MemoryCache.Default中删除对象,如下所示:
MemoryCache.Default.Select(c => c.Value).OfType<CachedObjectType>().ToList().RemoveAll(k => k.ZipCode == "11111");
Run Code Online (Sandbox Code Playgroud)
这不会从MemoryCache.Default实例中删除对象.
MonoTouch中是否可以访问System.Runtime.Caching.MemoryCache?如果没有,有没有人知道一个等价物?
谢谢!
我不明白在 System.Runtime.Caching.MemoryCache 和 .NET 4.0 中滑动过期应该如何工作。
根据文档,到期时间跨度是“在缓存条目从缓存中逐出之前必须访问缓存条目的时间跨度”。
但是,以下单元测试失败:
private const string AnyKey = "key";
private const string AnyValue = "value";
private readonly TimeSpan timeout = TimeSpan.FromSeconds(0.5);
private void WaitSixtyPercentOfTheTimeout()
{
Thread.Sleep(TimeSpan.FromSeconds(timeout.TotalSeconds*0.6));
}
[Test]
public void Get_RefreshesTimeoutOfSlidingExpiration()
{
var cache = MemoryCache.Default;
cache.Set(AnyKey, AnyValue, new CacheItemPolicy {SlidingExpiration = timeout});
WaitSixtyPercentOfTheTimeout();
cache[AnyKey].Should().Be(AnyValue);
WaitSixtyPercentOfTheTimeout();
cache[AnyKey].Should().Be(AnyValue);
}
private void UpdateCallback(CacheEntryUpdateArguments arguments)
{
}
Run Code Online (Sandbox Code Playgroud)
巧合的是,我做了一个小改动来解决这个问题。但是,如果这是一个错误或功能,现在有人吗?
一旦设置了 UpdateCallBack,到期将按预期工作:
// [...]
[Test]
public void Get_RefreshesTimeoutOfSlidingExpiration()
{
var cache = MemoryCache.Default;
cache.Set(AnyKey, AnyValue, new CacheItemPolicy {SlidingExpiration = timeout, …Run Code Online (Sandbox Code Playgroud) 使用MemoryCache时可以设置
AbsoluteExpirationAbsoluteExpirationRelativeToNow例:
cache.GetOrCreate("key", f =>
{
f.AbsoluteExpiration = new DateTimeOffset(DateTime.Today.AddDays(1));
f.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);
return "item";
});
Run Code Online (Sandbox Code Playgroud)
可以同时设置两个属性,然后应用第一个过期的属性吗?还是将最后设置的属性设置为“主”?
我想使用,System.Runtime.Caching.MemoryCache但我想知道如何将它与泛型一起使用。
在下面的例子中,如果T是值类型,我会遇到麻烦。
public T GetItem<T>(string key, Func<T> loadItemFromDb)
{
var cachedItem = (T) memoryCache.Get(key);
if(cachedItem != null)
return cachedItem;
// call db
//put result in cache
// return result
}
Run Code Online (Sandbox Code Playgroud)
MemoryCache.Get(string key)返回null如果确定缓存条目key不存在,它会提高NullReferenceException,因为它试图做(T)null(与T值类型)
我怎么能得到类似的行为T?
编辑:我删除了where T : class因为这个约束阻止了我描述的情况。
编辑 2:我添加了一些代码来提供意图
ASP.NET Core 提供内存缓存和响应缓存。假设该应用程序是 ASP.NET Core WebAPI,它通过配置的 Responce Caching 中间件将 SQL 数据库中的数据传送给用户。在什么情况下也使用内存缓存有用?
caching memorycache asp.net-core responsecache asp.net-core-webapi
以下是用于缓存用户进行的无效登录尝试的代码.使用"绝对过期"缓存策略将项目添加到缓存中.
如果我只添加一个项目 - 它会在2分钟内按预期到期.但是,如果我更新该缓存项目(没有明确指定缓存策略) - 该项目仍然超过2分钟.这是代码片段:
public class UserLogin
{
public string Username { get; set; }
public List<DateTime> InvalidLoginTimestamp { get; set; }
public bool IsLocked { get; set; }
}
private void AddInvalidLoginToCache(string cacheKey)
{
if (invalidLoginCache.Contains(cacheKey))
{
//Add invalid login to cache
UserLogin invalidLogin = (UserLogin)invalidLoginCache[cacheKey];
invalidLogin.InvalidLoginTimestamp.Add(DateTime.Now);
invalidLoginCache[cacheKey] = invalidLogin;
//Lock user account if invalid logins reach threshold
if (invalidLogin.InvalidLoginTimestamp.Count == 3)
{
invalidLogin.IsLocked = true;
invalidLoginCache.Set(cacheKey, invalidLogin, GetCachePolicyForLockOut());
}
}
else
{
invalidLoginCache.Add(cacheKey,
new UserLogin { …Run Code Online (Sandbox Code Playgroud) 我正在使用以下技术开发一个小博客应用程序:
在内部我使用MemoryCache类.假设我想让用户能够添加/编辑/删除博客帖子.将包含所有博客文章的JSON保存到缓存中是一个好习惯吗?在现实世界中,会有大量的帖子,因此缓存的序列化/反序列化可能会成为一项昂贵的操作.另外,支持这些项目分页的最佳方法是什么?预先感谢您的帮助.
所以 很多 的例子使用.NET中的内存缓存(的包括官方文档)与实例吧:
private readonly ObjectCache memoryCache = MemoryCache.Default;
Run Code Online (Sandbox Code Playgroud)
有什么理由要优先于此:
private readonly MemoryCache memoryCache = MemoryCache.Default;
Run Code Online (Sandbox Code Playgroud) 我写了一个方法,应该从Web服务获取一些信息.我想避免额外调用该服务,所以我试图根据这篇文章将信息放入MemoryCache .
不同之处在于我在客户端没有"SomeHeavyAndExpensiveCalculation",但我将工作委托给了Web服务.所以我想等待电话.
据我了解当前的实现,我可能有多个请求到Web服务器,因为我无法等待锁内的请求,这就是为什么它被移出锁.
有更好的解决方案吗?
谢谢.
private static readonly object CompanyInfoLock = new object();
public async Task<CompanyDto> GetCompanyInfo()
{
const string cacheKey = "_COMPANYINFO_";
CompanyDto companyInfo = MemoryCache.Default[cacheKey] as CompanyDto;
if (companyInfo != null) return companyInfo;
CompanyDto company = await _userManagementService.InvokeAsync(x => x.GetCompanyAsync(AppPrincipal.Current.CurrentCompanyId));
lock (CompanyInfoLock)
{
companyInfo = MemoryCache.Default[cacheKey] as CompanyDto;
if (companyInfo != null) return companyInfo;
MemoryCache.Default.Add(cacheKey, company, new CacheItemPolicy
{
SlidingExpiration = new TimeSpan(2, 0, 0)
});
}
return company;
}
Run Code Online (Sandbox Code Playgroud) 我使用异步方法遵循以下代码:
public string TryForGetToken()
{
cache = getCache;
if (!cache.Contains(keyToken))
{
CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
TryForLogin();
cacheItemPolicy.AbsoluteExpiration = DateTime.Now.AddSeconds(expiredTime - 60);
CacheItem item = new CacheItem(keyToken, publicToken);
//cache.Add(item, cacheItemPolicy);
return publicToken;
}
else
return cache.Get(keyToken).ToString();
}
Run Code Online (Sandbox Code Playgroud)
和
public async Task TryForLogin()
{
await _semaphore.WaitAsync();
try
{
AuthenticationData authenticationData = new AuthenticationData() { email = "zzzzzz", password = "zzzzzzzz" };
ResponseResult result = await httpServiceCaller.PostJsonAsync<AuthenticationData, ResponseResult>("http://sample.com/agent/login", authenticationData, new CancellationToken(), "Login");
publicToken = result.data.token.access_token;
expiredTime = result.data.token.expires_in;
}
catch (Exception ex) …Run Code Online (Sandbox Code Playgroud) memorycache ×11
c# ×9
.net ×4
async-await ×2
caching ×2
.net-core ×1
asp.net ×1
asp.net-core ×1
asynchronous ×1
generics ×1
linq ×1
locking ×1
objectcache ×1
value-type ×1
web-services ×1
xamarin.ios ×1