前言

是迁移以前的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. 使用jenkins连接linux部署jar包

    jenkins安装 首先安装jenkins,我们可以使用docker安装.用下面命令拉取jenkins镜像. docker pull jenkins/jenkins 然后正常安装jenkins容器即可 ...

  2. Failed to instantiate [applets.nature.mapper.LogInfoMapper]: Specified class is an interface-项目启动报错

    一.问题由来 周日下午项目在进行测试时,有些东西需要临时修改,自己已经打好一个包部署到测试服务器进行部署.在测试过程中发现一个问题,就是 现在的代码跑起来是没问题的,只是其他人又的东西还没做,所以暂时 ...

  3. [好文推荐] vue3 源码分析 mini-vue 写的不错

    [阮一峰推荐]学习 vue3 源码的利器 git clone https://github.com/cuixiaorui/mini-vue.git

  4. 在更新数据的时候,显示一个软件源里面没有Release文件

  5. 基于Python的子进程获取键盘输入

    一 概念 众所周知,python中的获取键盘输入,input函数是没办法用在子程序的,这就限制了它的用途.想要在子程序中获取键盘输入.唯有 fn=sys.stdin.fileno函数了. 二 实例解析 ...

  6. 公开的Webservice集锦

    备注:以下所有的来自 互联网,版权归原作者所有 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webx ...

  7. 使用正则表达式提取background:url()中的内容

    开发中经常碰见元素使用background或者background-imgae等样式表提供的属性来展示图片而不是img使用标签,在修改的时候就会发现弊端在需要动态修改图片的时候没有img.src那样顺 ...

  8. AntSK 0.2.1 版本揭秘:动态加载dll,驱动Function Call新境界!

    在.NET的无限宇宙中,动态加载dll似乎一直是操控代码生生不息的魔杖.今天,我将与您探讨如何通过AntSK 0.2.1 版本灵活运用dll,将Function Call的强大功能插拔自如地融入项目之 ...

  9. DialogFragment源码分析

    目录介绍 1.最简单的使用方法 1.1 官方建议 1.2 最简单的使用方法 1.3 DialogFragment做屏幕适配 2.源码分析 2.1 DialogFragment继承Fragment 2. ...

  10. 【Leetcode】53. 最大子数组和

    题目(链接) 给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 子数组是数组中的一个连续部分. 示例 1: 输入:nums = [-2,1,-3, ...