C# 实现带过期时间的本地缓存工具

简介: 基于ConcurrentDictionary与定时清理机制,实现线程安全的本地缓存,支持键值过期自动清除。每分钟扫描并移除过期项,有效防止内存溢出,适用于需短暂存储数据的场景,如用户会话、临时配置等,保障性能与稳定性。

基于Dictionary和定时清理机制,实现支持自动过期的本地缓存,避免内存溢出。
using System.Collections.Concurrent;
using System.Timers;

public class ExpirableLocalCache
{
// 线程安全字典存储缓存项
private readonly ConcurrentDictionary _cache = new();
// 定时清理器(每分钟检查一次)
private readonly Timer _cleanupTimer;
private readonly object _lockObj = new();

public ExpirableLocalCache()
{
    _cleanupTimer = new Timer(60000);
    _cleanupTimer.Elapsed += OnCleanupTimerElapsed;
    _cleanupTimer.Start();
}

// 缓存项模型
private class CacheItem
{
    public object Value { get; set; }
    public DateTime ExpireTime { get; set; }
    public bool IsExpired => DateTime.Now > ExpireTime;
}

// 添加缓存(设置过期时间)
public void Set(string key, object value, TimeSpan expireAfter)
{
    _cache[key] = new CacheItem
    {
        Value = value,
        ExpireTime = DateTime.Now.Add(expireAfter)
    };
}

// 获取缓存
public T Get<T>(string key) where T : class
{
    if (_cache.TryGetValue(key, out var item) && !item.IsExpired)
    {
        return item.Value as T;
    }
    _cache.TryRemove(key, out _);
    return null;
}

// 主动移除缓存
public void Remove(string key)
{
    _cache.TryRemove(key, out _);
}

// 定时清理过期缓存
private void OnCleanupTimerElapsed(object sender, ElapsedEventArgs e)
{
    lock (_lockObj)
    {
        var expiredKeys = _cache.Where(kv => kv.Value.IsExpired)
                               .Select(kv => kv.Key)
                               .ToList();

        foreach (var key in expiredKeys)
        {
            _cache.TryRemove(key, out _);
        }
        Console.WriteLine($"清理了 {expiredKeys.Count} 个过期缓存项");
    }
}

// 调用示例
public static void TestCache()
{
    var cache = new ExpirableLocalCache();
    // 缓存5分钟
    cache.Set("user_1", new { Id = 1, Name = "张三" }, TimeSpan.FromMinutes(5));
    var user = cache.Get<dynamic>("user_1");
    Console.WriteLine($"获取缓存:{user?.Name}");
}

}

相关文章
|
7月前
|
C#
C# 实现简单的定时任务工具
基于 `System.Timers.Timer` 实现定时任务,支持周期性与单次执行。通过封装 Timer 类,提供启动、停止功能,并包含异常处理,确保任务稳定运行,适用于后台定时操作场景。
|
7月前
|
C#
C# 异步编程:async/await 简化异步操作
`async/await` 是 C# 5.0+ 的异步编程语法糖,简化异步操作(如网络请求、文件读写),避免回调地狱。通过 `async` 标记异步方法,`await` 等待任务完成而不阻塞主线程,提升程序响应性和性能,适用于 I/O 密集型场景。
|
5月前
|
Oracle Java 关系型数据库
JDK 8安装教程 Windows版详细步骤+环境变量配置(含java/javac/java -version验证)
JDK是Oracle开发的Java开发工具包,含JVM、类库、编译器等,支持Java全平台。本文详解JDK 8下载、安装(含管理员运行)、环境变量配置(JAVA_HOME/CLASSPATH/Path)及cmd验证步骤,助你快速完成本地开发环境搭建。(239字)
|
6月前
|
存储 人工智能 缓存
2026年OpenClaw(原Clawdbot)一键部署+Skills能做什么?全场景应用解析
如果说OpenClaw与大模型的组合赋予了AI助理“智慧大脑”,那么Skills就是为其配备的“灵活双手”——通过各类功能插件,OpenClaw能突破纯语言交互的限制,实现网页操作、邮件管理、文件处理等具象化任务。2026年阿里云轻量应用服务器推出OpenClaw一键部署方案,大幅降低了入门门槛。本文将完整覆盖阿里云OpenClaw快速部署流程、默认Skills实战场景、新Skills安装配置及高级应用技巧,包含详细代码命令与操作步骤,帮助用户从零到一解锁OpenClaw的全量能力。
2519 8
|
9月前
|
人工智能 缓存 监控
别再瞎试!一套"万能prompt框架"让AI输出质量提升10倍
作为一名后端开发,我曾因AI答非所问而崩溃。三个月摸索后,总结出高效提问的RBTRO框架:角色、背景、任务、要求、输出。套用需求文档思维,让AI从“瞎猜”变“精准执行”,效率提升10倍。附5大实战场景与可复用模板,助你快速上手。
|
Web App开发 前端开发
前端下载文件(Blob)的几种方式使用Blob下载文件
前端下载文件(Blob)的几种方式使用Blob下载文件
1733 0
|
存储 NoSQL 算法
介绍一下HyperLogLog
【10月更文挑战第19天】介绍一下HyperLogLog
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构