iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 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://www.lsjlt.com/news/160525.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文搞懂MemoryCache清除全部缓存的方法
    最近有个需求需要定时清理服务器上所有的缓存。本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了。谁知道 MemoryCache 类以及 IMemoryCach...
    99+
    2024-04-02
  • .NET MemoryCache如何清除全部缓存
    最近有个需求需要定时清理服务器上所有的缓存。本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了。谁知道 MemoryCache 类以及 IMemoryCach...
    99+
    2024-04-02
  • html清除缓存的方法
    这篇文章给大家分享的是有关html清除缓存的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。html清除缓存的方法:1、在meta标签里使用“Cache-Control”属性,语法“CONTENT="...
    99+
    2023-06-14
  • javascript清除缓存的方法
    本篇内容介绍了“javascript清除缓存的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!javascript清除缓存的方法:1、在h...
    99+
    2023-06-14
  • 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
  • laravel清除缓存的方法是什么
    在Laravel中,清除缓存有多种方法,具体取决于您要清除的缓存类型。以下是几种常见的清除缓存的方法: 清除配置缓存: php ...
    99+
    2024-04-02
  • ubuntu清除缓存的方法有哪些
    在Ubuntu中,可以使用以下方法清除缓存: 清除apt软件包缓存: sudo apt-get clean 清除apt的已下...
    99+
    2024-02-29
    ubuntu
  • eclipse清除缓存的方法有哪些
    Eclipse清除缓存的方法有以下几种:1. 清除工作区的元数据:选择菜单栏的"File" -> "Refresh",或者使用快捷键...
    99+
    2023-09-22
    eclipse
  • window清除dns缓存的方法是什么
    在Windows操作系统中,清除DNS缓存的方法如下:1. 打开命令提示符:按下Win+R键,输入cmd,按下回车键。2. 输入以下...
    99+
    2023-06-12
    清除dns缓存
  • Android如何清除应用缓存的方法
    本篇内容主要讲解“Android如何清除应用缓存的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何清除应用缓存的方法”吧!第一种使用ActivityManager中的clea...
    99+
    2023-06-14
  • Android清除应用缓存的两种方法
    第一种 使用ActivityManager中的clearApplicationUserData方法,代码如下: ActivityManager am = (ActivityMa...
    99+
    2024-04-02
  • php如何清除全部cookie的方法
    本篇内容介绍了“php如何清除全部cookie的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php清除全部cookie的方法:首先创建...
    99+
    2023-06-07
  • 一文搞懂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
  • tomcat清除项目缓存的方法有哪些
    Tomcat清除项目缓存的方法有以下几种:1. 重启Tomcat服务器:这是最简单也是最常见的方法,通过重启Tomcat服务器可以清...
    99+
    2023-09-23
    tomcat
  • vue使用keep-alive后清除缓存的方法
    什么是keepalive? 在平常开发中,有部分组件没有必要多次初始化,这时,我们需要将组件进行持久化,使组件的状态维持不变,在下一次展示时,也不会进行重新初始化组件。 ...
    99+
    2024-04-02
  • ehcache手动清除缓存的方法是什么
    Ehcache提供了一些方法来手动清除缓存,以下是常用的方法:1. `remove(Object key)`:通过指定缓存键来删除缓...
    99+
    2023-08-26
    ehcache
  • 清空阿里云服务器缓存的方法是清空所有缓存文件
    简介:在使用阿里云服务器时,可能会遇到缓存文件过多的情况,这会影响服务器的性能和稳定性。因此,清空所有缓存文件是一个非常重要的操作。本文将介绍如何清空阿里云服务器的所有缓存文件。 1. 使用命令行清空缓存使用命令行可以方便地清空阿里云服务器...
    99+
    2024-01-16
    缓存 清空 阿里
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作