IMemoryCache 使用

IMemoryCache 提供了一个内存中的缓存存储,允许你存储和检索对象,这些对象可以在应用程序的不同部分之间共享,以提高性能并减少重复计算或数据库访问的次数。

cs 复制代码
 public interface ICacheService : IDisposable
 {
     /// <summary>
     /// 验证缓存项是否存在
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <returns></returns>
     bool Exists(string key);



     /// <summary>
     /// List写入head
     /// </summary>
     /// <param name="key"></param>
     /// <param name="val"></param>
     void LPush(string key, string val);

     void RPush(string key, string val);
     /// <summary>
     /// List出队 lpop
     /// </summary>
     /// <param name="key"></param>
     /// <returns></returns>
     object ListDequeue(string key);

     /// <summary>
     /// List出队 lpop
     /// </summary>
     /// <param name="key"></param>
     /// <returns></returns>
     T ListDequeue<T>(string key) where T : class;

     /// <summary>
     /// 移除list中的数据,keepIndex为保留的位置到最后一个元素如list 元素为1.2.3.....100
     /// 需要移除前3个数,keepindex应该为4
     /// </summary>
     /// <param name="key"></param>
     /// <param name="keepIndex"></param>
     void ListRemove(string key, int keepIndex);

     /// <summary>
     /// 添加缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <param name="value">缓存Value</param>
     /// <param name="expiresIn">缓存时长</param>
     /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间) //new TimeSpan(0, 60, 0);</param>
     /// <returns></returns>
     bool AddObject(string key, object value, int expireSeconds = -1, bool isSliding = false);

     bool Add(string key, string value, int expireSeconds = -1, bool isSliding = false);

     /// <summary>
     /// 删除缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <returns></returns>
     bool Remove(string key);


     /// <summary>
     /// 批量删除缓存
     /// </summary>
     /// <param name="key">缓存Key集合</param>
     /// <returns></returns>
     void RemoveAll(IEnumerable<string> keys);




     /// <summary>
     /// 获取缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <returns></returns>
     T Get<T>(string key) where T : class;



     /// <summary>
     /// 获取缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <returns></returns>
     string Get(string key);
 }

实现:

cs 复制代码
 public class MemoryCacheService : ICacheService
 {
     /// <summary>
     /// 。IMemoryCache 提供了一个内存中的缓存存储,允许你存储和检索对象,这些对象可以在应用程序的不同部分之间共享,以提高性能并减少重复计算或数据库访问的次数。
     /// </summary>
     protected IMemoryCache _cache;
     public MemoryCacheService(IMemoryCache cache)
     {
         _cache = cache;

     }
     /// <summary>
     /// 验证缓存项是否存在
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <returns></returns>
     public bool Exists(string key)
     {
         if (key == null)
         {
             throw new ArgumentNullException(nameof(key));
         }
         return _cache.Get(key) != null;
     }

     /// <summary>
     /// 添加缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <param name="value">缓存Value</param>
     /// <returns></returns>
     public bool Add(string key, object value)
     {
         if (key == null)
         {
             throw new ArgumentNullException(nameof(key));
         }
         if (value == null)
         {
             throw new ArgumentNullException(nameof(value));
         }
         _cache.Set(key, value);
         return Exists(key);
     }

     public bool AddObject(string key, object value, int expireSeconds = -1, bool isSliding = false)
     {
         if (expireSeconds != -1)
         {
             _cache.Set(key,
                 value,
                 new MemoryCacheEntryOptions()
                 .SetSlidingExpiration(new TimeSpan(0, 0, expireSeconds))
                 );
         }
         else
         {
             _cache.Set(key, value);
         }

         return true;
     }
     public bool Add(string key, string value, int expireSeconds = -1, bool isSliding = false)
     {
         return AddObject(key, value, expireSeconds, isSliding);
     }
     public void LPush(string key, string val)
     {
     }
     public void RPush(string key, string val)
     {
     }
     public T ListDequeue<T>(string key) where T : class
     {
         return null;
     }
     public object ListDequeue(string key)
     {
         return null;
     }
     public void ListRemove(string key, int keepIndex)
     {
     }
     /// <summary>
     /// 添加缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <param name="value">缓存Value</param>
     /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
     /// <param name="expiressAbsoulte">绝对过期时长</param>
     /// <returns></returns>
     public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
     {
         _cache.Set(key, value,
                 new MemoryCacheEntryOptions()
                 .SetSlidingExpiration(expiresSliding)
                 .SetAbsoluteExpiration(expiressAbsoulte)
                 );

         return Exists(key);
     }
     /// <summary>
     /// 添加缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <param name="value">缓存Value</param>
     /// <param name="expiresIn">缓存时长</param>
     /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
     /// <returns></returns>
     public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false)
     {
         if (isSliding)
             _cache.Set(key, value,
                 new MemoryCacheEntryOptions()
                 .SetSlidingExpiration(expiresIn)
                 );
         else
             _cache.Set(key, value,
             new MemoryCacheEntryOptions()
             .SetAbsoluteExpiration(expiresIn)
             );

         return Exists(key);
     }



     /// <summary>
     /// 删除缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <returns></returns>
     public bool Remove(string key)
     {
         if (key == null)
         {
             throw new ArgumentNullException(nameof(key));
         }
         _cache.Remove(key);

         return !Exists(key);
     }
     /// <summary>
     /// 批量删除缓存
     /// </summary>
     /// <param name="key">缓存Key集合</param>
     /// <returns></returns>
     public void RemoveAll(IEnumerable<string> keys)
     {
         if (keys == null)
         {
             throw new ArgumentNullException(nameof(keys));
         }

         keys.ToList().ForEach(item => _cache.Remove(item));
     }
     public string Get(string key)
     {
         return _cache.Get(key)?.ToString();
     }
     /// <summary>
     /// 获取缓存
     /// </summary>
     /// <param name="key">缓存Key</param>
     /// <returns></returns>
     public T Get<T>(string key) where T : class
     {
         if (key == null)
         {
             throw new ArgumentNullException(nameof(key));
         }
         return _cache.Get(key) as T;
     }

     public void Dispose()
     {
         if (_cache != null)
             _cache.Dispose();
         GC.SuppressFinalize(this);
     }


 }
相关推荐
_Evan_Yao5 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
Sakura_j_h_6 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
隔窗听雨眠10 小时前
PostgreSQL单表从Windows迁移到Linux:差异剖析、方案对比与全流程实战
linux·windows·postgresql
paopaokaka_luck11 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
Helix25012 小时前
Ansible混合环境自动化:Windows与Linux统一配置管理实战
windows·自动化·ansible·playbook·配置管理·winrm·混合环境
雷一言说13 小时前
Spring AI 2.0 Tool Calling 实战:用一个订单查询跑通整个调用链
spring
Java开发追求者14 小时前
windows快速安装docker
windows·docker·安装·1024程序员节
xieliyu.17 小时前
【JavaEE进阶】Spring Boot 日志:从 System.out 到 @Slf4j,6 个级别 + 4 类配置一篇讲透
java·spring boot·spring·java-ee·springboot·logback·slf4j
Helix25017 小时前
Windows ETW与KQL实战:终端性能诊断与遥测数据分析指南
windows·性能诊断·kql·etw·azure monitor·遥测数据·tracert
IT_Octopus18 小时前
Apollo 配置中心入门:一所“小学校“读懂 Portal、Meta Server、Config Service
java·后端·spring