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}");
}

}

相关文章
|
3月前
|
C#
C# 实现简单的定时任务工具
基于 `System.Timers.Timer` 实现定时任务,支持周期性与单次执行。通过封装 Timer 类,提供启动、停止功能,并包含异常处理,确保任务稳定运行,适用于后台定时操作场景。
|
人工智能 自然语言处理 IDE
通义灵码使用指南
一款不用充钱也能让你变强的插件 通义灵码(TONGYI Lingma),可以称之为中国copilot 的平替品。我们一起看看如何使用安装,功能介绍,常用问题,客户测评等。
9614 12
通义灵码使用指南
|
2月前
|
存储 人工智能 JSON
别被术语吓跑!零基础大模型微调指南:从“调教”逻辑到实战手册
AI博主手把手教你微调大模型!用大白话拆解LoRA、QLoRA等术语,从原理到实操(数据准备→环境配置→参数设置→效果评估),全程可视化工具推荐,8GB显卡也能跑。让通用AI变身懂你的垂直领域助手!
469 5
|
3月前
|
C#
C# 条件判断:if-else 与 switch 的实用场景
条件判断是流程控制的核心。if-else适用于多级条件判断,如根据积分决定会员等级;switch适用于多值匹配,C# 7.0+支持字符串和数值匹配,可清晰处理会员等级对应的优惠策略。
|
3月前
|
C#
C# 异步编程:async/await 简化异步操作
`async/await` 是 C# 5.0+ 的异步编程语法糖,简化异步操作(如网络请求、文件读写),避免回调地狱。通过 `async` 标记异步方法,`await` 等待任务完成而不阻塞主线程,提升程序响应性和性能,适用于 I/O 密集型场景。
|
3月前
|
存储 安全 C#
C# 数组与集合:List<T> 最常用场景
数组长度固定,集合(List&lt;T&gt;)可动态增删,支持泛型与类型安全。常用操作包括添加、删除、遍历和查询元素,是开发中首选的动态数据存储方式。
|
3月前
|
存储 人工智能 NoSQL
【AI大模型面试宝典十四】- 评估应用篇
【AI大模型面试宝典】聚焦RAG技术,详解检索增强生成原理:从DPR、ColBERT到FAISS实战,拆解幻觉解决、稠密检索、评估优化等高频面试题,助你精准攻克大模型面试核心考点,Offer轻松拿!
139 3
|
3月前
|
C#
C# 变量与数据类型:3 分钟入门核心用法
C#是强类型语言,变量需声明类型或用var推断。数据类型分值类型(如int、decimal)和引用类型(如string)。示例:用int和decimal计算商品总价,并通过字符串插值输出格式化结果,适用于金融计算。
|
3月前
|
弹性计算 人工智能 固态存储
阿里云服务器多少钱一年?整理2026年阿里云服务器新购、续费与升级配置价格费用明细
阿里云服务器主要分为轻量应用服务器、云服务器 ECS 和 GPU 服务器三类,不同类型适配不同使用场景,费用因配置、租期及计费方式存在差异。以下从新购价格、续费优惠、升级规则及额外收费项等方面,详细说明阿里云服务器的费用情况。