using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Caching;
namespace Ares_Windows
{
public class CacheHelper
{
//private static readonly Dictionary dic = new Dictionary();
//public static void SetValue()
//{
// dic.Add("ABC","1232312");
//}
//public static string GetValue()
//{
// return dic["ABC"].ToString();
//}
///
/// 获取数据缓存
///
/// 键
public static object GetCache(string cacheKey)
{
var objCache = HttpRuntime.Cache.Get(cacheKey);
return objCache;
}
///
/// 设置数据缓存
///
public static void SetCache(string cacheKey, object objObject)
{
var objCache = HttpRuntime.Cache;
objCache.Insert(cacheKey, objObject);
}
///
/// 设置数据缓存
///
public static void SetCache(string cacheKey, object objObject, int timeout = 7200)
{
try
{
if (objObject == null) return;
var objCache = HttpRuntime.Cache;
//相对过期
//objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null);
//绝对过期时间
objCache.Insert(cacheKey, objObject, null, DateTime.Now.AddSeconds(timeout), TimeSpan.Zero, CacheItemPriority.High, null);
}
catch (Exception)
{
//throw;
}
}
///
/// 移除指定数据缓存
///
public static void RemoveAllCache(string cacheKey)
{
var cache = HttpRuntime.Cache;
cache.Remove(cacheKey);
}
///
/// 移除全部缓存
///
public static void RemoveAllCache()
{
var cache = HttpRuntime.Cache;
var cacheEnum = cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
cache.Remove(cacheEnum.Key.ToString());
}
}
}
}
调用
namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Person p = new Person();
p.Id = 1;
p.Name = "诸葛亮";
Cache cache = HttpRuntime.Cache;
cache.Insert("AA",p);
cache.Insert("BB","字符串");
Response.Write(cache.Get("BB").ToString()); //输出 字符串
Person p2 = cache["AA"] as Person;
Response.Write(p2.Id + " : " + p2.Name); //输出 1 : 诸葛亮
Response.Write(cache.Count); //输出 3
Response.Write(cache["BB"]); //输出 字符串 支持索引器式的读取
cache.Remove("BB"); //从cache中移除一项
Response.Write("~~~" + cache["BB"] + "~~~"); //移除了输出 null,但程序不报错
foreach (var obj in cache)
{
Response.Write(obj.GetType() + "
"); //输出不知道什么鸟东西
}
}
}
public class Person
{
public int Id
{
get;
set;
}
public string Name
{
get
set;
}
}
}
文件缓存依赖
about.aspx.cs
public partial class About : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//先打开index.aspx添加到缓存 然后立即打开本页面,输出 绝对过期测试
//持续刷新5秒后,不会再输出 绝对过期测试
Response.Write(HttpContext.Current.Cache[“DD”]);
}
}
//在服务器释放系统内存时,具有该优先级级别的缓存项最有可能被从缓存删除。
Low = 1,//在服务器释放系统内存时,具有该优先级级别的缓存项比分配了 System.Web.Caching.CacheItemPriority.Normal
//优先级的项更有可能被从缓存删除。
BelowNormal = 2,//在服务器释放系统内存时,具有该优先级级别的缓存项很有可能被从缓存删除,其被删除的可能性仅次于具有 System.Web.Caching.CacheItemPriority.Low
Normal = 3,//缓存项优先级的默认值为 System.Web.Caching.CacheItemPriority.Normal。
Default = 3,//在服务器释放系统内存时,具有该优先级级别的缓存项被删除的可能性比分配了 System.Web.Caching.CacheItemPriority.Normal
//优先级的项要小。
AboveNormal = 4,//在服务器释放系统内存时,具有该优先级级别的缓存项最不可能被从缓存删除。
High = 5,//在服务器释放系统内存时,具有该优先级级别的缓存项将不会被自动从缓存删除。但是,具有该优先级级别的项会根据项的绝对到期时间或可调整到期时间与其他项一起被移除
NotRemovable = 6
当缓存被移除时,通知程序
这时就要用到Add的最后一个参数,委托了:
index.aspx.cs代码如下
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Cache cache = HttpRuntime.Cache;
//文件权重级别
cache.Add(“MyData”, “缓冲移除通知”, null, DateTime.Now.AddSeconds(10) ,Cache.NoSlidingExpiration,CacheItemPriority.Low, Show);
}
public void Show(string key, object value, CacheItemRemovedReason reason)
{
Cache cache = HttpRuntime.Cache;
Cache.Insert(“MyData”, “缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!”);
}
}
about.aspx.cs代码如下
public partial class About : System.Web.UI.Page{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(HttpRuntime.Cache[“MyData”]);
}
}
此处实现的效果时:第一次打开index.aspx(让程序加入数据到缓存),然后打开about.aspx显示出“缓存移除通知”,10秒后再刷新,显示
“缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!缓存被清空啦!” 经测试,以上程序的Cache最好还是用HttpRuntime的,否则没有请求时HttpContext会报,“未将对象引用设置到对象的实例”。
这就是被清空时会自动调用委托程序进行处理,你可以再次将数据添加进入缓存,或者记录到日志等等一系列操作。
数据库依赖缓存
1、配置的方式(sqlserver2000) SqlDependency第一个构造函数。
首先一个WebForm的Web.Config中的配置文件修改如下:
//此行配置的意思是,开启数据库缓存,轮询时间为1秒,这是为了能够快速看到更改效果
修改Global.asax.cs文件代码如下:
void Application_Start(object sender, EventArgs e)
{
string connString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings[“ApplicationServices”].ConnectionString;
SqlCacheDependencyAdmin.EnableNotifications(connectionString); //启动数据库的数据缓存依赖功能
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table); //启用数据表缓存
}
Index.aspx.cs文件代码如下:
protected void Page_Load(object sender, EventArgs e)
{
SqlCacheDependency dependency = new SqlCacheDependency(“con”, “Record”);
// 新增或修改一条缓存记录
HttpRuntime.Cache.Insert(“MyData”, “数据库缓存测试”, dependency);
}
About.aspx.cs文件代码如下:
protected void Page_Load(object sender, EventArgs e){
Response.Write(HttpRuntime.Cache["MyData"])
}
第一次数实现的效果时,打开Index.aspx.cs文件将数据添加到缓存后,然后打开about.asox,页面输出"数据库缓存测试",这时候更改一下数据库的Record表,再刷新about.aspx页面,上一次输出的内容没有了。
System.Data.SqlClient.SqlDependency.Start(connString);
System.Data.SqlClient.SqlDependency.Stop(connString);
这两行代码不一定要放在Global.asax.cs里面,在代码执行之前和执行之后就OK了。
注意,在这个例子当中,数据库要开启Service Broker
检测是否已经启用Service Broker
Select DATABASEpRoPERTYEX(‘数据库名称’,‘IsBrokerEnabled’) – 1 表示已经启用 0 表示没有启用
启用Servicce Broker
ALTER DATABASE NX SET ENABLE_BROKER;
如果启动时,一直显示正在执行查询,那么用一下这条语句
ALTER DATABASE NX SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE NX SET ENABLE_BROKER;
再来一次数据库缓存依赖,回调函数的例子:
public class Program
{
static void Main(string[] args)
{
Cache cache = HttpRuntime.Cache;
System.Data.SqlClient.SqlDependency.Start(@“Server=KISSDODOG-PC;Database=Nx;uid=sa;pwd=123;”);
// 创建缓存依赖
SqlConnection conn = new SqlConnection(@“Server=KISSDODOG-PC;Database=Nx;uid=sa;pwd=123;”);
SqlCommand command = new SqlCommand(“select Id,name from dbo.Record”, conn);
SqlCacheDependency dependency = new SqlCacheDependency(command); //注意,创建的command与SqlCacheDependency绑定要在command执行之前
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds); //这里要特别注意,Fill才是真正执行
CacheItemRemovedCallback callback = new CacheItemRemovedCallback(RemovedCallback);
cache.Insert(“DD”, “数据库依赖测试”, dependency, DateTime.Now.AddDays(1), TimeSpan.Zero, CacheItemPriority.Default, callback);
Console.WriteLine(cache[“DD”]);
Thread.Sleep(15000); //暂停15秒给你更改一下数据库
if (cache[“DD”] == null)
{
Console.WriteLine(“数据库已经修改过了!”);
}
Console.ReadKey();
System.Data.SqlClient.SqlDependency.Stop(@“Server=KISSDODOG-PC;Database=Nx;uid=sa;pwd=123;”);
}
public static void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
Console.WriteLine(“缓存被移除!”);
Console.WriteLine(reason.ToString());
}
}