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 ...
随机推荐
- 一些常用的字符串函数(CLR函数)
原代码来自:东莞--小小大神 使用 --聚合函数 SELECT father_key,dbo.String_Agg(department_name) FROM dbo.b_department GRO ...
- TCP listener
调试时未关闭之前开启的TCP SERVER: 应该关闭: TcpListener TcpClient 1.开启TCP listener (1)Start()方法失败 异常位置:该异常的产生位置为 tc ...
- springboot2.0国际化
springboot2.0配合thymeleaf实现页面国际化 1. 引入thymeleaf <?xml version="1.0" encoding="UTF-8 ...
- PythonDay16
第十六章模块 今日内容 自定义模块 time模块 datetime模块 rendom模块 自定义模块 # import 模块 例:import time# 导入的是time模块中所有的内容(变量,函数 ...
- vscode学习(二)之显示中文异常解决办法
异常原因:VSCODE默认是UTF-8编码打开文件的.如果遇到了像GB18030 GBK等等的编码,就显示乱码了. 解决办法: 在设置文件中加入:"files.autoGuessEncodi ...
- Vue2 & ElementUI实现管理后台之input获得焦点
Vue.directive('focus', function (el, option) { var defClass = 'el-input', defTag = 'input'; var valu ...
- 修改MIGO或者ML81N产生的会计凭证项目文本增强
在程序:MM07MFF9_F_BELEG_ERGAENZEN下做隐式增强
- python 实现屏幕录制
用python实现屏幕录制 PIL 即pollow 的安装命令如下: pip install pillow 其中cv2的安装是下面这条命令 pip install opencv-python 代码实现 ...
- Redox OS 发布 0.5 版
Redox OS 是一个几乎完全以 Rust 语言编写的通用操作系统及周围生态(例如文件系统.显示服务器及 Rust 版本的 libc).其遵循微内核架构,在一定程度上兼容于 POSIX. 该项目于日 ...
- 微软宣布全新命令行+脚本工具:PowerShell 7
DOS 逐渐退出历史舞台后,Windows 一直内置着 CMD 命令行工具,并在 Windows 7 时代升级为更强悍的 PowerShell,不仅可以执行命令行,更可以执行各种高级脚本,还能跨平台. ...