负载平衡服务器上的缓存类
本文关键字:缓存 平衡 服务器 负载 | 更新日期: 2023-09-27 18:24:55
我有一个类,它在我的web应用程序的服务层业务对象中进行缓存。当代码在负载平衡的服务器上运行时,当客户端访问一台机器并更新其详细信息,但随后关闭浏览器,重新打开浏览器,并碰巧访问负载平衡解决方案上的另一台机器上的网站时,其最新更改不可见。
这个基本类由我的其他业务对象(如People)继承。有没有一种方法可以在负载平衡环境中的其他服务器上刷新这个缓存的对象,这样客户端总是能看到最新的?
public abstract class CacheStore<T> where T:IComparable, new()
{
private class CacheItem
{
public T Item
{
get;
set;
}
public DateTime Expires
{
get;
set;
}
}
private List<CacheItem> theCache = new List<CacheItem>();
public abstract TimeSpan Lifetime
{
get;
}
public int CountAll
{
get
{
return theCache.Count();
}
}
public int CountExpired
{
get
{
return theCache.Count(i => i.Expires < DateTime.Now);
}
}
public void Add(T item)
{
CacheItem i = (from c in theCache where (c.Item.CompareTo(item) == 0) select c).FirstOrDefault();
if (i != null)
{
if (i.Expires < DateTime.Now)
{
theCache.Remove(i);
i = null;
}
}
if (i == null)
{
theCache.Add(new CacheItem()
{
Expires = DateTime.Now + Lifetime,
Item = item
});
}
}
public IEnumerable<T> Filter(Func<T, bool> predicate)
{
return (from c in theCache where c.Expires > DateTime.Now select c.Item).Where(predicate);
}
public void MarkAsExpired(Func<T, bool> predicate)
{
var markAsExpired = from c in theCache
where this.Filter(predicate).Contains(c.Item)
select c;
foreach (CacheItem ci in markAsExpired)
{
ci.Expires = DateTime.Now.Subtract(TimeSpan.FromSeconds(1));
}
}
}
}
Lloyd的回答基本涵盖了这一点。
在.NET应用程序中滚动自己的缓存有点不寻常。通常,您会使用框架中内置的缓存-请参阅ASP.NET缓存以了解概述,以及System.Web.Cache命名空间。如果这样做,您可以使用SqlCacheDependency使数据库更改中的缓存数据无效。
不过,对于负载平衡的环境,您可能会更好地使用Lloyd建议的集中式缓存。如果您想继续使用Microsoft解决方案,AppFabric将是您的首选。
当您在本地应用程序域中创建缓存时,这是意料之中的事,该域的作用域是即时服务器。在那里创建的任何对象都只与该应用程序域相关。
为了解决这个问题,您需要将缓存解决方案集中到一个通用服务器上,或者使用Couchbase/Mmemcached之类的东西,以便所有服务器都可以共享相同的缓存。