簡體   English   中英

使用Redis Pub / Sub使用ChangeMonitor使內存緩存無效

[英]Using Redis Pub/Sub to Invalidate Memory Cache using ChangeMonitor

我創建了一個新類,用於使Memory Cached數據無效並從Redis加載新的數據副本。 它還取決於Redis的pub / sub功能。

public class RedisChangeMonitor : ChangeMonitor
{
    private string uniqueId;
    private ISubscriber subscriber;

    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {
        ConnectionMultiplexer connectionMultiplexer = ConnectionMultiplexer.Connect(ConfigurationManager.ConnectionStrings["RedisConnectionString"].ConnectionString);
        connectionMultiplexer.PreserveAsyncOrder = false;
        return connectionMultiplexer;
    });

    public ConnectionMultiplexer Connection
    {
        get
        {
            return lazyConnection.Value;
        }
    }

    public override string UniqueId
    {
        get
        {
            return uniqueId;
        }
    }

    public RedisChangeMonitor(IList<string> cacheKeys)
    {
        bool isInitialized = false;
        try
        {
            this.uniqueId = Guid.NewGuid().ToString();

            subscriber = this.Connection.GetSubscriber();
            subscriber.Subscribe(RedisChannels.ChangeNotification, (channel, data) =>
            {
                string cacheKey = data;
                if (cacheKeys.Contains(cacheKey))
                {
                    base.OnChanged(null);
                }
            });
            isInitialized = true;
        }
        finally
        {
            base.InitializationComplete();
            if (!isInitialized)
                Dispose(true);
        }
    }

    ~RedisChangeMonitor()
    {
        Dispose(false);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (subscriber != null)
            {
                subscriber.Unsubscribe(RedisChannels.ChangeNotification);
            }
        }
    }
}

我在ASP.NET MVC App中使用過這個類,我已經看到,如果我沒有在dispose方法中取消訂閱,服務器的內存在大約1小時后就已滿了。

如果我在Dispose方法中取消訂閱,則內存狀態正常。 但是內存緩存沒有失效。

看起來您正在訂閱每個實例,但您目前使用取消訂閱不會傳遞給代理,因此“取消訂閱所有人”。

您應該將lambda移動到本地方法,並將兼容的委托傳遞給subscribe和unsubscribe。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM