【发布时间】: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