C# 缓存的使用
缓存的实现
我们不是做第三方比如Redis等的缓存实现,而是根据实际情况,基于C#上做一些环境变量的保存,方便项目使用。
1、系统全局变量
很多时候,在系统运行开始,需要对系统的运行参数进行保存,以便供全局使用。
代码如下:
public class PFTCacheObject { /// <summary> /// 字典 /// </summary> private static Dictionary<string, object> _dataDic = new Dictionary<string, object>(); /// <summary> /// 定义一个静态变量来保存类的实例 /// </summary> private static PFTCacheObject _session; /// <summary> /// 定义一个标识确保线程同步 /// </summary> private static readonly object _locker = new object(); /// <summary> /// 单例 /// </summary> /// <returns>返回类型为Session</returns> public static PFTCacheObject Instance { get { if (_session == null) { lock (_locker) { if (_session == null)// 如果类的实例不存在则创建,否则直接返回 { _session = new PFTCacheObject(); } } } return _session; } } #region Remove 移除 /// <summary> /// 删除成员 /// </summary> /// <param name="name"></param> public void Remove(string name) { _dataDic.Remove(name); } /// <summary> /// 删除全部成员 /// </summary> public void RemoveAll() { _dataDic.Clear(); } #endregion #region 本类的索引器 /// <summary> /// 本类的索引器 /// </summary> /// <returns>返回Object成员</returns> public Object this[string index] { get { if (_dataDic.ContainsKey(index)) { Object obj = (Object)_dataDic[index]; return obj; } return null; } set { if (_dataDic.ContainsKey(index)) { _dataDic.Remove(index); } _dataDic.Add(index, value); } } #endregion }
这里使用一个静态变量的Dictionary来进行保存,所有项目均可以直接获取。
2、异步的数据缓存
在web上面,很多时候都是使用的HttpContext.Current.Items进行数据缓存,在.Net Framework框架上使用CallContext.LogicalSetData。在.Net Standard 上面CallContext.LogicalSetData已经不能使用了,替换他的方法是AsyncLocal。因为我们现在都是使用的是.Net Standard,并且我们项目并不仅仅是web,所以这里我们就只用使用AsyncLocal实现。
代码如下
public class PFTCallContext { #region 共享数据库连接 private static AsyncLocal<object> _asyncLocalConnectionOject = new AsyncLocal<object>(); /// <summary> /// 设置共享数据库连接 /// </summary> /// <param name="obj"></param> public static void SetConnectionOject(object obj) { _asyncLocalConnectionOject.Value = obj; } /// <summary> /// 获取共享数据库连接 /// </summary> /// <returns></returns> public static object GetConnectionOject() { return _asyncLocalConnectionOject.Value; } /// <summary> /// 清空共享数据库连接 /// </summary> public static void ClearConnectionOject() { _asyncLocalConnectionOject.Value = null; } #endregion }
这里我们就先定义一个当前数据库连接对象的缓存。如果还需要其他的定义,你可以直接实现。
3、.Net Core 的MemoryCache
本来这块想使用.Net Framework框架中的cache的,但是.Net Core才是未来的大势,而且.Net Framework的cache已经有很多的实现方法了,所以这里我就直接用.Net Core 的MemoryCache。.Net Core蜗牛也在学习中,相关的API也在不断的研究,如果有问题,请大家帮忙纠正。
public static class PFTCache { public readonly static IMemoryCache _memoryCache; static PFTCache() { _memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); } #region 常规缓存 /// <summary> /// 获取缓存的值 /// </summary> /// <param name="key"></param> /// <returns></returns> public static Object GetCache(string key) { return _memoryCache.Get(key); } /// <summary> /// 移除缓存 /// </summary> /// <param name="key"></param> public static void Remove(string key) { _memoryCache.Remove(key); } /// <summary> /// 设置缓存 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public static void SetCache(string key, Object value) { _memoryCache.GetOrCreate(key, entry => { return value; }); } /// <summary> /// 设置缓存(固定时间过期) /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="absoluteExpiration"></param> public static void SetCacheAbsolute(string key, Object value, int absoluteExpiration) { _memoryCache.GetOrCreate(key, entry => { entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(absoluteExpiration)); return value; }); } /// <summary> /// 设置缓存(滚动时间过期) /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="slidingExpiration"></param> public static void SetCacheSliding(string key, Object value, int slidingExpiration) { _memoryCache.GetOrCreate(key, entry => { entry.SetSlidingExpiration(TimeSpan.FromSeconds(slidingExpiration)); return value; }); } #endregion #region 文件依赖缓存 /// <summary> /// 文件依赖缓存 /// </summary> /// <param name="key"></param> /// <param name="fullName"></param> /// <returns></returns> public static string DependentCacheFile(string key, string fullName) { var basePath = PFTFile.GetDirectoryName(fullName); var fileName = PFTFile.GetFileName(fullName); var fileProvider = new PhysicalFileProvider(basePath); return _memoryCache.GetOrCreate(key, entry => { entry.AddExpirationToken(fileProvider.Watch(fileName)); return PFTFile.IsExistFile(fullName) ? PFTFile.ReadFile(fullName) : string.Empty; }); } #endregion }
好了,关于缓存这块蜗牛就先说到这里。
出处:https://www.cnblogs.com/snailblog/p/11570094.html
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/15089595.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2021-08-02 13:59 jack_Meng 阅读(1256) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
2018-08-02 VS调试 ---- 监视窗口、即时窗口、输出窗口
2018-08-02 ESB雏形 -- 项目企业服务总线初始
2018-08-02 Docker—微软微服务
2018-08-02 在单体应用的一些DDD实践经验
2018-08-02 C#常用单元测试框架比较:XUnit, NUnit, 和 Visual Studio(MSTest)
2017-08-02 一道有争议的概率题