[爬虫学习笔记]memorycache缓存的用法学习

author author     2022-08-04     727

关键词:

      在完成了DNS解析模块之后,我意识到了DNS缓存机制也很有必要。在Redis,Memcache,和.Net自带的Cache之间,考虑到部署问题,最终选择了后者,之前在学习Web及开发的过程中用过System.Web.Caching.Cache这个类库,但是这次的爬虫程序我打算部署为桌面软件,所以选用了System.Runtime.Caching.MemoryCache(后期如有必要也会加入System.Web.Caching.Cache来适配Web端程序)。

      MemoryCache的使用网上介绍的不多,不过这个是.NET4.0新引入的缓存对象,估计主要是替换原来企业库的缓存模块,使得.NET的缓存可以无处不在,而不用基于特定的Windows版本上使用。

      出于方便考虑,我们将不再实例化新的MemoryCache对象,只对MemoryCache的默认示例Memory.Default进行增删查操作。

基础篇

增加:

技术分享

增加缓存需要提供两个参数,CacheItem类表示缓存中的单个缓存项,

构造函数:
CacheItem(String, Object, String)            用缓存项的指定键、值和区域初始化新的 CacheItem 实例。

三个参数分别为:键、值和区域。

CacheItemPolicy类则表示缓存项的过期信息,只含有默认的构造函数。

增加一条缓存:

var item = new CacheItem("习大大", "两学一做");
var policy = new CacheItemPolicy();
policy.SlidingExpiration = new TimeSpan(500);
//插入一条key为"习大大",value为"两学一做",500毫秒后自动销毁的缓存
MemoryCache.Default.Add(item, policy);
//重新设置policy的过期时间为当前时间+十分钟
policy.AbsoluteExpiration = DateTimeOffset.Now + TimeSpan.FromMinutes(10);
//注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero
policy.SlidingExpiration = TimeSpan.Zero;
//重新插入,覆盖前一条数据
MemoryCache.Default.Add(item, policy);
注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero 

查询:

缓存对象类似于字典集,查询可以直接采用memoryCache[key]来进行,例如我们查询一下前面插入的那条数据:

var idea = MemoryCache.Default["习大大"];

移除:

技术分享

参数
key:要移除的缓存项的唯一标识符。
regionName:缓存中的一个添加了缓存项的命名区域。不要为该参数传递值。默认情况下,此参数为null,因为 MemoryCache 类未实现区域。
返回值
Type: System.Object  如果在缓存中找到该项,则为已移除的缓存项;否则为 null。

删除前面加入的那一项:

MemoryCache.Default.Remove("习大大");

进阶篇

明白了基本的用法之后,我们就可以对它做进一步的封装,使之使用起来更为便捷:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Caching;

namespace Crawler.Common
{
    /// <summary>
    /// 基于MemoryCache的缓存辅助类
    /// </summary>
    public static class MemoryCacheHelper
    {
        private static readonly object _locker = new object();

        public static bool Contains(string key)
        {
            return MemoryCache.Default.Contains(key);
        }


        /// <summary>
        /// 获取Catch元素
        /// </summary>
        /// <typeparam name="T">所获取的元素的类型</typeparam>
        /// <param name="key">元素的键</param>
        /// <returns>特定的元素值</returns>
        public static T Get<T>(string key)
        {
            if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("不合法的key!");
            if (!MemoryCache.Default.Contains(key))
                throw new ArgumentException("获取失败,不存在该key!");
            if (!(MemoryCache.Default[key] is T))
                throw new ArgumentException("未找到所需类型数据!");
            return (T)MemoryCache.Default[key];
        }

        /// <summary>
        /// 添加Catch元素
        /// </summary>
        /// <param name="key">元素的键</param>
        /// <param name="value">元素的值</param>
        /// <param name="slidingExpiration">元素过期时间(时间间隔)</param>
        /// <param name="absoluteExpiration">元素过期时间(绝对时间)</param>
        /// <returns></returns>
        public static bool Add(string key, object value, TimeSpan? slidingExpiration = null, DateTime? absoluteExpiration = null)
        {
            var item = new CacheItem(key, value);
            var policy = CreatePolicy(slidingExpiration, absoluteExpiration);
            lock (_locker)
                return MemoryCache.Default.Add(item, policy);
        }

        /// <summary>
        /// 移出Cache元素
        /// </summary>
        /// <typeparam name="T">待移出元素的类型</typeparam>
        /// <param name="key">待移除元素的键</param>
        /// <returns>已经移出的元素</returns>
        public static T Remove<T>(string key)
        {
            if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("不合法的key!");
            if (!MemoryCache.Default.Contains(key))
                throw new ArgumentException("获取失败,不存在该key!");
            var value = MemoryCache.Default.Get(key);
            if (!(value is T))
                throw new ArgumentException("未找到所需类型数据!");
            return (T)MemoryCache.Default.Remove(key);
        }

        /// <summary>
        /// 移出多条缓存数据,默认为所有缓存
        /// </summary>
        /// <typeparam name="T">待移出的缓存类型</typeparam>
        /// <param name="keyList"></param>
        /// <returns></returns>
        public static List<T> RemoveAll<T>(IEnumerable<string> keyList = null)
        {
            if (keyList != null)
                return (from key in keyList
                        where MemoryCache.Default.Contains(key)
                        where MemoryCache.Default.Get(key) is T
                        select (T)MemoryCache.Default.Remove(key)).ToList();
            while (MemoryCache.Default.GetCount() > 0)
                MemoryCache.Default.Remove(MemoryCache.Default.ElementAt(0).Key);
            return new List<T>();
        }

        /// <summary>
        /// 设置过期信息
        /// </summary>
        /// <param name="slidingExpiration"></param>
        /// <param name="absoluteExpiration"></param>
        /// <returns></returns>
        private static CacheItemPolicy CreatePolicy(TimeSpan? slidingExpiration, DateTime? absoluteExpiration)
        {
            var policy = new CacheItemPolicy();

            if (absoluteExpiration.HasValue)
            {
                policy.AbsoluteExpiration = absoluteExpiration.Value;
            }
            else if (slidingExpiration.HasValue)
            {
                policy.SlidingExpiration = slidingExpiration.Value;
            }

            policy.Priority = CacheItemPriority.Default;

            return policy;
        }
    }
}

memorycache缓存---缓存时效(代码片段)

 MemoryCache缓存---缓存时效测试varcachePool=newMyCachePool();//Thread.Sleep(1000);varvalue=cachePool.GetFileValue(); ///<summary>///MemoryCache缓存///</summary>publicclassMyCachePoolObjec 查看详情

获取使用 MemoryCache 类 c# 缓存的所有缓存对象

】获取使用MemoryCache类c#缓存的所有缓存对象【英文标题】:GetallCachedObjectswhicharecachedusingMemoryCacheclassc#【发布时间】:2015-09-0303:41:04【问题描述】:我想检索使用MemoryCache添加的所有缓存对象。我尝试了以下方法,但没有检索到... 查看详情

javascript学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)(代码片段)

文章目录【1】基本总结深入一、什么是数据1、数据类型基本(值)类型对象(引用)类型2、判断相关问题二、什么是内存1、什么是数据2、什么是内存?3、什么是变量4、内存、数据、变量三者之间的关系相... 查看详情

爬虫学习笔记

爬虫模拟浏览器实例:方法一、使用build_opener()修改报头#!/usr/bin/envpython#-*-coding:utf-8-*-#__author__="life"importurllib.requesturl=‘http://blog.csdn.net/justloveyou_/article/details/69611328‘#file=urllib.request.urlo 查看详情

停止 MemoryCache 调用的重入

】停止MemoryCache调用的重入【英文标题】:StopReentrancyonMemoryCacheCalls【发布时间】:2021-04-1420:21:32【问题描述】:应用需要加载数据并缓存一段时间。我希望如果应用程序的多个部分想要同时访问同一个缓存键,缓存应该足够智... 查看详情

爬虫学习笔记

一、      安装python虚拟环境   (将使用python2/3的项目分开)   1、安装virtualenvcmd         cmd命令:pipinstallvirtuale 查看详情

scrapy爬虫学习笔记-爬虫基础知识

 一、正则表达式    二、深度和广度优先                    三、爬虫去重策略   查看详情

为 MemoryCache(或任何缓存)实现通用 Get<T>

】为MemoryCache(或任何缓存)实现通用Get<T>【英文标题】:ImplementGenericGet<T>forMemoryCache(oranyCache)【发布时间】:2016-07-2718:18:27【问题描述】:我正在尝试写一个“简单”GenericGet&lt;T&gt;;扩展为System.Runtime.MemoryCache.为... 查看详情

爬虫学习笔记http请求详解

上篇博客里面写了,爬虫就是发http请求(浏览器里面打开发送的都是http请求),然后获取到response,咱们再从response里面找到想要的数据,存储到本地。咱们本章就来说一下什么是http请求,它里面都有哪些东西,我们在写爬虫... 查看详情

MemoryCache.AddOrGetExisting 有啥用?

】MemoryCache.AddOrGetExisting有啥用?【英文标题】:WhatisMemoryCache.AddOrGetExistingfor?MemoryCache.AddOrGetExisting有什么用?【发布时间】:2013-01-1919:56:11【问题描述】:MemoryCache.AddOrGetExisting的行为描述为:使用指定的键和值将缓存条目添加... 查看详情

学习笔记之爬虫篇

网络爬虫(又被称为网页蜘蛛,网络机器人,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。模块:scrapy req... 查看详情

简单的爬虫学习笔记

作为一只小白刚开始学python,听到用python写爬虫就感觉十分的高端。当我看到知乎大佬们写爬虫用了各种库更懵逼了。其实基础爬虫可以直接用python自带的库urllib,re(但确实用了requests后就不想用urllib)写程序一定要心里有点B数... 查看详情

MemoryCache - 防止项目过期

】MemoryCache-防止项目过期【英文标题】:MemoryCache-preventexpirationofitems【发布时间】:2018-05-1023:07:32【问题描述】:在我的应用程序中,我使用MemoryCache,但我不希望项目过期。因此,项目使用默认策略插入到缓存中,而不设置Abso... 查看详情

scrapy框架学习笔记:猫眼爬虫

...-MaoyanCrawler(二)创建Scrapy项目-Maoyan(三)利用指令生成爬虫程序基本框架(四)修改全局配置文件(五)创建运行爬虫的程序-run.py(六)修改爬虫程序-maoyan.py1、分析爬取网页的网址规律2、先输出要请求的10个页面url3、爬取... 查看详情

memorycache使用方法

...项,可以设置缓存项的绝对和滑动过期时间,优先级等。MemoryCacheEntryOptions的Priority属性。Priority属性指定应将哪些对象(基于已设置的优先级)从缓存中删除,作为每当Web服务器内存空间不足时回收内存的运行时策略的一部分。... 查看详情

MemoryCache 不遵守配置中的内存限制

】MemoryCache不遵守配置中的内存限制【英文标题】:MemoryCachedoesnotobeymemorylimitsinconfiguration【发布时间】:2011-10-1706:43:03【问题描述】:我正在一个应用程序中使用.NET4.0MemoryCache类并尝试限制最大缓存大小,但在我的测试中,缓存... 查看详情

爬虫学习笔记beautifulsoup使用

上篇博客说了正则表达式,但是正则学起来比较费劲,写的时候也不好写,这次说下BeautifulSoup怎么用,这个模块是用来解析html的,它操作很简单,用起来比较方便,比正则学习起来简单多了。这是第三方模块需要安装 123pipi... 查看详情

爬虫学习笔记--拉钩网(代码片段)

  当通过命令行,根据crawl模板生成spider时,  执行scrapygenspider-tcrawllagouwww.lagou.com   出现如下报错(图三):  原因是项目中已有的一句代码:fromitemsimportJobBoleArticleItem,ArticleItemLoader&n 查看详情