前言

是迁移以前的blog。

关于c# 缓存在web应用中的一个引导,能够建立起一个缓存的基本思路。

System.Web.Caching

这个真的是老生常谈了,我们只需要key和iv,然后我们就可以进行缓存了,非常的简单。

public List<ReRank> GetBoZhuRank(int category)
{
return CacheHelper.TryGet("GetBoZhuRank" + category, () =>
{
try
{
return new BLL.CastRoomApi(webEntity).GetCastRoomRankList(category).Data; //调用接口获取数据
}
catch (Exception ex)
{
LogUtlilty.WriteLog(string.Format("错误:{0}", ex.Message), LogUtlilty.Level.ERROR);
}
return new List<ReRank>();
}, DateTime.Now.AddMinutes(2), new List<ReRank>()); //缓存2分钟
}

下面我把这个帮助类也贴一下。

using System;
using System.Web;
using System.Collections; namespace LiveCast.Web.Common.Utility
{
public class CacheHelper
{
/// <summary>
/// 获取数据缓存
/// </summary>
/// <param name="CacheKey">键</param>
public static object GetCache(string CacheKey)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
return objCache[CacheKey];
} /// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject);
} /// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject, TimeSpan Timeout)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject, null, DateTime.MaxValue, Timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
} /// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
} /// <summary>
/// 移除指定数据缓存
/// </summary>
public static void RemoveAllCache(string CacheKey)
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
_cache.Remove(CacheKey);
} /// <summary>
/// 移除全部缓存
/// </summary>
public static void RemoveAllCache()
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
_cache.Remove(CacheEnum.Key.ToString());
}
} public static object Get(string key, Func<object> getValueFunc, DateTime absoluteExpiration)
{
var val = GetCache(key);
if (val == null)
{
val = getValueFunc();
if (val != null)
{
SetCache(key, val, absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
}
}
return val;
} public static TResult TryGet<TResult>(string key, Func<TResult> getValueFunc, DateTime absoluteExpiration, TResult defaultVal)
{
TResult result;
try
{
var val = Get(key, () => getValueFunc(), absoluteExpiration);
if (val == null)
{
val = defaultVal;
}
result = (TResult)val;
}
catch (Exception ex)
{
result = defaultVal;
LogUtlilty.WriteLog(string.Format("Cache中异常:{0}", ex.Message), LogUtlilty.Level.ERROR);
}
return result;
} }
}

但是呢,我们可能会依赖于一些配置文件,姑且就这么说吧。

static void Main(string[] args)
{
//1.简单缓存,value可以是任何类型
HttpRuntime.Cache.Insert("mykey", "myvalue");
Console.WriteLine($"Key为mykey的缓存:{HttpRuntime.Cache["mykey"]}");
//2.使用缓存依赖项
string path = Path.Combine(Environment.CurrentDirectory, @"someCacheData.xml");
DataSet ds = new DataSet();
ds.ReadXml(path);
var cdy = new CacheDependency(path);
if (HttpRuntime.Cache.Get("myxml") == null)
{
//Dataset添加到缓存
System.Web.HttpRuntime.Cache.Insert("myxml", ds, cdy);
}
//从缓存中获取Dataset
for (var i = 1; i < 100; i++)
{
if (cdy.HasChanged)
{
System.Web.HttpRuntime.Cache.Insert("myxml", ds, cdy);
}
if (HttpRuntime.Cache.Get("myxml") == null)
{
DataSet ds1 = new DataSet();
ds1.ReadXml(path);
//Dataset添加到缓存
cdy = new CacheDependency(path);
System.Web.HttpRuntime.Cache.Insert("myxml", ds1, cdy);
}
DataSet resultDs = (DataSet)HttpRuntime.Cache.Get("myxml"); Console.WriteLine($"food下的f1节点:{resultDs.Tables["food"].Rows[0]["f1"]}"); Thread.Sleep(1000);
}
Console.ReadKey();
}

这其中的关键点在于CacheDependency,这个将会监听文件是否修改,如果修改那么缓存将会被清空,然后如果我们判断为空的时候,那么就重新加载配置。

注意当cdy.HasChanged 为true的时候,System.Web.HttpRuntime.Cache.Insert("myxml", ds1, cdy);是不会进行缓存的,你需要重新实例化一个对象。

system.runtime.cache

这东西更为强大,可以做一些回调,设置优先级。

static void Main(string[] args)
{
//缓存的配置
CacheItemPolicy policy = new CacheItemPolicy()
{
//缓存被删除是的回调
RemovedCallback = (arguments) => { Console.WriteLine($"缓存被移除的原因:{arguments.RemovedReason}"); },
//滑动过期时间
SlidingExpiration = TimeSpan.FromSeconds(5),
//绝对过期时间
//AbsoluteExpiration = DateTime.Now.AddSeconds(5),
//优先级有两种:Default,NotRemovable(不可移除)
Priority = System.Runtime.Caching.CacheItemPriority.NotRemovable
}; //添加缓存,key为mykey,值是myvalue ,
System.Runtime.Caching.MemoryCache.Default.Add("mykey", "myvalue", policy);
Console.WriteLine(MemoryCache.Default.Get("mykey"));
Thread.Sleep(6000);
Console.WriteLine(MemoryCache.Default.Get("mykey"));
Console.ReadKey();
}

redis等其他内存数据库缓存

请参考我的单独的redis 缓存系列,过于庞大。

c# .net缓存(旧)的更多相关文章

  1. 浏览器缓存旧的js文件或css文件导致没出现预期效果

    最好在加载的js或css文件后加上 ?v=1.0.0 版本号,更新js后就更改一下版本号即可

  2. 妙用缓存调用链实现JS方法的重载

    来自于我的博客http://sweets.cf/,转载注明出处 1.什么是方法重载 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数. 简而言之就是:方法重载就 ...

  3. 用分布式缓存提升ASP.NET Core性能

    得益于纯净.轻量化并且跨平台支持的特性,ASP.NET Core作为热门Web应用开发框架,其高性能传输和负载均衡的支持已广受青睐.实际上,10-20台Web服务器还是轻松驾驭的.有了多服务器负载的支 ...

  4. 缓存技术内部交流_03_Cache Aside

    参考资料: http://www.ehcache.org/documentation/3.2/caching-patterns.html http://www.ehcache.org/document ...

  5. redis缓存介绍以及常见问题浅析

    # 没缓存的日子: 对于web来说,是用户量和访问量支持项目技术的更迭和前进.随着服务用户提升.可能会出现一下的一些状况: 页面并发量和访问量并不多,mysql足以支撑自己逻辑业务的发展.那么其实可以 ...

  6. 腾讯云Redis混合存储版重磅推出,万字长文助你破解缓存难题!

    导语 | 缓存+存储的系统架构是目前常见的系统架构,缓存层负责加速访问,存储层负责存储数据.这样的架构需要业务层或者是中间件去实现缓存和存储的双写.冷热数据的交换,同时还面临着缓存失效.缓存刷脏.数据 ...

  7. ABP文档 - 嵌入的资源文件

    文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的 ...

  8. sqlite原子提交原理

    英文地址 文章参考 简介 支持事务的数据库系统如sqlite的一个重要特性是原子提交(atomic commit).也就是在一个事务中进行的对数据库的写操作要么全部执行,要么全部不执行.看起来像是对数 ...

  9. 如何使用 Zend Expressive 建立 NASA 图片库?

    在本文中,我们将借助 NASA 天文图库 API,使用 Zend Expressive 建立图片库.最后的结果将显示在 AstroSplash 网站,该网站是为了文本特意搭建的.本文系 OneAPM ...

  10. Apple Watch开发了一些细节和总结

    本文旨在总结最近Watch在发展中遇到的问题和细节 1.左右Watch真机调试问题 一般的情况下,你为IOS主应用创建了一个extention,比方说Today Extension .Xcode都会自 ...

随机推荐

  1. 从0开始入门智能知识库和星火大模型,打造AI客服。

    介绍FastWiki FastWiki是一个高性能.基于最新技术栈的知识库系统,旨在为大规模信息检索和智能搜索提供解决方案.它采用微软Semantic Kernel进行深度学习和自然语言处理,在后端使 ...

  2. FeignClient 报错: A bean with that name has already been defined and overriding is disabled.

    1. 错误信息 *************************** APPLICATION FAILED TO START *************************** Descript ...

  3. Java 常用类 String的常用方法(3)

    1 /** 2 * String常用方法3 3 * 替换: 4 * String replace(char oldChar,char newChar): 返回一个新的字符串,它是通过 5 * 用new ...

  4. C++左值右值完美转发转移

    左值(Lvalue)与右值(Rvalue) 英文含义: 左值(Lvalue):Locator value,意味着它指向一个具体的内存位置. 右值(Rvalue):Read value,指的是可以读取的 ...

  5. JS5-PC端网页特效

    常见offset系列属性作用 常见client系列属性作用 常见scroll系列属性作用 封装简单动画函数 写出网页轮播图案例 offset 偏移量,使用offset相关属性可以动态的得到该元素的位置 ...

  6. Python实现企业微信自动打卡程序二:跳过节假日,随机打卡时间,定时任务,失败通知

    一.介绍 在上节 Python实现企业微信上下班自动打卡程序内容之后,我们继续优化自动打卡程序.接下来增加如下内容: 实现打卡时间随机范围 处理节假日不打卡的情况 实现定时调度打卡 打卡成功或失败通知 ...

  7. vim技巧--提取文本与文本替换

    前几天遇到一个使用情景,需要从一个包含各个读取代码文件路径及名字的文件中把文件路径提取出来,做一个filelist,这里用到了文本的提取和替换,这里做个小总结记录一下. 从网上找了一个作者写的代码用来 ...

  8. Template String Converter - 字符串中加变量 自动将单引号变换 - vscode插件

    Template String Converter - 字符串中加变量 自动将单引号变换 - vscode插件

  9. Linux Char-Driver (字符驱动 摘要)(一)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. vmware虚拟机共享文件夹显示不出来的解决办法

    今天在虚拟机里部署测试环境时,遇到一个问题,就是在vmware设置里明明共享了文件夹,但是在CentOS里却看不到共享的文件夹 环境 宿主机:MacBook Pro 虚拟机:vmware 15 虚拟机 ...