【愚公系列】2023年02月 WMS智能仓储系统-004.内存缓存的使用
导读:文章目录前言一、内存缓存的简单使用1.安装包2.简单使用二、内存缓存的简单封装使用1.注入2.封装类3.使用前言缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术...
文章目录
- 前言
- 一、内存缓存的简单使用
- 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 TaskIActionResult>
GetAsync()
{
string nowTime1 = _cache.Getstring>
("t1");
if (String.IsNullOrEmpty(nowTime1))
{
nowTime1 = DateTime.Now.ToString();
_cache.Set("t1", nowTime1);
}
return Ok();
}
}
二、内存缓存的简单封装使用
1.注入
#region 添加HttpContext上下文缓存管理类
services.AddSingletonCacheManager>
();
services.AddSingletonIMemoryCache>
(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 GetT>
(string key)
{
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T value;
_cache.TryGetValueT>
(key, out value);
return value;
}
/// summary>
/// 设置缓存(无过期时间)
/// /summary>
/// param name="key">
key/param>
/// param name="value">
value/param>
public void Set_NotExpireT>
(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_SlidingExpireT>
(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_AbsoluteExpireT>
(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_SlidingAndAbsoluteExpireT>
(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_ExistT>
(int userID, string type, int expireMinute)
{
var key = $"ModernWMS_{
type}
_{
userID}
";
if (string.IsNullOrWhiteSpace(key))
throw new ArgumentNullException(nameof(key));
T value;
if (_cache.TryGetValueT>
(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 Taskbool>
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 TaskIActionResult>
GetAsync()
{
string nowTime1 = _cache.Getstring>
("t1");
if (String.IsNullOrEmpty(nowTime1))
{
nowTime1 = DateTime.Now.ToString();
_cache.Set_NotExpire("t1", nowTime1);
}
return Ok();
}
}
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 【愚公系列】2023年02月 WMS智能仓储系统-004.内存缓存的使用
本文地址: https://pptw.com/jishu/273.html