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

}

相关文章
|
6月前
|
C#
C# 实现简单的定时任务工具
基于 `System.Timers.Timer` 实现定时任务,支持周期性与单次执行。通过封装 Timer 类,提供启动、停止功能,并包含异常处理,确保任务稳定运行,适用于后台定时操作场景。
|
C# 开发者
C# 9.0中的模块初始化器:程序启动的新控制点
【1月更文挑战第14天】本文介绍了C# 9.0中引入的新特性——模块初始化器(Module initializers)。模块初始化器允许开发者在程序集加载时执行特定代码,为类型初始化提供了更细粒度的控制。文章详细阐述了模块初始化器的语法、用途以及与传统类型初始化器的区别,并通过示例代码展示了如何在实际项目中应用这一新特性。
|
6月前
|
C#
C# 异步编程:async/await 简化异步操作
`async/await` 是 C# 5.0+ 的异步编程语法糖,简化异步操作(如网络请求、文件读写),避免回调地狱。通过 `async` 标记异步方法,`await` 等待任务完成而不阻塞主线程,提升程序响应性和性能,适用于 I/O 密集型场景。
|
3月前
|
IDE Java 编译器
【全网最详细】JDK8下载安装图文教程 | Java8环境变量配置指南
JDK8是2014年发布的经典Java版本,至今仍广泛应用于老项目维护与基础学习。它引入Lambda表达式、Stream API和全新日期时间API等关键特性,大幅提升代码简洁性与功能性。本教程详解官方下载、Windows安装步骤、环境变量配置及基础验证方法,助你快速上手。(239字)
|
6月前
|
缓存 AliSQL 安全
AliSQL 向量技术解析(二):读写缓存与事务并发
本文介绍AliSQL 8.0向量索引的优化:通过Nodes Cache提升搜索效率,结合公共与事务缓存实现RC隔离级别,支持读读、读写并发,并利用预计算与SIMD加速向量计算,显著提升性能。
AliSQL 向量技术解析(二):读写缓存与事务并发
|
传感器 算法 vr&ar
六自由度Stewart控制系统matlab仿真,带GUI界面
六自由度Stewart平台控制系统是一种高精度、高稳定性的运动模拟装置,广泛应用于飞行模拟、汽车驾驶模拟、虚拟现实等领域。该系统通过六个独立的线性致动器连接固定基座与移动平台,实现对负载在三维空间内的六个自由度(三维平移X、Y、Z和三维旋转-roll、pitch、yaw)的精确控制。系统使用MATLAB2022a进行仿真和控制算法开发,核心程序包括滑块回调函数和创建函数,用于实时调整平台的位置和姿态。
TortoiseSVN使用-合并分支代码
TortoiseSVN使用-合并分支代码
2389 1
|
开发工具 git
github clone Failed to connect to github.com port 443 after xxx ms
github clone Failed to connect to github.com port 443 after xxx ms
2351 2
|
域名解析 缓存 运维
【域名解析DNS专栏】域名解析故障排查手册:常见问题与解决方案
【5月更文挑战第22天】【DNS故障排查手册】解决域名无法解析、速度慢、污染劫持及配置错误问题。检查网络、清理缓存、更换DNS服务器、使用HTTPS、DNSSEC及CDN。示例:使用nslookup查询域名解析。定期检查优化DNS服务器,确保稳定安全。
6607 4
【域名解析DNS专栏】域名解析故障排查手册:常见问题与解决方案

热门文章

最新文章