标签: memorycache

使用LINQ删除MemoryCache.Default

有没有办法可以使用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实例中删除对象.

c# linq memorycache

3
推荐指数
1
解决办法
2371
查看次数

MonoTouch中的System.Runtime.Caching.MemoryCache

MonoTouch中是否可以访问System.Runtime.Caching.MemoryCache?如果没有,有没有人知道一个等价物?

谢谢!

.net xamarin.ios memorycache

3
推荐指数
1
解决办法
657
查看次数

为什么 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)

.net c# caching memorycache

2
推荐指数
1
解决办法
2504
查看次数

MemoryCache AbsoluteExpiration

使用MemoryCache时可以设置

  • AbsoluteExpiration
  • AbsoluteExpirationRelativeToNow

例:

    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)

可以同时设置两个属性,然后应用第一个过期的属性吗?还是将最后设置的属性设置为“主”?

c# memorycache .net-core

2
推荐指数
1
解决办法
1115
查看次数

MemoryCache 与泛型的正确使用?

我想使用,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:我添加了一些代码来提供意图

c# generics value-type reference-type memorycache

2
推荐指数
1
解决办法
2220
查看次数

ASP.NET Core WebAPI:内存缓存与响应缓存

ASP.NET Core 提供内存缓存和响应缓存。假设该应用程序是 ASP.NET Core WebAPI,它通过配置的 Responce Caching 中间件将 SQL 数据库中的数据传送给用户。在什么情况下也使用内存缓存有用?

caching memorycache asp.net-core responsecache asp.net-core-webapi

2
推荐指数
1
解决办法
1441
查看次数

MemoryCache - AbsoluteExpiration - 更新后项目不会过期*

以下是用于缓存用户进行的无效登录尝试的代码.使用"绝对过期"缓存策略将项目添加到缓存中.

如果我只添加一个项目 - 它会在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)

c# memorycache

1
推荐指数
1
解决办法
5723
查看次数

Web API的缓存策略

我正在使用以下技术开发一个小博客应用程序:

  1. 用于后端的ASP.NET Web API.
  2. HTML,CSS和JavaScript(特别是KnockoutJS)

在内部我使用MemoryCache类.假设我想让用户能够添加/编辑/删除博客帖子.将包含所有博客文章的JSON保存到缓存中是一个好习惯吗?在现实世界中,会有大量的帖子,因此缓存的序列化/反序列化可能会成为一项昂贵的操作.另外,支持这些项目分页的最佳方法是什么?预先感谢您的帮助.

c# asp.net memorycache asp.net-web-api

1
推荐指数
1
解决办法
7899
查看次数

在.NET中,为什么ObjectCache比MemoryCache是​​首选类型?

所以 很多 的例子使用.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)

.net c# objectcache memorycache

1
推荐指数
2
解决办法
218
查看次数

从异步请求返回缓存条目时锁定

我写了一个方法,应该从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)

c# web-services locking async-await memorycache

0
推荐指数
1
解决办法
377
查看次数

async-await 方法(等待响应)

我使用异步方法遵循以下代码:

    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)

.net c# asynchronous async-await memorycache

0
推荐指数
1
解决办法
136
查看次数