【问题标题】:Using Redis Pub/Sub to Invalidate Memory Cache using ChangeMonitor使用 Redis Pub/Sub 使用 ChangeMonitor 使内存缓存失效
【发布时间】:2016-10-08 17:19:31
【问题描述】:

我创建了一个新类,用于使内存缓存数据无效并从 Redis 加载数据的新副本。 这也取决于 Redis 的发布/订阅功能。

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 方法中取消订阅,则内存状态正常。但内存缓存并没有失效。

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

    看起来您正在订阅每个实例,但您对 unsubscribe 的使用当前没有传入委托,因此是“取消订阅所有人”。

    您应该将 lambda 移动到本地方法并将兼容的委托传递给订阅和取消订阅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-02
      • 2012-12-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多