封装一个给 .NET Framework 用的内存缓存帮助类

简介: 封装一个给 .NET Framework 用的内存缓存帮助类

前言

.NET Core 中已经内置了内存缓存相关的类和操作方法,直接就能使用,非常方便。但在 .NET Framework 中,如果想要使用内存缓存,需要自己进行封装。本文分享一个我自己项目中封装的内存缓存帮助类,有需要的童鞋可以拿去根据自己的实际业务修改修改,应用到自己的项目中。

代码

  1. 封装内存缓存类 CacheUtil
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Caching;
using System.Text;
using System.Threading.Tasks;
namespace Common.Util
{
  public static class CacheUtil
  {
  /// <summary>
  /// <para>获取预定的缓存的过期时间</para>
  /// <para>单位:小时</para>
  /// </summary>
  /// <returns></returns>
  public static int GetCacheExpirationTime()
  {
    // 默认过期时间是 2 小时
    int expiration = 2;
    
    // 从外部获取预定的缓存过期时间,如果有值,则将默认的过期时间改为外部设置的过期时间
    string cacheFile = Path.Combine(FileUtil.GetAppHomeBinPath(), "CacheExpiration.txt");
    Logger.DebugFormat("The cache expiration setting file is [{0}]", cacheFile);
    if (File.Exists(cacheFile))
    {
    using (StreamReader sr = new StreamReader(new FileStream(cacheFile, FileMode.Open, FileAccess.Read)))
    {
      var readBody = sr.ReadToEnd();
      int outExpiration = CommonUtil.GetObjTranNull<int>(readBody);
      if (outExpiration > 0) expiration = outExpiration;
    }
    }
    Logger.DebugFormat("The cache expiration setting is [{0}] hours", expiration);
    return expiration;
  }
  /// <summary>
  /// Set cache
  /// </summary>
  /// <param name="key"></param>
  /// <param name="obj"></param>
  /// <param name="expiration"></param>
  public static void Set(string key, object obj, int expiration)
  {
    var cache = MemoryCache.Default;
    var policy = new CacheItemPolicy
    {
    AbsoluteExpiration = DateTime.Now.AddHours(expiration)
    };
    cache.Set(key, obj, policy);
  }
  /// <summary>
  /// Get cach value by key
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public static T Get<T>(string key)
  {
    try
    {
    var cache = MemoryCache.Default;
    var cacheVal = cache[key];
    return CommonUtil.GetObjTranNull<T>(cacheVal);
    }
    catch (Exception ex)
    {
    BDNALog.BDNALogger.DEFAULT.Warn("Error occurred when getting cache value: ", ex);
    return default(T);
    }
  }
  /// <summary>
  /// Check whether the cache item is exists by key
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public static bool IsKeyExists(string key)
  {
    var cache = MemoryCache.Default;
    return cache.Contains(key);
  }
  }
}
  1. 使用
// 1. 判断缓存在不在
if (!CacheUtil.IsKeyExists("isNonInteractiveUser"))
{
  
}
// 2. 获取缓存的值
string val = CacheUtil.Get<string>("isNonInteractiveUser");
// 3. 设置缓存的值
bool isNonInteractiveUser = true;
int expiration = CacheUtil.GetCacheExpirationTime();
CacheUtil.Set("isNonInteractiveUser", isNonInteractiveUser, expiration);

总结

使用这个封装好的内存缓存类,就可以方便地在 .NET Framework 中操作内存缓存了。

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!


相关文章
|
18天前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
33 1
|
2天前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
16 3
|
9天前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
28 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
|
11天前
|
数据库连接 开发者
.NET 内存管理两种有效的资源释放方式
【10月更文挑战第15天】在.NET中,有两种有效的资源释放方式:一是使用`using`语句,适用于实现`IDisposable`接口的对象,如文件流、数据库连接等,能确保资源及时释放,避免泄漏;二是手动调用`Dispose`方法并处理异常,提供更灵活的资源管理方式,适用于复杂场景。这两种方式都能有效管理资源,提高应用性能和稳定性。
|
12天前
|
算法 Java 数据库连接
.NET 内存管理两种有效的资源释放方式
【10月更文挑战第14天】在 .NET 中,`IDisposable` 接口提供了一种标准机制来释放非托管资源,如文件句柄、数据库连接等。此类资源需手动释放以避免泄漏。实现 `IDisposable` 的类可通过 `Dispose` 方法释放资源。使用 `using` 语句可确保资源自动释放。此外,.NET 的垃圾回收器会自动回收托管对象所占内存,提高程序效率。示例代码展示了如何使用 `MyFileHandler` 类处理文件操作并释放 `FileStream` 资源。
|
16天前
|
存储 缓存 API
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
33 6
|
19天前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(二)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
19天前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(三)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
19天前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(一)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作