使用 C#
编写一个 key-value
结构进程内缓存,实现数据的缓存操作,此处所用到的知识点如下:
ConcurrentDictionary
;Singleton
);说明:此处基于 .net 6 平台创建控制台项目。
ConsoleApp
项目,添加 CustomCacheHelper.cs
类;namespace
)using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
CustomCacheHelper.cs
类中编写实现方法///
/// 自定义内存缓存助手
///
public sealed class CustomCacheHelper
{#region 单例模式//创建私有化静态obj锁 private static readonly object _ObjLock = new();//创建私有静态字段,接收类的实例化对象 private static volatile CustomCacheHelper? _Instance = null;//构造函数私有化 private CustomCacheHelper() { }//创建单利对象资源并返回 public static CustomCacheHelper GetSingleObj(){if (_Instance == null){lock (_ObjLock){if (_Instance == null){_Instance = new CustomCacheHelper();}}}return _Instance;}#endregion/// /// 缓存字典 => 【key|value|time】/// private static volatile ConcurrentDictionary> _CacheDictionary = new();/// /// 1.主动过期/// static CustomCacheHelper(){Task.Run(() => {while (true){int millisecondsTimeout = 1000 * 60 * 10;Thread.Sleep(millisecondsTimeout); //10分钟检查一次if (_CacheDictionary != null && _CacheDictionary.Keys.Count > 0){ICollection listKey = _CacheDictionary.Keys;foreach (var key in listKey){var valueTime = _CacheDictionary[key];if (valueTime.Value < DateTime.Now){_CacheDictionary.TryRemove(key, out KeyValuePair
由于该项目是采用控制台程序编写,我们可直接在 Main
方法中,添加如下代码:
var customCache = CustomCacheHelper.GetSingleObj();
customCache.Set("key1", "value1");
customCache.Set("key2", "value2", 3);
customCache.Set("key3", "value3", 6);
var keys = customCache.GetKeys();Console.WriteLine("首次打印:");
foreach (var key in keys)
{Console.WriteLine($"time:{DateTime.Now},key={key},value={customCache.Get(key)}");
}Console.WriteLine("睡眠5s后再次打印:");
Thread.Sleep(5000);
foreach (var key in keys)
{Console.WriteLine($"time:{DateTime.Now},key={key},value={customCache.Get(key)}");
}
此处代码中我们添加了三组 key-vaule
数据,其中一个是没有设置过期时间,另外两个设置过期时间,保存数据后,分别打印缓存中保存的数据,再第二次缓存打印前,先让线程睡眠等待 5 秒(5000毫秒)
,注意观察控制台输出的信息。
从控制台输出的信息中,我们可以看到 key=key2
的 value
值为空,说明我们内部调用 Exist
方法生效了,key2
的 value
缓存有效时间是 3
秒,第二次打印输出信息时,此时已经睡眠 5
秒,相对于 key2
存储的内存数据已经超时,而 key3
的 value
存储的有效时间是 6
秒,没有超时,所以能个获取到对应的内存数据。
通过上面的 demo
演示,我们就实现了一个自定义的进程内缓存助手,在项目中可以很方便的导入使用。