我想从数据库缓存内存中的字符串,这样我就不必每次都访问数据库。我尝试使用System.Runtime.Caching,但它似乎不起作用。
在本地站点上,缓存所有数据,但必须在辅助站点上对用户进行身份验证。用户通过身份验证后,将被带回本地站点,但缓存的所有数据都将消失。
有没有办法解决上述问题?以下是我的代码的一部分:
using System.Runtime.Caching;
ObjectCache cache = MemoryCache.Default;
public bool CacheIsSet(string key)
{
return cache.Contains(key);
}
public object CacheGet(string key)
{
return cache.Get(key);
}
public void CacheSet(string key, object value)
{
CacheItemPolicy policy = new CacheItemPolicy();
cache.Set(key, value, policy);
}
非常感谢。
答案 0 :(得分:6)
您应该引用HttpRuntime.Cache
对象。我创建了一个包装器,类似于您在问题中引用的内容。随意使用它:
using System.Web.Caching;
public class CachingService
{
protected Cache Cache
{
get;
set;
}
public int CacheDurationMinutes
{
get;
set;
}
public CachingService()
{
Cache = HttpRuntime.Cache;
CacheDurationMinutes = 60;
}
public virtual object Get(string keyname)
{
return Cache[keyname];
}
public virtual T Get<T>(string keyname)
{
T item = (T)Cache[keyname];
return item;
}
public virtual void Insert(string keyname, object item)
{
Cache.Insert(keyname, item, null, DateTime.UtcNow.AddMinutes(CacheDurationMinutes), Cache.NoSlidingExpiration);
}
public virtual void Insert(string keyname, object item, CacheDependency dependency)
{
Cache.Insert(keyname, item, dependency);
}
public virtual void Remove(string keyname)
{
Cache.Remove(keyname);
}
}
以下是一个示例用例。函数LoadPosts
应该加载博客帖子以显示在网站上。该函数将首先查看帖子是否被缓存,如果不是,它将从数据库加载帖子,然后缓存它们:
public IEnumerable<BlogPost> LoadPosts()
{
var cacheService = new CachingService();
var blogPosts = cacheService.Get<IEnumerable<BlogPost>>("BlogPosts");
if (blogPosts == null)
{
blogPosts = postManager.LoadPostsFromDatabase();
cacheService.Insert("BlogPosts", blogPosts);
}
return blogPosts;
}
第一次运行此函数时,缓存将返回null
,因为我们尚未向BlogPosts键添加任何内容。第二次调用该函数时,帖子将在缓存中,并且if
块中的代码将不会运行,从而使我们无法访问数据库。