前言

是迁移以前的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. 1. JVM体系结构

    1. 前言 作为Java工程师 ,jvm对于 java的重要性不言而喻,但是 我们又对jvm了解多少 Java的跨平台性 java发布的口号 "一处编译到处运行 " 依赖于jvm, ...

  2. Acwing第132场周赛

    AcWing 5366. 大小写转换 签到题,可以用stl里面的tolower函数 #include <bits/stdc++.h> #define ls p<<1 #defi ...

  3. 精贴总结 - 万字长文带你入门Istio

    原文 - 万字长文带你入门Istio 一.个人看法 背景:以docker+k8s普及,支持快速部署,通过k8s允许统一管理 解决:1)设计分布式系统,导致开发难度提高:2)统一多语言的服务治理方案 目 ...

  4. vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码

    vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码

  5. WPF之资源

    目录 WPF对象资源的定义和查找 动态.静态使用资源 向程序添加二进制资源 字符串资源 非字符串资源 使用Pack URI路径访问二进制资源 WPF不但支持程序级的传统资源,同时还推出了独具特色的对象 ...

  6. Windows改变终端字体后,终端一片黑 的解决办法

    使用Windows终端的时候总觉得字体不好看,于是乎按照网上的教程改了一下 注册表 计算机\HKEY_CURRENT_USER\Console%SystemRoot%_system32_cmd.exe ...

  7. Nordic芯片调研简析

    一 公司简介: Nordic semiconductor是一家在奥斯证券交易所(OSX:NOD)上市的挪威无晶圆厂半导体公司,专门研究IoT的无线技术.Nordic的声誉建立在领先的技术和开发工具之上 ...

  8. day03-模块化编程

    模块化编程 1.基本介绍 传统的非模块化开发有如下的缺点:(1)命名冲突(2)文件依赖 JavaScript代码越来越庞大,JavaScript引入模块化编程,开发者只需要实现核心的业务逻辑,其他都可 ...

  9. 活动报名|3DCAT实时渲染云行业生态合作系列沙龙之“云XR如何赋能虚拟仿真实验教学”线上活动邀您参会

    当前,虚拟现实发展方兴未艾,"XR+教育"融合发展前景广阔. 3DCAT实时渲染云积极联动教育行业渠道商等生态合作伙伴,合力打造"虚拟现实实验室"." ...

  10. Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] 记录

    jar包冲突 解决: <dependency>     <groupId>org.springframework.cloud</groupId>     <a ...