前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年02月 WMS智能仓储系统-004.内存缓存的使用

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

作者头像
愚公搬代码
发布2023-03-16 16:16:46
发布2023-03-16 16:16:46
36000
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

文章目录


前言

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

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

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

一、内存缓存的简单使用

1.安装包

代码语言:javascript
代码运行次数:0
运行
复制
Microsoft.Extensions.Caching.Memory

2.简单使用

1、注入服务

代码语言:javascript
代码运行次数:0
运行
复制
services.AddMemoryCache();

2、控制器中使用

代码语言:javascript
代码运行次数:0
运行
复制
/// <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.注入

代码语言:javascript
代码运行次数:0
运行
复制
#region 添加HttpContext上下文缓存管理类
services.AddSingleton<CacheManager>();
services.AddSingleton<IMemoryCache>(factory =>
{
    var cache = new MemoryCache(new MemoryCacheOptions());
    return cache;
});
#endregion

2.封装类

CacheManager

代码语言:javascript
代码运行次数:0
运行
复制
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.使用

代码语言:javascript
代码运行次数:0
运行
复制
/// <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-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、内存缓存的简单使用
    • 1.安装包
    • 2.简单使用
  • 二、内存缓存的简单封装使用
  • 1.注入
  • 2.封装类
  • 3.使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档