缓存系列篇<二>
来源:互联网 发布:软件变成仿手绘 编辑:程序博客网 时间:2024/05/21 07:15
分享目录
1、 缓存概述
2、 浏览器缓存
3、 CDN缓存
4、 反向代理缓存
5、 本地缓存
6、分布式缓存
四、反向代理缓存
反向代理是指在网站服务器机房部署代理服务器,实现负载均衡,数据缓存,安全控制等功能。
4.1 缓存的原理
反向代理位于应用服务器机房,处理所有对WEB服务器的请求。如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载。
反向代理一般缓存静态资源,动态资源转发到应用服务器处理。常用的缓存应用服务器有Varnish,Ngnix,Squid
有关nginx相关的文章将在后续发布,望多多支持!
五、分布式缓存
CDN,反向代理缓存,主要解决静态文件,或用户请求资源的缓存,数据源一般为静态文件或动态生成的文件(有缓存头标识)。
分布式缓存,主要指缓存用户经常访问数据的缓存,数据源为数据库。一般起到热点数据访问和减轻数据库压力的作用。目前分布式缓存设计,在大型网站架构中是必备的架构要素。常用的中间件有Memcache,Redis。
5.1 Memcached
Memcache特性:
(1)使用物理内存作为缓存区,可独立运行在服务器上。每个进程最大2G,如果想缓存更多的数据,可以开辟更多的memcache进程(不同端口)或者使用分布式memcache进行缓存,将数据缓存到不同的物理机或者虚拟机上。
(2)使用key-value的方式来存储数据,这是一种单索引的结构化数据组织形式,可使数据项查询时间复杂度为O(1)。
(3)协议简单:基于文本行的协议,直接通过telnet在memcached服务器上可进行存取数据操作,简单,方便多种缓存参考此协议;
(4)基于libevent高性能通信:Libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,与传统的select相比,提高了性能。
(5)内置的内存管理方式:所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失。memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)
Slab Allocator的缺点
Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。
(6)分布式:各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于memcache客户端。
如下图所示:
(7)缓存策略:Memcached的缓存策略是LRU(最近最少使用)到期失效策略。在memcached内存储数据项时,可以指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载
5.1.1 Memcached的工作原理
MemCache的工作流程如下:
(1)先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;
(2)如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序实现);
(3)每次更新数据库的同时更新memcached中的数据,保证一致性;
(4)当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
5.1.2 Memcached集群
memcached 虽然称为 “ 分布式 ” 缓存服务器,但服务器端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。memcached 的分布式,是由客户端程序实现的。当向memcached集群存入/取出key value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key value值存到此服务器中。
分布式算法:选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
余数算法:先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器。
优点:计算简单,高效;
缺点:在memcached服务器增加或减少时,几乎所有的缓存都会失效。
一致性hash算法
按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。如下图现在我们将object1、object2、object3、object4四个对象通过特定的Hash函数计算出对应的key值,然后散列到Hash环上。如下图:
Hash(object1) = key1;
Hash(object2) = key2;
Hash(object3) = key3;
Hash(object4) = key4;
在采用一致性哈希算法的分布式集群中将新的机器加入,其原理是通过使用与对象存储一样的Hash算法将机器也映射到环中(一般情况下对机器的hash计算是采用机器的IP或者机器唯一的别名作为输入值),然后以顺时针的方向计算,将所有对象存储到离自己最近的机器中。
假设现在有NODE1,NODE2,NODE3三台机器,通过Hash算法得到对应的KEY值,映射到环中,其示意图如下:
Hash(NODE1) = KEY1;
Hash(NODE2) = KEY2;
Hash(NODE3) = KEY3;
通过上图可以看出对象与机器处于同一哈希空间中,这样按顺时针转动object1存储到了NODE1中,object3存储到了NODE2中,object2、object4存储到了NODE3中。在这样的部署环境中,hash环是不会变更的,因此,通过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象真正的存储位置了。
1. 节点(机器)的删除
以上面的分布为例,如果NODE2出现故障被删除了,那么按照顺时针迁移的方法,object3将会被迁移到NODE3中,这样仅仅是object3的映射位置发生了变化,其它的对象没有任何的改动。如下图:
2. 节点(机器)的添加
如果往集群中添加一个新的节点NODE4,通过对应的哈希算法得到KEY4,并映射到环中,如下图:
通过按顺时针迁移的规则,那么object2被迁移到了NODE4中,其它对象还保持这原有的存储位置。通过对节点的添加和删除的分析,一致性哈希算法在保持了单调性的同时,还是数据的迁移达到了最小,这样的算法对分布式集群来说是非常合适的,避免了大量数据迁移,减小了服务器的的压力。
- 缓存系列篇<二>
- Redis系列(二)--缓存设计(整表缓存以及排行榜缓存方案实现)
- jQuery1.7系列二: jQuery的缓存机制
- memcache系列---缓存代理类的实现(二)
- Ehcache系列二:Spring缓存注解@Cache使用
- 内存缓存__DiscuzX2.0缓存的用法与缓存机制解析[调用与更新缓存]系列二
- 缓存系列--缓存策略
- Spring Boot系列(十五) 安全框架Apache Shiro(二)缓存-基于Hazelcast的分布式缓存
- springboot缓存篇(二)-redis 做缓存
- 缓存系列:C#缓存简介
- IHttpHandler 系列二 应用篇
- 配置单网卡的ISA缓存服务器:ISA2006系列之二十七
- 网页优化系列二:使用Cache缓存静态文件、图片(asp.net版)
- Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式
- TCP的发送系列 — 发送缓存的管理(二)
- 大型网站架构系列:缓存在分布式系统中的应用(二)
- 大型网站架构系列:缓存在分布式系统中的应用(二)
- 大型网站架构系列:缓存在分布式系统中的应用(二)
- 欢迎使用CSDN-markdown编辑器
- running ANDROID - ERROR - "__bionic_open_tzdata_path: ANDROID_DATA not set!"
- J S : 实现用户登录验证码
- makefile编写过程中的难点
- SSM框架---增删查改
- 缓存系列篇<二>
- JDK中logging包中的类
- android 写的很好的博客
- Git和GitLab的使用
- 微信公众号付款asp.net版本
- matconvnet卷积神经网络库的安装
- cyk的游戏
- 数组中的逆序对
- nodejs开发设计