5

重複した値を受信しないように、いくつかのクエリ文字列値を 30 秒間キャッシュする Web ページがあります。私は次のクラスを使用しています:

public class MyCache   {

private static ObjectCache cache = MemoryCache.Default;

public MyCache() { }


public void Insert(string key, string value)
{

    CacheItemPolicy policy = new CacheItemPolicy();
    policy.Priority = CacheItemPriority.Default;
    policy.SlidingExpiration = new TimeSpan(0, 0, 30);
    policy.RemovedCallback = new CacheEntryRemovedCallback(this.Cacheremovedcallback);

    cache.Set(key, value, policy);
}

public bool Exists(string key)
{
    return cache.Contains(key);
}

public void Remove(string key)
{
    cache.Remove(key);
}

private void Cacheremovedcallback(CacheEntryRemovedArguments arguments)
{      
    FileLog.LogToFile("Cache item removed. Reason: " + arguments.RemovedReason.ToString() +  "; Item: [" +  arguments.CacheItem.Key + ", " + arguments.CacheItem.Value.ToString() + "]");         
}
 }

これは数週間うまくいきましたが、突然キャッシュが値を保持しなくなりました。CacheRemoved コールバックは、アイテムがキャッシュに挿入された直後に発生し、削除された理由を取得します: CacheSpecificEviction これは、.NET 4.0 を使用する Windows Server 2008 SP1、IIS7.5 で実行されています。この間、OS または IIS に変更は適用されませんでした。

これを解決する方法はありますか?そうでない場合、Web ページで使用するより良いキャッシュ ソリューションはありますか?

前もって感謝します。

4

3 に答える 3

0

また、キャッシュ内のアイテムを上書きするため、既存のアイテムRemovedCallbackを呼び出すと が実行されることもわかりました。MemoryCache.Set.Set

.Add回避策は、代わりに使用することです.Set

OPは言及CacheSpecificEvictionしていますが、これは彼の質問に答えていませんが、誰かが同様の問題に直面していて、Webを検索した後にこの質問にたどり着いた場合に備えて.

于 2020-06-16T22:01:18.297 に答える
-1

これを試してください:

policy.AbsoluteExpiration = DateTime.Now.AddSeconds(30);

それが私がキャッシュを使用する方法です:

public static class CacheHelper
{
    private static ObjectCache _cache;
    private const Double ChacheExpirationInMinutes = 10;

    /// <summary>
    /// Insert value into the cache using
    /// appropriate name/value pairs
    /// </summary>
    /// <typeparam name="T">Type of cached item</typeparam>
    /// <param name="entity">item cached</param>
    /// <param name="key">Name of item</param>
    public static void Add<T>(T entity, string key) where T : class
    {
        if (_cache == null)
        {
            _cache = MemoryCache.Default;
        }
        if (_cache.Contains(key))
            _cache.Remove(key);
        CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
        cacheItemPolicy.AbsoluteExpiration = DateTime.Now.AddMinutes(ChacheExpirationInMinutes);
        _cache.Set(key, entity, cacheItemPolicy);
    }

    /// <summary>
    /// Remove item from cache
    /// </summary>
    /// <param name="key">Name of cached item</param>
    public static void Clear(string key)
    {
        if (_cache == null)
        {
            _cache = MemoryCache.Default;
            return;
        }
        _cache.Remove(key);
    }

    /// <summary>
    /// Retrieve cached item
    /// </summary>
    /// <typeparam name="T">Type of cached item</typeparam>
    /// <param name="key">Name of cached item</param>
    /// <returns>Cached item as type</returns>
    public static T Get<T>(string key) where T : class
    {
        if (_cache == null)
        {
            _cache = MemoryCache.Default;
        }
        try
        {
            return (T)_cache.Get(key);
        }
        catch
        {
            return null;
        }
    }
}
于 2013-02-15T10:38:10.697 に答える