返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >一文搞懂MemoryCache清除全部缓存的方法
  • 108
分享到

一文搞懂MemoryCache清除全部缓存的方法

2024-04-02 19:04:59 108人浏览 泡泡鱼
摘要

最近有个需求需要定时清理服务器上所有的缓存。本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了。谁知道 MemoryCache 类以及 IMemoryCach

最近有个需求需要定时清理服务器上所有的缓存。本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了。谁知道 MemoryCache 类以及 IMemoryCache 扩展方法都没有 Clear 方法。这可给难住了,于是想找到所有的 Keys 来一个个 Remove ,谁知道居然也没有获取所有 Key 的方法。于是研究了一下 ,找到一些方法,下面介绍两个方法:

自定义 CacheWrapper 包装类

MemoryCache 构造 Entry 的时候支持传入 CancellationChangeToken 对象,当 CancellationChangeToken.Cancel 触发的时候会自动使该对象过期。那么我们只要对 MemoryCache 类包装一下很容易实现一个自己的 Cache 类。


 public class CacheWrapper
    {
        private readonly IMemoryCache _memoryCache;
        private CancellationTokenSource _resetCacheToken = new();

        public CacheWrapper(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }

        public void Add(object key, object value, MemoryCacheEntryOptions memoryCacheEntryOptions)
        {
            using var entry = _memoryCache.CreateEntry(key);
            entry.SetOptions(memoryCacheEntryOptions);
            entry.Value = value;

            // add an expiration token that allows us to clear the entire cache with a single method call
            entry.AddExpirationToken(new CancellationChangeToken(_resetCacheToken.Token));
        }

        public object Get(object key)
        {
            return _memoryCache.Get(key);
        }

        public void Remove(object key)
        {
            _memoryCache.Remove(key);
        }

        public void Clear()
        {
            _resetCacheToken.Cancel(); // this triggers the CancellationChangeToken to expire every item from cache

            _resetCacheToken.Dispose(); // dispose the current cancellation token source and create a new one
            _resetCacheToken = new CancellationTokenSource();
        }
    }

然后单元测试测试一下:


        [TestMethod()]
        public void ClearTest()
        {
            var memCache = new MemoryCache(new MemoryCacheOptions());
            var wrapper = new CacheWrapper(memCache);

            for (int i = 0; i < 10; i++)
            {
                wrapper.Add(i.ToString(), new object(), new MemoryCacheEntryOptions());
            }

            Assert.IsNotNull(wrapper.Get("1"));
            Assert.IsNotNull(wrapper.Get("9"));

            wrapper.Clear();

            for (int i = 0; i < 10; i++)
            {
                Assert.IsNull(wrapper.Get(i.ToString()));
            }

            for (int i = 0; i < 10; i++)
            {
                wrapper.Add(i.ToString(), new object(), new MemoryCacheEntryOptions());
            }

            Assert.IsNotNull(wrapper.Get("1"));
            Assert.IsNotNull(wrapper.Get("9"));

            wrapper.Clear();

            for (int i = 0; i < 10; i++)
            {
                Assert.IsNull(wrapper.Get(i.ToString()));
            }

        }

测试通过。

Compact 方法

以上 CacheWrapper 类虽然可以实现我们想要的功能,但是对于原来的程序有侵入,需要使用 CacheWrapper 类替换默认的 MemoryCache 类,不是太好。于是不死心继续研究,后来直接看了 MemoryCache 的代码(源码在这),开源真香。发现 MemoryCache 有个 Compact 方法好像在干删除的勾当。也怪我英文不好,这单词是压缩的意思,居然才发现。。。。于是我们的清除所有对象的需求不就轻而易举了么?


 /// Remove at least the given percentage (0.10 for 10%) of the total entries (or estimated memory?), according to the following policy:
        /// 1. Remove all expired items.
        /// 2. Bucket by CacheItemPriority.
        /// 3. Least recently used objects.
        /// ?. Items with the soonest absolute expiration.
        /// ?. Items with the soonest sliding expiration.
        /// ?. Larger objects - estimated by object graph size, inaccurate.
MemoryCache.Compact(double percentage);

Compact 方法会对缓存的对象进行压缩,参数是个double,0.1 表示压缩 10% ,那么传 1.0 就是压缩 100%,那不就是 Clear All 么。所以我可以使用 Compact(1.0) 来清除所有的缓存对象。单元测试跑一下:


[TestMethod()]
        public void CompactTest()
        {
            var memCache = new MemoryCache(new MemoryCacheOptions());

            for (int i = 0; i < 10; i++)
            {
                memCache.Set(i.ToString(), new object(), new MemoryCacheEntryOptions());
            }

            Assert.IsNotNull(memCache.Get("1"));
            Assert.IsNotNull(memCache.Get("9"));

            memCache.Compact(1);

            for (int i = 0; i < 10; i++)
            {
                Assert.IsNull(memCache.Get(i.ToString()));
            }

            for (int i = 0; i < 10; i++)
            {
                memCache.Set(i.ToString(), new object(), new MemoryCacheEntryOptions());
            }

            Assert.IsNotNull(memCache.Get("1"));
            Assert.IsNotNull(memCache.Get("9"));

            memCache.Compact(1);

            for (int i = 0; i < 10; i++)
            {
                Assert.IsNull(memCache.Get(i.ToString()));
            }
        }

完美通过。
这里简单介绍下 Compact 方法。根据注释它会按照已下优先级删除对象:

  • 过期的对象
  • CacheItemPriority 设置的优先级,等级越高越不容易被删除
  • 最近最少被使用的对象
  • 绝对过期时间
  • 滑动过期时间
  • 大对象

到此这篇关于一文搞懂MemoryCache 清除全部缓存的文章就介绍到这了,更多相关MemoryCache 清除全部缓存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文搞懂MemoryCache清除全部缓存的方法

本文链接: https://lsjlt.com/news/160525.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文搞懂MemoryCache清除全部缓存的方法
    最近有个需求需要定时清理服务器上所有的缓存。本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了。谁知道 MemoryCache 类以及 IMemoryCach...
    99+
    2024-04-02
  • .NET MemoryCache如何清除全部缓存
    最近有个需求需要定时清理服务器上所有的缓存。本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了。谁知道 MemoryCache 类以及 IMemoryCach...
    99+
    2024-04-02
  • javascript清除缓存的方法
    本篇内容介绍了“javascript清除缓存的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!javascript清除缓存的方法:1、在h...
    99+
    2023-06-14
  • html清除缓存的方法
    这篇文章给大家分享的是有关html清除缓存的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。html清除缓存的方法:1、在meta标签里使用“Cache-Control”属性,语法“CONTENT="...
    99+
    2023-06-14
  • redis清除缓存数据的方法
    本篇文章给大家分享的是有关redis清除缓存数据的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Windows环境下使用命令行进行redi...
    99+
    2024-04-02
  • Windows下清除Redis缓存的方法
    Windows下清除Redis缓存的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!Windows下清除Redis缓存1...
    99+
    2024-04-02
  • 一文带你搞懂useCallback的使用方法
    目录一、useCallback的作用二、useRef解决方案三、useReducer解决方案四、usePersistFn解决方案总结一、useCallback的作用 usecallb...
    99+
    2023-02-07
    react usecallback usecallback用法 手动实现useCallback
  • eclipse清除缓存的方法有哪些
    Eclipse清除缓存的方法有以下几种:1. 清除工作区的元数据:选择菜单栏的"File" -> "Refresh",或者使用快捷键...
    99+
    2023-09-22
    eclipse
  • ubuntu清除缓存的方法有哪些
    在Ubuntu中,可以使用以下方法清除缓存: 清除apt软件包缓存: sudo apt-get clean 清除apt的已下...
    99+
    2024-02-29
    ubuntu
  • laravel清除缓存的方法是什么
    在Laravel中,清除缓存有多种方法,具体取决于您要清除的缓存类型。以下是几种常见的清除缓存的方法: 清除配置缓存: php ...
    99+
    2024-04-02
  • 一文搞懂Go语言操作Redis的方法
    目录前言安装依赖包连接Redisredis连接池总结前言 Redis是一个开源的内存数据库,在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用。感兴趣的小伙伴们可以参考借鉴,希望对大...
    99+
    2024-04-02
  • php如何清除全部cookie的方法
    本篇内容介绍了“php如何清除全部cookie的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php清除全部cookie的方法:首先创建...
    99+
    2023-06-07
  • Linux系统清除缓存的方法总结
    1)缓存机制介绍 在linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先bWAgBVH去缓存区找是否有请求的数据,有就直接返回,如果没有...
    99+
    2022-06-04
    Linux 系统缓存
  • Android清除应用缓存的两种方法
    第一种 使用ActivityManager中的clearApplicationUserData方法,代码如下: ActivityManager am = (ActivityMa...
    99+
    2024-04-02
  • window清除dns缓存的方法是什么
    在Windows操作系统中,清除DNS缓存的方法如下:1. 打开命令提示符:按下Win+R键,输入cmd,按下回车键。2. 输入以下...
    99+
    2023-06-12
    清除dns缓存
  • Android如何清除应用缓存的方法
    本篇内容主要讲解“Android如何清除应用缓存的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何清除应用缓存的方法”吧!第一种使用ActivityManager中的clea...
    99+
    2023-06-14
  • windows 8应用商店缓存文件清除方法(图文)
      Win8系统中的应用商店包含丰富的新界面应用,用户可以方便的查找、下载和安装各种应用。不过由于Win8应用商店的应用缺省安装在系统盘,路径 不可更改,如果安装Win8系统时没有给系统盘留下足够大的空间...
    99+
    2022-06-04
    缓存 商店 图文
  • 一文搞懂Python读取text,CSV,JSON文件的方法
    目录前言打开文件Python 中的文件读取模式读取文本文件读取 CSV 文件读取 JSON 文件总结前言 文件是无处不在的,无论我们使用哪种编程语言,处理文件对于每个程序员都是必不可...
    99+
    2024-04-02
  • vue部署上线清除浏览器缓存的方式
    目录部署上线清除浏览器缓存修改根目录index.html配置 nginx 不缓存 html打包的文件路径添加时间戳vue项目部署,清理缓存方式部署上线清除浏览器缓存 vue 项目打包...
    99+
    2022-11-13
    vue 部署上线 vue清除浏览器缓存 vue浏览器缓存
  • 一文搞懂Java创建线程的五种方法
    目录题目描述解题思路代码详解第一种 继承Thread类创建线程第二种:实现Runnable接口创建线程第三种:实现Callable接口,通过FutureTask包装器来创建Threa...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作