zoukankan      html  css  js  c++  java
  • C#缓存加载数据与读取

    #转自:https://blog.csdn.net/qq_24025219/article/details/96734660

                https://blog.csdn.net/nnn_net/article/details/53394603

               https://www.cnblogs.com/xianyv/archive/2019/04/27/10682438.html

    C#本地缓存

    1. 什么是缓存?
    缓存就是数据交换的缓冲区(又称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,找到了则直接执行,找不到的话则从内存中查找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
    因为缓存往往使用的是RAM(断电即掉的非永久性储存),所以在用完后还是会把文件送到硬盘等存储器里永久存储。电脑里最大的缓存就是内存条了,最快的是CPU上镶的L1和L2缓存,显卡的显存是给显卡运算芯片用的缓存,硬盘上也有16M或者32M的缓存。

    其实,缓存是CPU的一部分,它存在于CPU中

    CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大

    缓存是为了解决CPU速度和内存速度的速度差异问题

    内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多。

    C#中的缓存技术

    1、HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了。但是非 Web 应用也是可以拿来用的。

    2、HttpContext.Cache 是对上述缓存类的封装,由于封装到了 HttpContext ,局限于只能在知道 HttpContext 下使用,即只能用于 Web 应用。

    综上所属,在可以的条件,尽量用 HttpRuntime.Cache ,而不是用 HttpContext.Cache 。 

    Cache有以下几条缓存数据的规则。
    第一,数据可能会被频繁的被使用,这种数据可以缓存。
    第二,数据的访问频率非常高,或者一个数据的访问频率不高,但是它的生存周期很长,这样的数据最好也缓存起来。
    第三是一个常常被忽略的问题,有时候我们缓存了太多数据,通常在一台X86的机子上,如果你要缓存的数据超过800M的话,就会出现内存溢出的错误。所以说缓存是有限的。换名话说,你应该估计缓存集的大小,把缓存集的大小限制在10以内,否则它可能会出问题。

    1.cache的创建
       cache.Insert(string key,object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration)//只介绍有5个参数的情况,其实cache里有很几种重载
    参数一:引用该对象的缓存键
    参数二:要插入缓存中的对象
    参数三:缓存键的依赖项,当任何依赖项更改时,该对象即无效,并从缓存中移除。 null.">如果没有依赖项,则此参数包含 null。
    参数四:设置缓存过期时间
    参数五:参数四的依赖项,如果使用绝对到期,null.">slidingExpiration parameter must beNoSlidingExpiration.">则 slidingExpiration 参数必须为 NoSlidingExpiration

    绝对过期时间即:超过设定时间即过期

    相对过期时间:超过多少时间不调用就失效,单位为秒

    2.销毁cache
    cache.Remove(string key)//key为缓存键,通过缓存键进行销毁
    3.调用cache
    例如你存的是一个DataTable对象,调用如下: DataTable finaltable = Cache["dt"] as DataTable;
    4.一般什么时候选用cache
    cache一般用于数据较固定,访问较频繁的地方,例如在前端进行分页的时候,初始化把数据放入缓存中,然后每次分页都从缓存中取数据,这样减少了连接数据库的次数,提高了系统的性能。

    2. 本地缓存的作用?
    缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。
    1.减少IO操作,提高读取速度,提高性能,减轻服务器压力。

    3. 本地缓存的代码及方法

     获取:

    设置:

     移除:

     清空:

     代码工具类:

    using System;
    using System.Web;
    using System.Collections;
    using System.Web.Caching;
     
    public class CacheHelper
    {
        /// <summary>
        /// 获取数据缓存
        /// </summary>
        /// <param name="cacheKey"></param>
        public static object GetCache(string cacheKey)
        {
            var objCache = HttpRuntime.Cache.Get(cacheKey);
            return objCache;
        }
        /// <summary>
        /// 设置数据缓存
        /// </summary>
        public static void SetCache(string cacheKey, object objObject)
        {
            var objCache = HttpRuntime.Cache;
            objCache.Insert(cacheKey, objObject);
        }
        /// <summary>
        /// 设置数据缓存
        /// </summary>
        public static void SetCache(string cacheKey, object objObject, int timeout = 7200)
        {
            try
            {
                if (objObject == null) return;
                var objCache = HttpRuntime.Cache;
                //相对过期
                //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null);
                //绝对过期时间
                objCache.Insert(cacheKey, objObject, null, DateTime.Now.AddSeconds(timeout), TimeSpan.Zero, CacheItemPriority.High, null);
            }
            catch (Exception)
            {
                //throw;
            }
        }
        /// <summary>
        /// 移除指定数据缓存
        /// </summary>
        public static void RemoveAllCache(string cacheKey)
        {
            var cache = HttpRuntime.Cache;
            cache.Remove(cacheKey);
        }
        /// <summary>
        /// 移除全部缓存
        /// </summary>
        public static void RemoveAllCache()
        {
            var cache = HttpRuntime.Cache;
            var cacheEnum = cache.GetEnumerator();
            while (cacheEnum.MoveNext())
            {
                cache.Remove(cacheEnum.Key.ToString());
            }
        }
    }

    调用方式:

    public IEnumerable<CompanyModel> FindCompanys()
            {
                var cache = CacheHelper.GetCache("commonData_Company");//先读取
                if (cache == null)//如果没有该缓存
                {
                    var queryCompany = _base.CompanyModel();//从数据库取出
                    var enumerable = queryCompany.ToList();
                    CacheHelper.SetCache("commonData_Company", enumerable);//添加缓存
                    return enumerable;
                }
                var result = (List<CompanyModel>)cache;//有就直接返回该缓存
                return result;
            }

    测试结果:


    首次加载进来是为null,然后读取数据库,添加进缓存,当前返回前台的是从数据库中取出的数据。


    刷新页面,发现缓存中已经有了读出的30条数据,


    然后接下来走,返回缓存中的数据:

  • 相关阅读:
    菜根谭#188
    菜根谭#187
    Single value range only allowed in SystemVerilog
    LUTs, Flip-Flop, Slice
    FPGA 的 RAM 的 区别
    GPU core clock, shader clock ???
    更改Mac的Terminal 格式
    GPU share memory 的应用 (主要内容转载)
    Mac text edit & pdf reader
    Programming Font
  • 原文地址:https://www.cnblogs.com/wangdongying/p/13029366.html
Copyright © 2011-2022 走看看