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

举报
愚公搬代码 发表于 2023/02/28 22:43:11 2023/02/28
【摘要】 前言缓存(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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。