上次主要讨论缓存读写这块各种代码实现,本篇就上次的问题继续来,看看那些年折腾过的各种缓存做法。

阅读目录:

  1. 缓存预热
  2. 多级缓存
  3. 线程缓存
  4. 内存缓存
  5. 文件缓存
  6. 分布式缓存
  7. DB缓存
  8. 多层缓存
  9. 总结

缓存预热

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

单机Web情况下一般使用RunTimeCache,这种情况下:

可以在启动事件里面刷新

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

另外可以单写个刷新缓存页面,上线后手动刷新下或发布时自动调用刷新,再或者由用户自行触发。

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

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

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

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

多级缓存

计算机结构中CPU和内存之间一般都配有一级缓存、二级缓存来增加交换速度。

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

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

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

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

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

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

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

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

线程缓存

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

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

而通过线程缓存,可以让当前处理用户请求的线程只拿自己需要的数据。

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

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

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

因为不用重新拿新缓存数据,所以也不用担心数据撕裂的问题。

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

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

内存缓存

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

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

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


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

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

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

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

文件缓存

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

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

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

分布式缓存

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

基于文件nosql的Casssandra、mongodb等。

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

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

DB缓存

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

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

多层缓存

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

1:上面介绍的多级缓存就是一种,把内容根据读取频率,分不同的等级、不同的层次进行存储,频率越高离查询越近。

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

3:从架构上来说浏览器缓存、CDN缓存、反向代理缓存、服务端缓存、也是多层缓存。

总结

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

比如分布式缓存的使用,缓存置换策略及算法,缓存过期机制等。

系列目录:

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

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

那些年我们一起追过的缓存写法(三)

那些年我们一起撸过的缓存写法相关推荐

  1. 那些年我们一起追过的缓存写法(二)

    感谢园子里的同学对上一篇的支持,很高兴楼主的一些经验及想法能够对大家有一些帮助. 上次主要讨论缓存读写这块各种代码实现,本篇就上次的问题继续来,看看那些年折腾过的各种缓存做法. 阅读目录: 缓存预热 ...

  2. ehcache缓存原理_贼厉害,手撸的 SpringBoot缓存系统,性能杠杠的!

    缓存是最直接有效提升系统性能的手段之一.个人认为用好用对缓存是优秀程序员的必备基本素质. 本文结合实际开发经验,从简单概念原理和代码入手,一步一步搭建一个简单的二级缓存系统. 一.通用缓存接口 1.缓 ...

  3. 编写线程安全的Java缓存读写机制 (原创)

    一种习以为常的缓存写法: IF value in cached THENreturn value from cache ELSEcompute valuesave value in cacheretu ...

  4. 写缓存java,编写线程安全的Java缓存读写机制 (原创)

    一种习以为常的缓存写法: IF value in cached THEN return value from cache ELSE compute value save value in cache ...

  5. 多域名下Mvc的Http缓存冲突的问题

    最近在做PageAdmin cms时候,栏目页用了http缓存,iis站点绑定了多个域名,后台也是每个站点绑定多个域名,最开始的http缓存写法如下: HttpCachePolicyBase cach ...

  6. SpringBoot使用@Cacheable实现最简单的Redis缓存

    前言 之前我们使用过RedisTemplate来实现redis缓存,然后使用工具类来实现操作redis的存储.这样的方式好处是很自由,但是还不是最简单的处理方式.对于一些简单的应用来说,其实redis ...

  7. 博客园技术系列文章目录

    目录1.5版-2015 05 05 如果大家觉得不全,或者有更好的可以评论里面留言啊,后续还会有2.0  3.0  n.0版本 关于大型网站的思考--夏森 http://www.cnblogs.com ...

  8. 重磅发布 | 承载亿级流量的开发框架,闲鱼Flutter技术解析与实战大公开

    简介: 闲鱼是国内最早接触使用 Flutter 的团队,经过多次研讨验证并大规模上线,在App性能.稳定性.开发效率上收益甚多.现在,闲鱼将这个过程中的一手实践知识和技术沉淀,整理成册 --<F ...

  9. 从原生到黑科技:闲鱼 Flutter 图片优化经历了什么?

    简介:阿里妹导读:图片加载是 APP 最常见也最基本的功能,也是影响用户体验的因素之一.在看似简单的图片加载背后却隐藏着很多技术难题.本文介绍闲鱼技术团队在 Flutter 图片优化上所做的尝试,分享 ...

最新文章

  1. Linux创建两个相同的用户,在Linux系统中一次创建多个用户
  2. Matlab学习笔记(三)
  3. 网易游戏2019暑期实习开发岗笔试题
  4. weblogic12 linux部署,linux系统中安装部署weblogic12.1.3
  5. 为什么所有的React应用开头都有一行meta charset=utf-8语句?
  6. [学习笔记]批次需求计划系统-简要
  7. ue4蓝图和ai的区别_UE4 AI基础
  8. [ES6] 细化ES6之 -- 函数的扩展
  9. C# 替换string字符串指定位置的字符
  10. BIN文件和HEX文件差异
  11. Codeforces Round #363 (Div. 2) B. One Bomb(思维题目)
  12. Robotaxi里程竞赛开启,激光雷达成新热点 | 2021年自动驾驶趋势解读
  13. 录屏——制作gif图片——压缩图片大小
  14. JDK1.8的安装方式
  15. 数据安全分类分级实施指南_不平衡数据集分类指南
  16. vc驿站视频教程笔记2 ansi 和 unicode
  17. 【matlab系列汇总】matlab学习实战快速进阶之路(持续更新)
  18. JavaSE_02基本语法-编程单词词汇
  19. Arduino基础入门篇08—播放音乐
  20. 老男孩python全栈开发视频教程_老男孩Python全栈开发(92天全)视频教程 自学笔记05...

热门文章

  1. 必须掌握的十个电脑技巧
  2. 全球与中国PVD真空镀膜设备市场深度研究分析报告
  3. pyhton学习笔记-爬虫相关-多进程同步异步的代码实现
  4. C++ Parcel
  5. 计算机编程数学英语不好怎么办,英语和数学不好的人是不是学不会编程?
  6. 网络安全之信息收集(二)
  7. 快速求出淘汰赛中轮空场次-最简单的算法
  8. Shell 获取当前时间整点
  9. 人工智能行业研究:史上最伟大的科技革命
  10. windows Media Player 9.0网页播放器