CSharp_DistributedCache_Simple

一、WinForm版(System.Runtime.Caching)

1、MemoryCache示例

C#-缓存(一)_内存缓存MemoryCache_缓存

2、引用Negut包

C#-缓存(一)_内存缓存MemoryCache_数据_02

3、MemoryCacheHelper

查看代码

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:MemoryCache帮助类(使用示例)
*│ 作    者:执笔小白
*│ 版    本:1.0
*│ 创建时间:2023-7-17 22:02:56
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: Util.MemoryCacheDome
*│ 类    名:MemoryCacheHelper
*└──────────────────────────────────────────────────────────────┘
*/
using System.Runtime.Caching;
using System.Collections.Specialized;

namespace Util.MemoryCacheDome
{
    /// <summary>
    /// MemoryCache帮助类(使用示例)
    /// </summary>
    public static class MemoryCacheHelper : object
    {
        /// <summary>
        /// 对象
        /// </summary>
        private static MemoryCache _cache;

        #region 创建与销毁MemoryCache
        /// <summary>
        /// 创建新MemoryCache-使用默认配置项
        /// 程序退出后缓存会被清空
        /// </summary>
        /// <param name="name">MemoryCache名称</param>
        /// <param name="config">值集合</param>
        /// <param name="ignoreConfigSection">忽略配置Section</param>
        /// <returns></returns>
        public static MemoryCache CreateMemoryCache()
        {
            _cache = MemoryCache.Default;  //声明缓存类
            return _cache;
        }

        /// <summary>
        /// 创建新MemoryCache-通过配置项
        /// </summary>
        /// <param name="name">MemoryCache名称</param>
        /// <param name="config">值集合</param>
        /// <param name="ignoreConfigSection">忽略配置Section</param>
        /// <returns></returns>
        public static MemoryCache NewMemoryCache(string name, NameValueCollection config, bool ignoreConfigSection) => _cache = new MemoryCache(name, config, ignoreConfigSection);

        /// <summary>
        /// 创建一个 CacheEntryChangeMonitor 对象,响应指定缓存项的更改事件
        /// </summary>
        /// <param name="keys">需要响应的缓存项的枚举</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(IEnumerable<string> keys, string regionName = null) => _cache.CreateCacheEntryChangeMonitor(keys, regionName);

        /// <summary>
        /// 销毁MemoryCache
        /// </summary>
        public static void Dispose() => _cache.Dispose();

        /// <summary>
        /// 从缓存对象中移除指定百分比的缓存项
        /// </summary>
        /// <param name="percent"></param>
        /// <returns></returns>
        public static long Trim(int percent) => _cache.Trim(percent);
        #endregion 创建与销毁MemoryCache

        #region 获取MemoryCache配置
        /// <summary>
        /// 获取计算机上缓存可使用的内存量(以字节为单位)
        /// </summary>
        public static long CacheMemoryLimit => _cache.CacheMemoryLimit;
        /// <summary>
        /// 获取计算机上缓存可使用的物理内存的百分比
        /// </summary>
        public static long PhysicalMemoryLimit => _cache.PhysicalMemoryLimit;

        /// <summary>
        /// 获取缓存提供的功能的说明
        /// </summary>
        public static DefaultCacheCapabilities DefaultCacheCapabilities => _cache.DefaultCacheCapabilities;

        /// <summary>
        /// 获取在缓存更新其内存统计信息之前需等待的最大时间量
        /// </summary>
        public static TimeSpan PollingInterval => _cache.PollingInterval;

        /// <summary>
        /// 获取缓存的名称
        /// </summary>
        public static string Name => _cache.Name;
        #endregion 获取MemoryCache配置

        #region 存、取、删除值,检查是否存在值
        /// <summary>
        /// 确定缓存中是否存在某个缓存项
        /// </summary>
        /// <param name="key">要搜索的缓存项的唯一标识符</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static bool Contains(string key, string regionName = null) => _cache.Contains(key, regionName);

        #region 存值-复写原值
        /// <summary>
        /// 使用键和值将某个缓存项插入缓存中,并指定过期时间
        /// </summary>
        /// <param name="key">要插入的缓存项的唯一标识符</param>
        /// <param name="value">该缓存项的数据</param>
        /// <param name="absoluteExpiration">缓存项的固定的过期日期和时间</param>
        /// <param name="regionName">某个缓存集合</param>
        public static void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null) => _cache.Set(key, value, absoluteExpiration, regionName);

        /// <summary>
        /// 使用键和值将某个缓存项插入缓存中,并指定逐出选项(代替过期时间)
        /// </summary>
        /// <param name="key">要插入的缓存项的唯一标识符</param>
        /// <param name="value">该缓存项的数据</param>
        /// <param name="policy">一个包含该缓存项的逐出详细信息的对象。 此对象提供比简单绝对过期更多的逐出选项</param>
        /// <param name="regionName">某个缓存集合</param>
        public static void Set(string key, object value, CacheItemPolicy policy, string regionName = null)
        {
            //CacheItemPolicy policy = new CacheItemPolicy();  //这个对象可以设置这个缓存的过期时间,和关联对象等等等。
            //policy.AbsoluteExpiration = DateTime.Now.AddMinutes(30);  //设置过期时间是当前时间+30分钟,那么30分钟后,这个缓存的项就会被移除
            _cache.Set(key, value, policy, regionName);
        }

        /// <summary>
        /// 使用 CacheItem 实例将某个缓存项插入缓存中,并指定逐出选项(代替过期时间)
        /// </summary>
        /// <param name="item">表示要插入的缓存项的对象</param>
        /// <param name="policy">一个包含该缓存项的逐出详细信息的对象。 此对象提供比简单绝对过期更多的逐出选项。</param>
        public static void Set(CacheItem item, CacheItemPolicy policy) => _cache.Set(item, policy);
        #endregion 存值-复写原值

        #region 存值-只新增,不复写原值
        /// <summary>
        /// 使用键和值将某个缓存项插入缓存中_不复写原值,并指定过期时间
        /// </summary>
        /// <param name="key">要插入的缓存项的唯一标识符</param>
        /// <param name="value">该缓存项的数据</param>
        /// <param name="absoluteExpiration">缓存项的固定的过期日期和时间</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns>如果插入成功,则为 true;如果缓存中已存在具有与 key 相同的键的项,则为 false。</returns>
        public static void Add(string key, object value, DateTimeOffset absoluteExpiration, string regionName = default) => _cache.Add(key, value, absoluteExpiration, regionName);

        /// <summary>
        /// 使用键和值将某个缓存项插入缓存中_不复写原值,并指定逐出选项(代替过期时间)
        /// </summary>
        /// <param name="key">要插入的缓存项的唯一标识符</param>
        /// <param name="value">该缓存项的数据</param>
        /// <param name="policy">一个包含该缓存项的逐出详细信息的对象。 此对象提供比简单绝对过期更多的逐出选项</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns>如果插入成功,则为 true;如果缓存中已存在具有与 key 相同的键的项,则为 false。</returns>
        public static void Add(string key, object value, CacheItemPolicy policy, string regionName = null) => _cache.Add(key, value, policy, regionName);

        /// <summary>
        /// 使用 CacheItem 实例将某个缓存项插入缓存中_不复写原值,并指定逐出选项(代替过期时间)
        /// </summary>
        /// <param name="item">表示要插入的缓存项的对象</param>
        /// <param name="policy">一个包含该缓存项的逐出详细信息的对象。 此对象提供比简单绝对过期更多的逐出选项。</param>
        /// <returns>如果插入成功,则为 true;如果缓存中已存在具有与 key 相同的键的项,则为 false。</returns>
        public static bool Add(CacheItem item, CacheItemPolicy policy) => _cache.Add(item, policy);

        /// <summary>
        /// 使用键和值将某个缓存项插入缓存中_不复写原值,并指定过期时间
        /// </summary>
        /// <param name="key">要插入的缓存项的唯一标识符</param>
        /// <param name="value">该缓存项的数据</param>
        /// <param name="absoluteExpiration">缓存项的固定的过期日期和时间</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns>如果存在具有相同键的缓存项,则为现有的缓存项;否则为 null</returns>
        public static object AddOrGetExisting(string key, object value, DateTimeOffset absoluteExpiration, string regionName = default) => _cache.AddOrGetExisting(key, value, absoluteExpiration, regionName);

        /// <summary>
        /// 使用键和值将某个缓存项插入缓存中_不复写原值,并指定逐出选项(代替过期时间)
        /// </summary>
        /// <param name="key">要插入的缓存项的唯一标识符</param>
        /// <param name="value">该缓存项的数据</param>
        /// <param name="policy">一个包含该缓存项的逐出详细信息的对象。 此对象提供比简单绝对过期更多的逐出选项</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns>如果存在具有相同键的缓存项,则为现有的缓存项;否则为 null</returns>
        public static object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = default) => _cache.AddOrGetExisting(key, value, policy, regionName);

        /// <summary>
        /// 使用 CacheItem 实例将某个缓存项插入缓存中_不复写原值,并指定逐出选项(代替过期时间)
        /// </summary>
        /// <param name="item">表示要插入的缓存项的对象</param>
        /// <param name="policy">一个包含该缓存项的逐出详细信息的对象。 此对象提供比简单绝对过期更多的逐出选项。</param>
        /// <returns>如果存在具有相同键的缓存项,则为现有的缓存项;否则为 null</returns>
        public static CacheItem AddOrGetExisting(CacheItem item, CacheItemPolicy policy) => _cache.AddOrGetExisting(item, policy);
        #endregion 存值-只新增,不复写原值

        #region 取值
        /// <summary>
        /// 返回某个缓存中的缓存项总数
        /// </summary>
        /// <param name=""></param>
        /// <returns></returns>
        public static long GetCount(string regionName = default) => _cache.GetCount(regionName);

        /// <summary>
        /// 获取某个缓存已使用的内存量(以字节为单位)
        /// </summary>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static long GetLastSize(string regionName = default) => _cache.GetLastSize(regionName);

        /// <summary>
        /// 从缓存中读取某缓存项
        /// </summary>
        /// <param name="key">要获取的缓存项的唯一标识符</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static object Get(string key, string regionName = default) => _cache.Get(key, regionName);

        /// <summary>
        /// 从缓存中读取某缓存项_返回CacheItem
        /// </summary>
        /// <param name="key">要获取的缓存项的唯一标识符</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static CacheItem GetCacheItem(string key, string regionName = default) => _cache.GetCacheItem(key, regionName);

        /// <summary>
        /// 获取与指定的键对应的一组缓存项
        /// </summary>
        /// <param name="keys">要获取的缓存项的唯一标识符</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static IDictionary<string, object> GetValues(IEnumerable<string> keys, string regionName = default) => _cache.GetValues(keys, regionName);

        /// <summary>
        /// 获取与指定的键对应的一组缓存项
        /// </summary>
        /// <param name="regionName">某个缓存集合</param>
        /// <param name="keys">要获取的缓存项的唯一标识符</param>
        /// <returns></returns>
        public static IDictionary<string, object> GetValues(string regionName, params string[] keys) => _cache.GetValues(regionName, keys);
        #endregion 取值

        #region 删除
        /// <summary>
        /// 从缓存中移除某个缓存项
        /// </summary>
        /// <param name="key">要搜索的缓存项的唯一标识符</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static object Remove(string key, string regionName = null) => _cache.Remove(key, regionName);

        /// <summary>
        /// 使用原因从缓存中删除缓存项
        /// </summary>
        /// <param name="key">要移除的缓存项的唯一标识符</param>
        /// <param name="reason">删除项的原因</param>
        /// <param name="regionName">某个缓存集合</param>
        /// <returns></returns>
        public static object Remove(string key, CacheEntryRemovedReason reason, string regionName = null) => Remove(key, reason, regionName);
        #endregion 删除
        #endregion 存、取、删除值,检查是否存在值
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251.
  • 252.
  • 253.
  • 254.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.

二、Web应用Net7版(框架内置)

1、MemoryCache示例

 

C#-缓存(一)_内存缓存MemoryCache_缓存_03

2、引用Negut包

using Microsoft.Extensions.Caching.Memory;  // WebAPI框架自带
  • 1.

3、MemoryCache使用教程

(1)添加中间件(Program.cs)

  使用builder.Services.AddMemoryCache();进行添加

public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            builder.Services.AddMemoryCache(options =>  // 1、添加内存缓存中间件(一般用于粘性会话或单机缓存)
            {
                options.SizeLimit = 100;                                    // 缓存的最大大小为100份
                options.ExpirationScanFrequency = TimeSpan.FromSeconds(2);  // 两秒钟查找一次过期项
                options.CompactionPercentage = 0.2;                         // 缓存满了时候压缩20%的优先级较低的数据
                options.TrackStatistics = false;          // 设置是否跟踪内存缓存统计信息。 默认已禁用
                options.TrackLinkedCacheEntries = false;  // 设置是否跟踪链接条目。 默认已禁用
            });

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseAuthorization();

            app.MapControllers();

            app.Run();
        }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
(2)Controller 控制器中使用(MemoryCacheController.cs)
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:MemoryCache WebAPI使用示例
*│ 作    者:执笔小白
*│ 版    本:1.0
*│ 创建时间:2023-7-20 19:02:56
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: MemoryCache_WebAPI.Controllers
*│ 类    名:MemoryCacheController
*└──────────────────────────────────────────────────────────────┘
*/
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;

namespace MemoryCache_WebAPI.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class MemoryCacheController : ControllerBase
    {
        #region 变量
        /// <summary>
        /// 日志
        /// </summary>
        private readonly ILogger<MemoryCacheController> _logger;

        /// <summary>
        /// 内存缓存
        /// </summary>
        private readonly IMemoryCache _memoryCache;

        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };
        #endregion 变量

        /// <summary>
        /// 
        /// </summary>
        public MemoryCacheController(ILogger<MemoryCacheController> logger, IMemoryCache memoryCache)
        {
            _logger = logger;
            _memoryCache = memoryCache;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            #region 内存缓存 MemoryCache使用示例

            #region 存值
            string key1 = "myKey1",value1 = "Hello, World!1",
                key2 = "myKey2",value2 = "Hello, World!2",
                key3 = "myKey3",value3 = "Hello, World!3";

            //方式一自定义规则:
            MemoryCacheEntryOptions memoryCacheEntryOptions = new MemoryCacheEntryOptions()
                .SetAbsoluteExpiration(TimeSpan.FromMinutes(1))  // 设置一分钟后过期被清除-相对时间
                .SetSlidingExpiration(TimeSpan.FromMinutes(1))   // 设置滑动过期时间;一分钟没有访问则清除
                .SetSize(100)                                    // 设置最大缓存项数量为100份
                .SetPriority(CacheItemPriority.Normal);          // 设置优先级为Normal
            memoryCacheEntryOptions.RegisterPostEvictionCallback((keyInfo, valueInfo, reason, state) =>  // 缓存项过期被清除时的回调方法
            {
                Console.WriteLine($"回调函数输出【键:{keyInfo},值:{valueInfo},被清除;原因:{reason}】");
            });

            _memoryCache.Set(key1, value1, memoryCacheEntryOptions);

            //方式二-相对时间_TimeSpan:
            _memoryCache.Set(key2, value2, TimeSpan.FromMinutes(1));  // 设置一分钟后过期

            //方式三-绝对时间_DateTimeOffset:
            DateTimeOffset dateTimeOffset = new DateTimeOffset().AddMinutes(1);  // 设置一分钟后过期
            _memoryCache.Set(key3, value3, dateTimeOffset);
            #endregion 存值

            #region 取值
            string retrievedValue = _memoryCache.Get<string>(key1) ?? string.Empty;
            #endregion 取值

            #region 检查值是否存在
            bool isExist = _memoryCache.TryGetValue(key2, out string cache);
            #endregion 检查值是否存在

            #region 删除值
            _memoryCache.Remove(key3);
            #endregion 删除值
            #endregion 内存缓存 MemoryCache使用示例

            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.

作者:꧁执笔小白꧂