主要用到 System.Runtime.Caching

框架自动给了一个默认值 MemoryCache.Default;

查看微软关于MemoryCache的介绍,可以看到它有Add、Get、Set 、 Contains 、Remove等几个方法, 也就是我们常用的了,比较简单

网上找了一段对这个封装的代码:

/// <summary>
/// Represents a MemoryCacheCache
/// </summary>
public static class CacheManager
{
public static ObjectCache Cache
{
get
{
return MemoryCache.Default;
}
} public static bool Contains(string key)
{
return Cache.Contains(key);
} /// <summary>
/// Gets or sets the value associated with the specified key.
/// </summary>
/// <typeparam name="T">Type</typeparam>
/// <param name="key">The key of the value to get.</param>
/// <returns>The value associated with the specified key.</returns>
public static T Get<T>(string key)
{
return (T)Cache[key];
} /// <summary>
/// Adds the specified key and object to the cache.
/// </summary>
/// <param name="key">key</param>
/// <param name="data">Data</param>
/// <param name="cacheTime">Cache time</param>
public static void Set(string key, object data, int cacheTime)
{
if (data == null)
return; var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
Cache.Set(new CacheItem(key, data), policy);
}/// <summary>
/// Gets a value indicating whether the value associated with the specified key is cached
/// </summary>
/// <param name="key">key</param>
/// <returns>Result</returns>
public static bool IsSet(string key)
{
return (Cache.Contains(key));
} /// <summary>
/// Removes the value with the specified key from the cache
/// </summary>
/// <param name="key">/key</param>
public static void Remove(string key)
{
Cache.Remove(key);
} /// <summary>
/// Removes items by pattern
/// </summary>
/// <param name="pattern">pattern</param>
public static void RemoveByPattern(string pattern)
{
var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
var keysToRemove = new List<String>(); foreach (var item in Cache)
if (regex.IsMatch(item.Key))
keysToRemove.Add(item.Key); foreach (string key in keysToRemove)
{
Remove(key);
}
} /// <summary>
/// Clear all cache data
/// </summary>
public static void Clear()
{
foreach (var item in Cache)
Remove(item.Key);
}

框架提供了缓存的更新机制

查看MemoryCache的Add方法:Add(CacheItem, CacheItemPolicy)

其中的参数CacheItemPolicy有一个ChangeMonitors属性, 该属性可选项为

System.Runtime.Caching.CacheEntryChangeMonitor
System.Runtime.Caching.FileChangeMonitor
System.Runtime.Caching.SqlChangeMonitor

可以看出添加cache的时候可以设置此cache的几种类型的依赖

网上看到有FileChangeMonitor的例子, 现在小罗遇到的需求是需要根据系统表来更新缓存,

即数据库中的数据发生了改变, 此时更新本次添加的缓存

对上面的代码添加方法

        public static void SetWithSql(string key, object data, string connStr, string sql, CacheEntryRemovedCallback callback)
{
if (data == null)
return; Cache.Add(new CacheItem(key, data), SqlChangePolicy(connStr, sql, callback));
} private static CacheItemPolicy SqlChangePolicy(string connStr,string sql, CacheEntryRemovedCallback callback)
{
SqlDependency.Start(connStr);
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand command = new SqlCommand(sql, conn))
{
command.Notification = null;
conn.Open(); SqlDependency dependency = new SqlDependency(command);
dependency.AddCommandDependency(command); SqlChangeMonitor monitor = new SqlChangeMonitor(dependency); CacheItemPolicy policy = new CacheItemPolicy();
policy.ChangeMonitors.Add(monitor); command.ExecuteScalar();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(*);
policy.RemovedCallback = callback;
return policy;
}
}
}

添加cache项的时候, 传入SqlConnection和相应的sql, 目的是当sql对应的查询结果发生变化的时候, 清除此项缓存

注意是清除, 可以看到改方法有一个CacheEntryRemovedCallback参数,当此项被清除后会调用该callback方法

如果想"更新", 现在看到这个callback方法应该知道怎么做了

看着微软的帮助一步一步做下来简单, 但出了一个问题,就是刚Add进去, 马上CacheEntryRemovedCallback方法就被调用了, 数据改变了? 确认一下没有,

继续研究帮助,

看一下SqlChangeMonitor的构造函数, 参数是SqlDependency

SqlDependency是System.Data.SqlClient 命名空间中的,

微软这样说:SqlDependency 对象都表示应用程序和 SQL Server 实例之间的查询通知依赖项。 应用程序可以创建 SqlDependency 对象并进行注册以接收通知通过 OnChangeEventHandler 事件处理程序。

原来此对象是数据库中做监视和通知用的, 被"征用"过来的.

这就好办了, 根据帮助文档, 发现这个sql的要求真不是一般的严格

现在说一下这个"sql", 这个sql首先要求是一个select语句,然后:

  • 必须显式说明 SELECT 语句中提取的列,并且表名必须限定为两部分组成的名称。注意,这意味着语句中引用的所有表都必须处于同一数据库中。

  • 语句不能使用星号 (*) 或 table_name.* 语法指定列。

  • 语句不能使用未命名列或重复的列名。

  • 语句必须引用基表。

  • 语句不能引用具有计算列的表。

  • 在 SELECT 语句中提取的列不能包含聚合表达式,除非语句使用 GROUP BY 表达式。提供 GROUP BY 表达式时,选择列表便可以包含聚合函数 COUNT_BIG() 或 SUM()。但是,不能为可为空的列指定 SUM()。语句不能指定 HAVING、CUBE 或 ROLLUP。

  • 在用作简单表达式的 SELECT 语句中提取的列不能多次显示。

  • 语句不能包含 PIVOT 或 UNPIVOT 运算符。

  • 语句不能包含 UNION、INTERSECT 或 EXCEPT 运算符。

  • 语句不能引用视图。

  • 语句不能包含下列任意一个:DISTINCT、COMPUTE、COMPUTE BY 或 INTO。

  • 语句不能引用服务器全局变量 (@@variable_name)。

  • 语句不能引用派生表、临时表或表变量。

  • 语句不能从其他数据库或服务器中引用表或视图。

  • 语句不能包含子查询、外部联接或自联接。

  • 语句不能引用下列大型对象类型:text、ntext 和 image。

  • 语句不能使用 CONTAINS 或 FREETEXT 全文谓词。

  • 语句不能使用行集函数,包括 OPENROWSET 和 OPENQUERY。

  • 语句不能使用下列任何一个聚合函数:AVG、COUNT(*)、MAX、MIN、STDEV、STDEVP、VAR 或 VARP。

  • 语句不能使用任何具有不确定性的函数,包括排名函数和开窗函数。

  • 语句不能包含用户定义聚合。

  • 语句不能引用系统表或视图,包括目录视图和动态管理视图。

  • 语句不能包含 FOR BROWSE 信息。

  • 语句不能引用队列。

  • 语句不能包含无法更改和无法返回结果的条件语句(如 WHERE 1=0)。

  • 语句不能指定 READPAST 锁提示。

  • 语句不能引用任何 Service Broker QUEUE。

  • 语句不能引用同义词。

  • 语句不能具有基于 double/real 数据类型的比较或表达式。

  • 语句不得使用 TOP 表达式。

多吧, 还有个问题,就是要启用数据库的BROKER

ALTER DATABASE database_name SET TRUSTWORTHY ON WITH ROLLBACK IMMEDIATE
ALTER DATABASE database_name SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
ALTER AUTHORIZATION ON DATABASE::database_name TO sa

.Net cache与cache更新的更多相关文章

  1. 浏览器缓存(Web Cache/ Http Cache)

    浏览器缓存(Web Cache/ Http Cache)是前端性能优化中很重要的组成部分. 缓存策略 浏览器的缓存策略是: 1.如果本地没有缓存,则发送非条件性请求. 2.如果本地有缓存,则判断本地缓 ...

  2. 判断和调整library cache,data dictionary cache,buffer cache性能

    Oracle SGA是oracle的内存结构,存放着oracle通过oracle进程读写的内存数据.sga分为好多组件,比如shared pool,buffer cache,redo log buff ...

  3. HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的

    HTML5 离线缓存-manifest简介 HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(A ...

  4. 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache

    开篇介绍 先简单的演示一下使用 Lookup 组件实现一个简单示例 - 从数据源表 A 中导出数据到目标数据表 B,如果 A 数据在 B 中不存在就插入新数据到B,如果存在就更新B 和 A 表数据保持 ...

  5. Asp.Net framework 类库 自带的缓存 HttpRuntime.Cache HttpContext.Cache

    两个Cache 在.NET运用中经常用到缓存(Cache)对象.有HttpContext.Current.Cache以及HttpRuntime.Cache,HttpRuntime.Cache是应用程序 ...

  6. Webview离线功能(优先cache缓存+cache缓存管理)

    在做Webview显示服务器的html功能时 需要加入离线功能. 开始思路很狭隘,以为一定应该是从服务器得到的html文件,下载到本地后加载~ 但是这样不能离线查看图片,因为图片数据并不再html中, ...

  7. Page Cache buffer Cache

    https://www.thomas-krenn.com/en/wiki/Linux_Page_Cache_Basics References Jump up ↑ The Buffer Cache ( ...

  8. L1 Cache, L2 Cache读取命中率与时钟周期计算

    CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存.从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为8 ...

  9. Leetcode:LRU Cache,LFU Cache

    在Leetcode上遇到了两个有趣的题目,分别是利用LRU和LFU算法实现两个缓存.缓存支持和字典一样的get和put操作,且要求两个操作的时间复杂度均为O(1). 首先说一下如何在O(1)时间复杂度 ...

随机推荐

  1. spring中使用Hibernate中的getCurrentSession报出:createQuery is not valid without active transaction

    1.错误信息 HTTP Status 500 - createQuery is not valid without active transaction type Exception report m ...

  2. angular4.0 路由守卫详解

    在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Ang ...

  3. CSS制作波浪线

    建议先去了解清楚了径向渐变,线性渐变的用法先 这个作者的css制作波浪线讲解很不错额:https://www.jianshu.com/p/8570433e3669不理解的可以看看这个链接的额 可以去菜 ...

  4. Android Ptrace Inject

    之前介绍了Android平台上3种常见的hook方法,而hook的前提是进程注入,通过进程注入我们可以将模块或代码注入到目标进程中以便对其空间内的数据进行操作,本篇文章介绍基于ptrace函数的注入技 ...

  5. MySQL 基础命令

    的说法啊打发 第1章 SQL语句 mysql版本:针对mysql-5.6.36 版本 (5.7会有一些变动) 1.1 常用命令 # 查看数据库 mysql> show databases; sh ...

  6. java.lang.Exception: 资源处理失败,失败原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '?????‰' in 'where clause'

    1:Unknown column '?????‰' in 'where clause',这个问题,百度一搜,挺多的,但是貌似好像没有解决我的问题.贴一下我是如何拼接sql的.解决这个sql拼接bug的 ...

  7. sso示例代码

    个人写的一个关于在ASP.NET 中如何实现SSO单点登录,这可能也是.NET实现大型互联网项目的第一步要解决的问题.已经放到GitHub上供大家参考.https://github.com/bidia ...

  8. js 移动端上拉加载下一页通用方案

    取页面三种高度 //取进度条到底部距离 var getScrollTop = function () { var scrollTop = 0; if (document.documentElement ...

  9. CSS 设置table下tbody滚动条

    table tbody { display:block; height:195px; overflow-y:scroll; } table thead, tbody tr { display:tabl ...

  10. C#学习笔记-组合模式

    什么是组合模式? 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 何时使用组合模式? 当需求中是体现部分与 ...