文章目录

  • 前言
  • 一、内存缓存的简单使用
    • 1.安装包
    • 2.简单使用
  • 二、内存缓存的简单封装使用
  • 1.注入
  • 2.封装类
  • 3.使用

前言

缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。

ASP.NET Core 支持多种不同的缓存,最简单的缓存基于IMemoryCache,它表示存储在 Web 服务器内存中的缓存,内存缓存可以存储任何对象,存储形式键值对。

不过服务器停止,缓存内容就会消失,记得缓存不要当成数据库使用,避免重要的数据丢失,引起系统异常。

一、内存缓存的简单使用

1.安装包

Microsoft.Extensions.Caching.Memory

2.简单使用

1、注入服务

services.AddMemoryCache();

2、控制器中使用

/// <summary>
/// Home controller
/// </summary>
[Route("Home")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class HomeController : BaseController
{private IMemoryCache _cache;public HomeController(IMemoryCache memoryCache){_cache = memoryCache;}[HttpGet]public async Task<IActionResult> GetAsync(){string nowTime1 = _cache.Get<string>("t1");if (String.IsNullOrEmpty(nowTime1)){nowTime1 = DateTime.Now.ToString();_cache.Set("t1", nowTime1);}return Ok();}
}

二、内存缓存的简单封装使用

1.注入

#region 添加HttpContext上下文缓存管理类
services.AddSingleton<CacheManager>();
services.AddSingleton<IMemoryCache>(factory =>
{var cache = new MemoryCache(new MemoryCacheOptions());return cache;
});
#endregion

2.封装类

CacheManager

public class CacheManager
{//默认设置静态缓存public static CacheManager Default = new CacheManager();private IMemoryCache _cache = new MemoryCache(new MemoryCacheOptions());public CacheManager(){}/// <summary>/// 获取缓存/// </summary>/// <typeparam name="T">type of value</typeparam>/// <param name="key">key</param>/// <returns></returns>public T Get<T>(string key){if (string.IsNullOrWhiteSpace(key))throw new ArgumentNullException(nameof(key));T value;_cache.TryGetValue<T>(key, out value);return value;}/// <summary>/// 设置缓存(无过期时间)/// </summary>/// <param name="key">key</param>/// <param name="value">value</param>public void Set_NotExpire<T>(string key, T value){if (string.IsNullOrWhiteSpace(key))throw new ArgumentNullException(nameof(key));T v;if (_cache.TryGetValue(key, out v))_cache.Remove(key);_cache.Set(key, value);}/// <summary>/// 设置滑动过期时间/// </summary>/// <param name="key">key</param>/// <param name="value">value</param>public void Set_SlidingExpire<T>(string key, T value, TimeSpan span){if (string.IsNullOrWhiteSpace(key))throw new ArgumentNullException(nameof(key));T v;if (_cache.TryGetValue(key, out v))_cache.Remove(key);_cache.Set(key, value, new MemoryCacheEntryOptions(){SlidingExpiration = span});}/// <summary>/// 设置绝对过期时间/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <param name="value"></param>/// <param name="span"></param>/// <exception cref="ArgumentNullException"></exception>public void Set_AbsoluteExpire<T>(string key, T value, TimeSpan span){if (string.IsNullOrWhiteSpace(key))throw new ArgumentNullException(nameof(key));T v;if (_cache.TryGetValue(key, out v))_cache.Remove(key);_cache.Set(key, value, span);}/// <summary>/// 设置滑动过期时间和绝对过期时间(缓存因为滑动时间访问自动续期)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <param name="value"></param>/// <param name="slidingSpan"></param>/// <param name="absoluteSpan"></param>/// <exception cref="ArgumentNullException"></exception>public void Set_SlidingAndAbsoluteExpire<T>(string key, T value, TimeSpan slidingSpan, TimeSpan absoluteSpan){if (string.IsNullOrWhiteSpace(key))throw new ArgumentNullException(nameof(key));T v;if (_cache.TryGetValue(key, out v))_cache.Remove(key);_cache.Set(key, value, new MemoryCacheEntryOptions(){SlidingExpiration = slidingSpan,AbsoluteExpiration = DateTimeOffset.Now.AddMilliseconds(absoluteSpan.TotalMilliseconds)});}/// <summary>/// 通过key移除缓存/// </summary> /// <param name="key">key</param>public void Remove(string key){if (string.IsNullOrWhiteSpace(key))throw new ArgumentNullException(nameof(key));_cache.Remove(key);}/// <summary>/// 销毁/// </summary>public void Dispose(){if (_cache != null)_cache.Dispose();GC.SuppressFinalize(this);}#region TokenHelper/// <summary>/// 判断Token是否存在/// </summary>/// <typeparam name="T"></typeparam>/// <param name="userID"></param>/// <param name="type"></param>/// <param name="expireMinute"></param>/// <returns></returns>/// <exception cref="ArgumentNullException"></exception>public bool Is_Token_Exist<T>(int userID, string type, int expireMinute){var  key = $"ModernWMS_{type}_{userID}";if (string.IsNullOrWhiteSpace(key))throw new ArgumentNullException(nameof(key));T value;if (_cache.TryGetValue<T>(key, out value)){Set_SlidingExpire(key, value,  TimeSpan.FromMinutes(expireMinute) );return true;}return false;}/// <summary>/// Token设置/// </summary>/// <param name="userID"></param>/// <param name="type"></param>/// <param name="token"></param>/// <param name="expireMinute"></param>/// <returns></returns>public async Task<bool> TokenSet(int userID, string type, string token, int expireMinute){string key = $"ModernWMS_{type}_{userID}";try{Set_AbsoluteExpire(key, token, TimeSpan.FromMinutes(expireMinute));}catch{return false;}return true;}#endregion
}

3.使用

/// <summary>
/// Home controller
/// </summary>
[Route("Home")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class HomeController : BaseController
{private CacheManager _cache;public HomeController(CacheManager memoryCache){_cache = memoryCache;}[HttpGet]public async Task<IActionResult> GetAsync(){string nowTime1 = _cache.Get<string>("t1");if (String.IsNullOrEmpty(nowTime1)){nowTime1 = DateTime.Now.ToString();_cache.Set_NotExpire("t1", nowTime1);}return Ok();}
}

【愚公系列】2023年02月 WMS智能仓储系统-004.内存缓存的使用相关推荐

  1. 【愚公系列】2023年02月 WMS智能仓储系统-011.数据库文档设计

    文章目录 前言 一.数据库文档设计 1.chm版本 2.PDF版本 3.html版本 二.数据库表目录 表结构 __EFMigrationsHistory asn asnsort category c ...

  2. 【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)

    文章目录 前言 一.收获管理和发货管理 1.收获管理 1.1 页面代码 1.2 接口代码 2.发货管理 1.1 页面代码 1.2 接口代码 前言 WMS智能仓储收货管理和发货管理是非常重要的两个功能 ...

  3. 【愚公系列】2023年02月 WMS智能仓储系统-007.Swagger接口文档的配置

    文章目录 前言 一.Swagger接口文档的配置 1.安装包 2.注入 2.1 Swagger服务的注入 2.2 appsetting.json的配置 2.3 Swagger服务的封装 2.3.1 S ...

  4. 【愚公系列】2023年02月 WMS智能仓储系统-017.仓内作业(库存冻结、库存调整、库存盘点)

    文章目录 前言 一.仓内作业 1.库存冻结 1.1 页面代码 1.2 接口代码 2.库存调整 2.1 页面代码 2.2 接口代码 3.库存盘点 3.1 页面代码 3.2 接口代码 前言 这节主要分为两 ...

  5. 【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)

    文章目录 前言 一.库存管理 1.1 页面代码 1.2 接口代码 二.仓内作业 1.仓内加工 1.1 页面代码 1.2 接口代码 2.库存移动 2.1 页面代码 2.2 接口代码 前言 这节主要分为两 ...

  6. 【愚公系列】2023年02月 WMS智能仓储系统-010.全局过滤、中间件、格式化配置

    文章目录 前言 一.全局过滤 1.全局行为过滤的概念 2.全局行为过滤的注册方式 2.1 方法注册 2.2 控制器注册 2.3 全局注册 2.4 TypeFilter 和 ServiceFilter ...

  7. 【愚公系列】2023年02月 WMS智能仓储系统-001.NLog日志的使用

    文章目录 前言 一.NLog日志的使用 1.安装包 2.配置文件nlog.config 3.使用 前言 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...

  8. 【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现

    文章目录 前言 1.业务流程说明 2.登录业务的相关技术点 3.登录-token原理分析 4.前端框架设计 一.登录功能的实现 1.登录页面设计 2.登录逻辑功能实现 2.1 登录逻辑页面 2.2 接 ...

  9. 【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)

    文章目录 前言 一.基础设置 1.货主信息 1.1 页面代码 1.2 接口代码 2.运费设置 2.1 页面代码 2.2 接口代码 3.客户信息 3.1 页面代码 3.2 接口代码 前言 基础设置主要分 ...

最新文章

  1. Shell练习(七)
  2. python 命令行参数-python中命令行参数
  3. 数十家公司超10亿数据外泄,2019年数据安全不再“纸上谈兵”
  4. 技巧速看!如何帮助“表哥”快速玩转报告美化?
  5. PowerBI随笔(7)-lookupvalue、divide
  6. 华为云GaussDB,11.11让企业无后顾之忧
  7. 百度北京一面2016-3-18
  8. C++ primer第六章6.6函数匹配
  9. -bash: make: command not found
  10. 笔记 - 收藏集 - 掘金
  11. 14-STM32F1 iic 24c02
  12. 基于STM32的串口通信详解
  13. eclipse SVN javaHL not available 问题解决
  14. JAVA中ResourceBundle使用详解(一)
  15. 网上邻居搜索到计算机无法打开,网上邻居无法访问您可能没有权限使用网络资源...
  16. 电脑知识:DOS命令使用
  17. 【ES系列五】——集群搭建(多机集群单机多节点集群)
  18. 内存管理-之启动-基于linux3.10
  19. openwrt路由器挂载sdcard为overlay
  20. java(jsp技术)

热门文章

  1. LeetCode 297. 二叉树的序列化与反序列化
  2. 目标检测系列之 -- ACF算法
  3. 【力扣刷题】只出现一次的数字
  4. C++ tcpip网络编程中listen函数和accept函数详解和区别
  5. POJ1679 The Unique MST
  6. MATLAB等高线的绘制(海科绘图part1)
  7. win11策略服务未运行怎么解决?策略服务未运行的解决方法
  8. 远程FPGA虚拟实验平台用SystemVerilog HDL实现七段译码器
  9. 图灵在计算机发展的贡献,图灵在在计算机发展史上的主要贡献有哪些?
  10. 18.05.14 递归作业