[英]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.