C# Cache缓存的应用
缓存类Cache的使用
直接先上代码
public class CacheHelper
{
private static string fileName = @"D:\huage.txt"; /// <summary>
/// 获取Cache
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static object GetCache(string key)
{
var objCache = HttpRuntime.Cache;
return objCache[key];
} /// <summary>
/// 设置当前应用程序指定CacheKey的Cache对象值
/// </summary>
/// <param name="key">索引键值</param>
/// <param name="obj">缓存对象</param>
public static void SetCache(string key, dynamic obj)
{
var objCache = HttpRuntime.Cache;
objCache.Insert(key, obj);
} /// <summary>
/// 设置当前应用程序指定CacheKey的Cache对象值
/// </summary>
/// <param name="key">索引键值</param>
/// <param name="obj">缓存对象</param>
/// <param name="absoluteExpiration">绝对过期时间 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 <see cref="P:System.DateTime.UtcNow" /> 而不是 <see cref="P:System.DateTime.Now" /> 作为此参数值</param>
public static void SetCache(string key, dynamic obj, DateTime absoluteExpiration)
{
var objCache = HttpRuntime.Cache;
absoluteExpiration = DateTime.SpecifyKind(absoluteExpiration, DateTimeKind.Utc);
//使用absoluteExpiration(绝对过期时间),怎相对过期时间需要为System.Web.Caching.Cache.NoSlidingExpiration
objCache.Insert(key, obj, null, absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
} /// <summary>
/// 设置当前应用程序指定CacheKey的Cache对象值
/// </summary>
/// <param name="key">索引键值</param>
/// <param name="obj">缓存对象</param>
/// <param name="slidingExpiration">最后一次访问所插入对象时与该对象过期时之间的时间间隔</param>
public static void SetCache(string key, dynamic obj, TimeSpan slidingExpiration)
{
var objCache = HttpRuntime.Cache;
//使用slidingExpiration(相对过期时间),怎相对过期时间需要为System.Web.Caching.Cache.NoAbsoluteExpiration
objCache.Insert(key, obj, null, System.Web.Caching.Cache.NoAbsoluteExpiration, slidingExpiration);
} /// <summary>
/// 缓存依赖
/// </summary>
/// <param name="key">索引键值</param>
/// <param name="value">缓存对象</param>
public static void SetCacheByCacheDependency(string key, object value)
{
System.Web.Caching.CacheDependency cacheDependency = new CacheDependency(fileName);//建立缓存依赖项dp
HttpRuntime.Cache.Insert(key, value, cacheDependency);
} /// <summary>
/// 缓存依赖获取值(不存在就取取值)
/// </summary>
/// <param name="key">索引键值</param>
public static object GetCacheByCacheDependency(string key)
{
if (GetCache(key) == null)
{
var strRes = new System.IO.StreamReader(fileName).ReadToEnd();
SetCacheByCacheDependency(key, strRes);
}
return GetCache(key);
} /// <summary>
///设置数据库缓存依赖(需要配置服务项)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static void SetCacheBySqlCacheDependency(string key,object value)
{
var cache = HttpRuntime.Cache;
cache.Insert(key, value, new SqlCacheDependency("test", "user"));
} /// <summary>
/// 获取数据库缓存依赖
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static object GetCacheBySqlCacheDependency(string key)
{
if (GetCache(key) == null)
{
var value = GetList();
SetCacheBySqlCacheDependency(key, value);
}
return GetCache(key);
} public static List<User> GetList()
{
using (SqlConnection conn=new SqlConnection("data source=.;initial catalog=test;user id=sa;password=123"))
{
using (SqlDataAdapter adapter = new SqlDataAdapter("select Id,Name,Age,Password from [user]", conn))
{
var ds=new DataSet();
if(conn.State == ConnectionState.Closed) conn.Open();
adapter.Fill(ds, "myds");
var dt = ds.Tables[0];
return DataTableToList<User>(dt);
}
}
} public static List<T> DataTableToList<T>(DataTable dt)
{
List<T> list = default(List<T>);
if (dt != null && dt.Rows.Count > 0)
{
list = new List<T>();
System.Reflection.PropertyInfo[] propertyInfos = typeof(T).GetProperties();
foreach (DataRow dr in dt.Rows)
{
T t = Activator.CreateInstance<T>();
foreach (var pro in propertyInfos)
{
if (pro.CanWrite && dt.Columns.Contains(pro.Name)) pro.SetValue(t, dr[pro.Name], null);
}
list.Add(t);
}
}
return list;
}
}
代码通俗易懂,就是将重复使用的东西放入到Cache里面,到期之后程序会自动帮我们清除。但是有时候缓存跟我们要使用的的数据会有差异,这就是缓存跟实际数据不同步造成的结果。这时候Cache里面带了缓存依赖(就是我们的缓存跟他依赖的项目,只要依赖项被修改缓存就会被程序清除)。Cache中有文件、数据库依赖项(其中文件依赖比较简单,数据库依赖代码简单但是需要额外配置服务 这篇文章有介绍数据库配置https://www.cnblogs.com/knowledgesea/p/3904929.html,这篇文章介绍的是配置数据库依赖的细节 https://www.cnblogs.com/zhaojin/archive/2012/03/29/2422986.html)。看上去这些操作可以让我们尽可能的绕过数据库进行客户端的快速响应,但是现在如果应用系统都是很庞大的话。上面所提到的缓存手段,都是在Web服务器本地内存中进行缓存,
现在主流的应用都是分布式系统,这时候这种操作就很鸡肋了。这时候分布式缓存也就应运而生,redis,memcached(http://www.cnblogs.com/zjneter/archive/2007/07/19/822780.html)。总感觉学习的太少啊。。。
C# Cache缓存的应用的更多相关文章
- 注释驱动的 Spring cache 缓存介绍
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Windows Azure Cloud Service (43) 使用Azure In-Role Cache缓存(2)Dedicated Role
<Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...
- [转]注释驱动的 Spring cache 缓存介绍
原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...
- paip.cache 缓存架构以及性能提升总结
paip.cache 缓存架构以及性能提升总结 1 缓存架构以及性能(贯穿读出式(LookThrough) 旁路读出式(LookAside) 写穿式(WriteThrough) 回写式 ...
- Cache缓存对象缓存对象
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoCache.aspx ...
- 注释驱动的 Spring cache 缓存介绍--转载
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- MemCache缓存和C#自带的Cache缓存
1.MemCache: //初始化 static SockIOPool _pool; // 创建Memcached private static MemcachedClient Create(stri ...
- google guava cache缓存基本使用讲解
代码地址:https://github.com/vikde/demo-guava-cache 一.简介 guava cache是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存 ...
- Django学习之十二:Cache 缓存组件
目录 Django Cache 缓存组件 缓存逻辑伪代码 配置缓存源 可配置参数说明 01. Django的默认缓存 02. 基于Redis的django-redis 03. 自定义cache 04. ...
- Nginx 负载均衡的Cache缓存批量清理的操作记录
1)nginx.conf配置 [root@inner-lb01 ~]# cat /data/nginx/conf/nginx.conf user www; worker_processes 8; #e ...
随机推荐
- 微软宣布加入 OpenJDK,打不过就改变 Java 未来!
近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含接下来发生的事情以及微软如何开始将其团队整合到 OpenJDK 社区. 在邮件中,Bruno Borges ...
- IDEA Maven项目 pom.xml 找不到 Dependency 依赖
转载: IDEA Maven项目 pom.xml 找不到 Dependency 依赖 如果你的pom.xml中使用了dependencyManagement管理依赖并且添加了你本地仓库中不存在的依赖可 ...
- 常用的PHP函数封装,有排序和数据库操作函数
//二分查找 function bin_sch($array, $low, $high, $k) { if ($low <= $high) { $mid = intval(($low + $hi ...
- Codeforces6E_Exposition
题意 给定一个序列,求有多少个最长连续子序列满足最大值减最小值之差不超过\(k\). 分析 跟序列最大值最小值有关的可以想到单调栈,先预处理出每个数作为最大值能延伸的区间,然后枚举每个数作为最大值. ...
- [Vue] vue的一些面试题4
1.你知道 nextTick 的原理吗? 用法:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 异步更新队列提到 DOM 的更新是异步执行的,只要 ...
- 用SQL存储过程生成唯一单据号
用SQL存储过程生成唯一单据号 在一些系统中,经理要生成单据号,为了不使多台客户端生成的单据号重复,一般要在服务端生成这种流水号,本文是在数据库中生成流水号,并且可以生成多种类型的单据号(比如 ...
- js数组与对象的区别
数组和对象两者都可以用来表示数据的集合,曾一度搞不清楚”数组”(array)和”对象”(object)的根本区别在哪里. 有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3 ...
- easyui,获取tabs标签页内容,以及刷新datagrid
因为先点开tab页xxx查看表格,再点另一个tab页xxxx修改部分信息,再切换到tab页xxx,tab页xxx里的datagrid表格不会刷新,显示不了修改的信息(在此tab页按F5刷新可以解决,但 ...
- 2019-11-29-win10-uwp-如何开始写-uwp-程序
title author date CreateTime categories win10 uwp 如何开始写 uwp 程序 lindexi 2019-11-29 10:12:42 +0800 201 ...
- linux命令详解——tee
tee 重定向输出到多个文件 在执行Linux命令时,我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令 要注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取. ...