2016-10-08 5 views
0

Memory Cachedデータを無効にし、Redisのデータの新しいコピーを読み込むために使用する新しいクラスを作成しました。 また、Redisのpub/sub機能によって異なります。私はASP.NET MVCアプリケーションでこのクラスを使用Redis Pub/Subを使用してChangeMonitorを使用してメモリキャッシュを無効にする

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); 
      } 
     } 
    } 
} 

、私はDisposeメソッドで退会していない場合は、サーバーのメモリは約1時間後に完全であることを見てきました。

Disposeメソッドの登録を解除した場合、メモリの状態はokです。しかし、メモリキャッシュは無効にされません。

答えて

0

インスタンスごとに購読しているようですが、現在、退会者の使用はデリゲートを通過していないため、「全員の退会」です。

ラムダをローカルメソッドに移動し、互換性のあるデリゲートをsubscribeとunsubscribeの両方に渡す必要があります。

関連する問題