封装一个给 .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年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!


相关文章
|
2月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
56 1
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
86 4
|
1月前
|
存储 Java 程序员
结构体和类的内存管理方式在不同编程语言中的表现有何异同?
不同编程语言中结构体和类的内存管理方式既有相似之处,又有各自的特点。了解这些异同点有助于开发者在不同的编程语言中更有效地使用结构体和类来进行编程,合理地管理内存,提高程序的性能和可靠性。
29 3
|
1月前
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
1月前
|
存储 缓存 算法
结构体和类在内存管理方面有哪些具体差异?
【10月更文挑战第30天】结构体和类在内存管理方面的差异决定了它们在不同的应用场景下各有优劣。在实际编程中,需要根据具体的需求和性能要求来合理选择使用结构体还是类。
|
1月前
|
存储 缓存 监控
|
1月前
|
存储 缓存 Dart
Flutter&鸿蒙next 封装 Dio 网络请求详解:登录身份验证与免登录缓存
本文详细介绍了如何在 Flutter 中使用 Dio 封装网络请求,实现用户登录身份验证及免登录缓存功能。首先在 `pubspec.yaml` 中添加 Dio 和 `shared_preferences` 依赖,然后创建 `NetworkService` 类封装 Dio 的功能,包括请求拦截、响应拦截、Token 存储和登录请求。最后,通过一个登录界面示例展示了如何在实际应用中使用 `NetworkService` 进行身份验证。希望本文能帮助你在 Flutter 中更好地处理网络请求和用户认证。
170 1
|
2月前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
61 3
|
2月前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-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个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
93 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
|
2月前
|
存储 缓存 API
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
48 6