cashe(缓存)【转】

缓存的英文名称叫做 Cache,是个法国词汇,每个字符里都流淌着高贵的血统。缓存的概念最早来源于1967年的一篇电子工程期刊论文,论文作者将「Cache」赋予了「safe keeping storage」的概念,用于计算机领域。

缓存最早出现主要是为了老大哥 CPU 服务的,为了减少 CPU 访问内存所需平均时间,增加了缓存技术。随着硬件技术和操作系统的发展,这部分技术牢牢地掌握在一些巨型芯片公司手里,那里的程序员每天游走在 CPU、Cache、SRAM、、write-through 和 write-back 之间,仿佛掌控着天地间每一个流动字节的意义,自信而优雅,我们把他们叫做文艺程序员。如果你想做一个文艺程序员,请用 Google 百度一下「CPU 缓存」,如果你不会用 Goolge,那么,最好离文艺远一点。

普通程序员需要关注什么类型的缓存呢?比如磁盘缓存、Web 缓存、网络缓存、分布式缓存,等等,这些是我们在开发系统软件和互联网服务时常常要用到的技术。那么,二逼程序员呢?哦,他们只要知道用 Hashtable 做缓存就够了。

缓存的意义是什么?简单来说,缓存是存储数据的一个临时场所,由于获取原始数据的代价太大了,所以,我们会把一些使用频繁的数据放到一个更容易读取,操作更快的池子(一般是内存)里,为这些数据分门别类,打上标签,这样用户发来请求的时候,我们先在缓存池里进行快速检索,如果拿到数据就直接返回给用户;如果没有,再去数据库或其他介质获取原始数据返给用户,同时把该数据打上标签,放入缓存池。

就像你开了一个鞋店,店里永远会存放一部分热销和新款的皮鞋,如果客户每次看鞋买鞋的时候,你都要说等一哈,库房就在五公里外,我去去就回。等你热气腾腾跑完一个十公里回来,你发现,连女消费者都走了。

网络世界也是一样,如果没有缓存,用户所有的请求都会直接穿透层层网络,打到数据库和磁盘 IO 上,随着数据量的增加,用户每次请求的时间会越来越长,这样的后果是,磁盘不高兴,数据库不高兴,用户也不高兴,然后就是数据库率先罢工,用户离你而去,你,依然木有女朋友。

既然缓存这么重要,拥有大量用户的互联网应用都应该增加缓存服务了,那么是不是搞个 Hashtable 就可以了呢?我们可以先了解一些缓存的术语。

用户发起了一个热点数据的请求,系统接收到这个请求之后,就需要根据用户的数据信息(key)去缓存池里寻找数据,如果根据用户提供的 Key 找到了这个条目,并返回给用户,这个过程叫一次缓存命中。

如果在缓存里没找到需要的数据,在缓存空间还有空闲的情况下,系统会去原始数据源(一般是数据库)获取信息,返回给用户,并把数据条目存储到缓存中,以备不时之用。如果缓存空间已经达到上限,那么就要根据缓存替代策略,把旧的数据对象销毁,把新的对象放入缓存池。

对于缓存服务的设计来说,命中率高的缓存系统,性能越好,命中率高,消耗的时间和资源越少。所以缓存服务并不是简单的搭建一个 Memcached、Ehcache 或 Redis 就可以了,相关的技术,应用在合适的业务场景中,才能最大化的利用缓存的价值。

上述场景中,缓存没有命中的时候,系统会从原始数据源中获取数据,一般是数据库或文件系统,然后再把数据放入缓存池中。这个过程需要的时间和空间,就是缓存成本。

一般为了避免缓存成本过高,系统初始化的时候,会同时进行缓存池的初始化,把我们需要的,已知的数据尽可能多的提前放入缓存池,这样可以最大程度的提升缓存命中率,降低缓存成本。

当缓存中的数据需要更新的时候,说明缓存中的数据已经失效了,这时候就需要有相关的服务进行实时的数据更新,同时要保证数据的一致性,不能让系统拿到已经失效的数据到处去招摇撞骗,这种情况,系统和用户的内心,都是拒绝的。

编程小球们初入江湖的时候,一般会觉得内存是可以无限使用了,看到服务器上标着 64G 内存这样金光闪闪的配置之后,他们更觉得「广阔天地,大有可为」,于是在系统里 new 出了一个又一个的 Hashtable,然后不停的往里面加入数据读出数据,事实上,如果是三少系统(用户少、数据少,功能少),这样做一时半会还真出不了系统问题。如果是系统级的缓存服务,要考虑的事情就比较多了。

每个缓存产品,一般都会有一个类似 maxmemory 的最大内存使用参数,这个参数肯定是小于物理内存的。一旦缓存数据达到上限,而又出现缓存没有命中的情况时,系统就会踢出一些老弱病残的缓存数据,加入新条目。判断老弱病残的标准是什么呢?这就是替代策略。最理想的做法当然是把最没用的数据踢出去,但是,做到最理想永远是最难的,就像你永远想找到团队里最没用的那一个将其淘汰掉,但执行的时候总是极其艰难。因为除了数据,还有情绪。

幸好,数据没情绪,我们可以通过算法搞定这件事。

常用的一些算法包括:FIFO、LFU、LRU、LRU2、ARC等。

FIFO 就是先进先出,一种非常简单的算法,缓存数据达到上限的时候,最先进入缓存的数据会最先被踢出去。很多老员工看到这一条都义愤填膺,所以,这个算法注定是不被喜欢的,但是由于它简单直接,很多开发者喜欢。嗯,有些企业老板也比较喜欢。Second Chance 和 CLock 是基于 FIFO 的改进,算法更加先进合理,也更复杂,微信里写了也没人看,感兴趣的话,Google「缓存算法 CLock」等。

LFU 的全称是 Least Frequently Used,最少使用算法,系统会为每个对象计算使用频率,最不常用的缓存对象会被踢走,简单粗暴。缺点是,一个传统工业时代曾经被重用过的老员工,在互联网时代没用了,由于其前期使用频率很高,吃老本,所以数据会一直保存在缓存系统中,反而是后起之秀,往往会遭遇到误杀的不公正待遇。差评。

LRU 的全称是 Least Recently Used,也就是最近最少使用算法。基本思路是,如果一个数据最近一段时间被使用的频率很少,那将来被用到的可能性也会很低。看到这儿,那些近期没什么开发任务的童靴,你们要小心了。好评。

LRU2 和 ARC 都是基于 LRU 的改进,有兴趣的可以上网查查。

很多我们耳熟能详的缓存产品,比如 Memcached、Redis、Ehcache、OSCache等,都参考了类似的算法,要么进行加强,要么进行简化,目标就是提升缓存的命中率,降低缓存成本。

了解了这些够不够?当然不够,你还需要进行大量的实践和业务验证,才能找到最合适你的系统的缓存策略。另外,当你的数据量、访问量和可靠性要求越来越高的时候,你还需要考虑分布式缓存,以提升缓存容量和扩展性。但是缓存分布了,又带来更多的问题,比如单点失效,命中率,并发,数据同步等等。这样写起来就木有完了是不是?所以给大家推荐两篇文章:

一种基于「哨兵」的分布式缓存设计:

[http://blog.lichengwu.cn/architecture/2015/06/14/distributed-cache/]

分布式缓存的一起问题:

http://timyang.net/data/cache-failure/

原文链接:http://chijianqiang.baijia.baidu.com/article/148570

时间: 2024-07-31 06:07:30

cashe(缓存)【转】的相关文章

linux 系统管理技巧

查看磁盘状态命令 iostat -x   磁盘使用   # 查看 tm  %util  说明的等待的占比是多少,数值越大说明磁盘太差 iotop 磁盘使用       # 具体查看哪个占用的数据大 # 更详细的查看磁盘状态 free  查看内存的使用情况 free -h   以Gb的单位显示 [[email protected] ~]# free -h     #单位是GB             total       used       free     shared    buffers

Apache Ignite——新一代数据库缓存系统

Apache Ignite是一个通用的数据库缓存系统,它不仅支持所有的底层数据库系统,比如RDBMS.NoSQL和HDFS,还支持Write-Through和Read-Through.Write-Behind Caching等可选功能. Apache Ignite是一个聚焦分布式内存计算的开源项目,它在内存中储存数据,并分布在多个节点上以提供快速数据访问.此外,可选地将数据同步到缓存层同样是一大优势.最后,可以支持任何底层数据库存储同样让 Ignite成为数据库缓存的首先.

数据字典实现缓存

数据字典的好处很多比如: 1.可以减少使用表,来专门记录类型. 2.类型使用key检索,或者报表统计分析,在一定程度上相比汉字来讲,效率好得多. 3.使用缓存的数据字典.也可以减少不少的io操作. 等等.... 首先,库表设计就智者见智了.不多说.爱怎么设计就怎么设计. 完整的数据字典设计 ,需要 1.生成select 自定义标签. 2.list页面,或者get页面, 一个key转 value的标签 使用自定义标签,搭配上缓存的数据字典是最方便.最完美的解决办法, 接下来,就直接贴代码了. 一.

4.缓存控制技术

动态网站的数据都是从数据库获取而来的.所以网站的瓶颈往往就是反复连接数据库和大量的SQL语句查询的执行.由于HTTP协议是无状态性的,所以每次对页面请求都会执行相同的操作.我们可以让页面内容本身变化不大但是偶尔还是要变化的页面(例如新闻网站)缓存起来作为静态的页面,下一次再访问的时候直接访问静态的HTML页面即可. ① Smarty里面控制缓存 需要做3步工作:开启缓存,指定缓存目录,定义缓存的生命周期

Shiro缓存(十三)

使用缓存,可以解决每次访问请求都查数据库的问题.第一次授权后存入缓存. 缓存流程 shiro中提供了对认证信息和授权信息的缓存.shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的.主要研究授权信息缓存,因为授权的数据量大. 用户认证通过. 该 用户第一次授权:调用realm查询数据库 该 用户第二次授权:不调用realm查询数据库,直接从缓存中取出授权信息(权限标识符). -------------------------------------使用ehcache缓存框架

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存

nginx三 之缓存模块

友情提示: 缓存模块是在动静分离的环境基础上搭建,动静分离可以参考http://www.cnblogs.com/dahuandan/p/6759212.html 介绍 提高网站响应速度是web应用不容忽视的目标,在之前动静分离的基础上,我们已经降低了后端服务器压力,提高了处理请求的性能,但是用户请求的静态资源是从硬盘读取,相比内存的性能还有很大的提高: Nginx自带的缓存模块可以把静态资源缓存到内存中,提高了用户请求静态资源的速度,并且nginx自带缓存模块配置简单,使用灵活,搭配第三方插件可

一个缓存容灾写的样例

背景 有时我们能够使用缓存进行容灾的处理.场景例如以下:我们当前有一个专门提供各种数据的应用DataCore,该应用开放多个RFC方法供其它应用使用.      我们平时在读写数据时,会在Cache备份一份(为平时DataCore提高响应速度.减少DB.CPU压力所用),当DB挂掉的时候.Cache还能够用来容灾.使用缓存容灾的优点是:性能足够好,坏处是缓存可比数据库成本高多了. 让我们想象得更猛烈些,当DataCore整个挂掉的时候,A.B.C.D方怎么才干安然的执行下去? 我们能够在A.B.

浏览器缓存机制浅析

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每