关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » .NET »连载:那些年我们一起追过的缓存写法(二)

    连载:那些年我们一起追过的缓存写法(二)

    2015-03-04 00:00:00 出处:InfoQ - 邵思华
    分享

    上次主要讨论缓存读写这块各种代码实现。本篇是就上次的问题接着来,继续看那些年我们各种缓存用法。

    一:缓存预热

    上次有同学问过。在第一次加载时,我们的缓存都为空,怎么进行预热。

    单机Web情况下,一般我们使用RunTimeCache。相对于这种情况下:

    1:我们可以在启动事件里面刷新

    void Application_Start(object sender, EventArgs e)
    {
           //刷新
    }

    2:单写个刷新缓存页面,上线后手动刷新下、或发布时自动调用刷新、或干脆由用户自行触发。

    分布式缓存(Redis、memcached)情况下:

    比如:在几十台服务器缓存时,单刷满缓存都需要不少一段时间。

    这种预热就复杂一些,有的会单写个应用程序去跑,也有的会单写套框架机制去处理(更智能化)。

    目的都是在上线之前:所有的缓存都预先加载完毕。

    二:多级缓存

    2.1 介绍

    我们晓得在CPU和内存之间一般都配有一级缓存、二级缓存来增加交换速度。

    这样当CPU调用大量数据时,就可避开内存直接从CPU缓存中调用,加快读取速度。

    根据CPU缓存得出多级缓存的特点:

    1:每一级缓存中储存的是下一级缓存的一部分。

    2:读取速度按级别依次递减,成本也依次递减,容量依次递增。

    3:当前级别未命中时,才会去下一级寻找。

    而在企业应用级开发中,使用多级缓存是同样的目的及设计,只是粒度更粗,更灵活。

    根据速度依次排列lv1-lv6的缓存类型图:

    3级缓存的命中流程图例子:

    2.2 线程缓存

    Web应用是天生的多线程开发。对于一些公共资源我们必须考虑线程安全,为止我们不得不通过锁来保证数据的完整性和正确性。

    在实际当中,一台web服务器至少也得处理成百上千的请求。想一想,在业务复杂的处理流程,函数每调用一次我们都得锁一下。

    对服务器也是个不小的浪费。而通过线程缓存,可以让当前处理用户请求的线程只拿自己需要的。

    public static ThreadLocal<UserScore> localUserInfo = new ThreadLocal<UserScore>();

    借助Net提供的线程本地变量,我们可以在请求入口去拉取当前用户的数据。

    在之后线程整个生命周期里面,我们的业务逻辑可以毫无顾虑的使用这些数据,不需要考虑线程安全。

    而且我们不用重新拿新数据,所以也不用担心数据撕裂的问题。

    因为当前线程周期里面的数据是完整无误的,而只有用户第二次发起请求才会重新去拿新数据。

    这样就能提高不少我们服务器吞吐量。注意要在线程出口销毁数据。

    2.3 内存缓存

    无论是远程数据库读取,还是缓存服务器读取。避免不了要跨进程,跨网络通信,有的还跨机房。

    而应用程序频繁读写,对Web、DB服务器都是个不小的消耗,速度相较内存也慢的多。

    代码上加锁、异步,甚至加服务器在内,都不是一个很好的办法。因为加载速度,对用户体验非常重要。


    所以在有要求的项目中使用本地内存做二级缓存,是非常有必要的。目的就是1:抗并发,2:加快读取速度。

    有个著名的缓存五分钟法则法则,就是说如果一个数据频繁被访问,那么就应该放内存中。

    举个例子: 有100并发过来,加锁会导致前端99线程等候,这个99线程等候着,其实是一直在消耗Web服务器资源。不加就是缓存雪崩。

    如果我们每分钟拉取一份缓存,缓存到内存,这样99线程等候时间极大缩短。

    2.4 文件缓存

    相对于内存,硬盘容量大,速度相较于走网络还更快。

    所以我们完全可以把一些不经常变更,放在内存又比较浪费的数据缓存到本地硬盘。

    比如使用sqlite一些文件数据库,我们很容易做到。

    2.5 分布式缓存

    基于内存缓存的redis、memcached等。

    基于文件nosql的Casssandra、mongodb等。

    redis、memcached是主流的分布式内存缓存,也是应用和DB中间最大的缓存层。

    nosql这类的其实不单单只是做缓存用了,完全用在一些非核心业务的DB层了。

    2.6 DB缓存

    这一层DB主要是缓存由原始数据计算出的结果。而避免由Web程序通过SQL或在使用中直接计算。

    当然我们也可以把计算好的数据,存储到redis做缓存。

    三:多层缓存

    多层缓存概念在很多地方都用到过:

    1:上面我们说的多级缓存就是一种,把内容根据读取频率等级,分不同的层次存储,频率越高就越近。

    2:还一种多层是缓存索引的做法,类B树查找,这样能提高检索效率。

    3:从架构上来说客户端缓存,CDN缓存,反向代理缓存,服务端缓存,也是多层缓存。

    四:总结

    在使用上,大家根据实际场景,进行各种组合搭配。本篇谈的比较理论些,很多内容细节没展开。

    比如分布式缓存使用,缓存置换策略及算法,缓存过期机制等。后面楼主会继续补充下去。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    如何删除自带的不常用应用为windows 7减负

    MySQL中多表删除方法

    改进的二值图像像素标记算法及程序实现

    windows 7 32位系统下手动修改磁盘属性例如M盘修改为F盘

    windows 7中怎么样在家庭组互传文件

    Linux应用集成MySQL数据库访问技巧

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。