【愚公系列】2023年02月 WMS智能仓储系统-004.内存缓存的使用
【摘要】 前言缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。ASP.NET Core 支持多种不同的缓存,最简单的缓存基于IMemoryCache,它表示存储在 Web 服务器内存中的缓存,内存缓存可以存储任何对象,存储形式键值...
前言
缓存(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();
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)