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

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

一:缓存预热

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

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

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

1
2
3
4
voidApplication_Start(object sender, EventArgs e)
{
       //刷新
}

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

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

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

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

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

二:多级缓存

2.1 介绍

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

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

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

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

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

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

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

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

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

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

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

2.2 线程缓存

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

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

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

1
publicstaticThreadLocal<UserScore> localUserInfo =newThreadLocal<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缓存,反向代理缓存,服务端缓存,也是多层缓存。

四:总结

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

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

原创文章,作者:stanley,如若转载,请注明出处:http://www.178linux.com/686

(0)
stanleystanley
上一篇 2015-03-03 18:38
下一篇 2015-03-04 13:30

相关推荐

  • 实验:配置静态路由1

    实验:配置静态路由1 IP地址规划如下: 注意,环境准备: 1、MAC地址不要有冲突,如果是复制的虚拟机,对于centos6需删除网卡定义文件rm -f /etc/udev/rules.d/70-persistent-net.rules 2、清空防火墙iptables -F(查看:iptables -vnL) 3、启用IP转发功能:echo 1 > /…

    2017-03-26
  • 每日一练–8.2 用户管理,权限管理

    (1)显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录。     ll /var/l*[[:digit:]]*[[:lower:]] (2)显示以/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录      ll /etc/[[:digit:]]*[^[:dig…

    Linux干货 2016-08-05
  • N25_第三周作业_leon

    N25_第三周作业_leon 1.       列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who 全部 jj       tty1  …

    Linux干货 2017-01-06
  • vim编辑器的常见使用

    1、vim介绍 Vim是从 vi 发展出来的一个文本编辑器,处理文本文件功能强大。 三种主要模式: Vim打开文件,默认命令(Normal)模式,可以移动光标,剪切和粘贴。 按键i 进入插入(Insert)模式,用户可以编辑文本。 扩展(Extended)命令模式(或末行模式)用户:wq可保存退出,或者:q!强制退出。 Exc按键可退出当前模式。 2、文本操…

    Linux干货 2017-07-30
  • linux发展史-

    前言: 人类文明的进步伴随着战争,战争留下的产物也是非常伟大的。 最初用于战争的通电钢铁,如今以进入人们生活。 而它的附带产物如今也是变得妙不可言。 本文简要说明操作系统的发展过程,以及该大树下一些分支。         简 述   Linux是诞生与UNIX下的一款操系统,有着安全稳定的文件系统,…

    Linux干货 2016-10-19
  • 文本处理练习题

    文本处理练习:   1.找出本机ip地址   [root@localhost ~]# ifconfig |head -2 |tail -1 |tr -s ' ' ':' |cut -d: -f3   10.1.252.221   2.查看本机分区最大的利用率   [root@l…

    Linux干货 2016-08-08