大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务六,深度思考中的知识点——为什么要使用MEMCACHE?MEMCACHE有什么作用?
一、背景介绍
缓存
缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。
1、缓存的原理
(1)将数据写入/读取速度更快的存储(设备);
(2)将数据缓存到离应用最近的位置;
(3)将数据缓存到离用户最近的位置。
2、缓存分类
在分布式系统中,缓存的应用非常广泛,从部署角度有以下几个方面的缓存应用。
1、浏览器客户端:用户端的缓存
页面信息缓存在浏览器--------浏览器临时文件,通过请求头验证
2、Web层:针对web页面做缓存
(1)CDN缓存
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
(2)反向代理缓存
反向代理位于应用服务器机房,处理所有对WEB服务器的请求。如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载。
反向代理一般缓存静态资源,动态资源转发到应用服务器处理。常用的缓存应用服务器有Varnish、Ngnix、Squid。
3、应用服务层:
这里可以通过编程手段对缓存做到更精准的控制和更多的实现策略,这里缓存的对象是数据传输对象Data Transfer Object
java应用缓存一般分两种:
一个是进程外缓存,现在我们常用的各种分布式缓存;
另一个是进程内缓存--本地应用缓存,就是使用java应用虚拟机内存的缓存。
(3)分布式Cache;
分布式缓存,主要指缓存用户经常访问数据的缓存,数据源为数据库。一般起到热点数据访问和减轻数据库压力的作用。
目前分布式缓存设计,在大型网站架构中是必备的架构要素。常用的中间件有Memcache,Redis。
(4)本地应用缓存;
本地缓存是指应用内部的缓存,标准的分布式系统,一般有多级缓存构成。本地缓存是离应用最近的缓存,一般可以将数据缓存到硬盘或内存。
4、数据访问层:框架缓存
spring-cache、mybatis针对SQL语句做缓存
5、数据库内部:mysql内部缓存
在系统调优参数介绍了相关设置
二、知识剖析
1、memcached是一个高性能、分布式的内存对象缓存系统。
memcached广泛应用在大负载高并发的网站上,是一种非常成熟的产品(称为一项技术也未尝不可)。像facebook,youtube,yahoo,sina,sohu,netease,豆瓣等网站均或多或少使用了该项产品。memcached在以用户为中心的网站上,表现尤其突出,例如sns,blog等web2.0应用的站点。这些站点一般来讲,特别注重用户体验,用户对服务器的响应速度要求很高,用户数据相对比较复杂、关连度比较高,需要经常对数据库进行更新和检索。
2、Memcached 运行原理
Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key, 便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。 Memcached有两个核心组件组成:服务端(Server)和客户端(Client),在一个memcached的查询中,Client 先通 过计算key的hash值来确定kv对所处在的Server位置。当Server确定后,客户端就会发送一个查询请求给 对应的Server,让它来查找确 切的数据。因为这之间没有交互以及多播协议,所以 memcached交互带给网络的 影响是最小化的。
3、Memcached 作用
Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作。客户端首先与 Memcached 服务建立连接,然后存取对象。保存在 Memcached 中的对象是放置在内存中的,而不是在硬盘上。 Memcached 进程运行之后,会预申请一块较大的内存空间,自己进行管理,用完之后再申请,不是每次需要的 时候去向操作系统申请。Memcached将对象保存在一个巨 大的Hash表中,它还使用NewHash算法来管理Hash表, 从而获得进一步的性能提升。
三、常见问题
1、Memcache和Memcached到底有什么区别?
2、分配内存占满后如何清理?
3、memcached可以存储大数据吗?
四、解决方案
1、Memcache和Memcached到底有什么区别?
Memcache 是 danga.com 的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
Memcached 是一个开源、高性能、分布式内存对象缓存系统 。
Memcache 是这个项目的名称,而 memcached 是它服务器端的主程序文件名 。
2、分配内存占满后如何清理?
Memcached中每个slab中都维护了一个LRU链表,来组织该slab中已经被分配的item块,用于记录“最近最少使用”的item信息。其中heads指向链表的头节点,tails指向链表的尾节点。每当有新chunk被使用时,将会将该chunk的item添加到LRU链表头。或者有原使用的item被修改,也会将其从链表中移动到LRU链表头处。通过该机制,保证了链表头部分的的item为新创建或新修改的数据,链表尾item为该slab中储存最久的数据。
Memcached采用了惰性删除的机制,系统不会主动监视item中数据是否过期,而是在get的时候查看该item的时间戳,如果已过期就删除并将该chunk释放到空闲链表中。
同时在新数据插入中,Memcached也会优先判断该slab的LRU链表尾部的item节点是否超时,如果超时的话,Memcached也会优先删除并使用已经超时的item的chunk作为新数据的储存空间。
3、memcached可以存储大数据吗?
Memcached存储单个item最大数据是在1MB内,假设数据超过1M,存取set和get是都是返回false,并且引起性能的问题。
memcached能接受的key的最大长度是250个字符
五、编码实战
类比理解:
mysql-----JDBC
memcache-----memcachedClient
redis--------jedis
因为都是通过java代码去操作数据库(关系型数据库和非关系型数据库),所以很相似
六、扩展思考
1、什么时候使用memcached?
假设站点包括了訪问量非常大的动态网页。因而数据库的负载将会非常高。因为大部分数据库请求都是读操作,那么memcached能够显著地减小数据库负载。
假设数据库server的负载比較低但CPU使用率非常高,这时能够缓存计算好的结果( computed objects )和渲染后的网页模板(enderred templates)。
利用memcached能够缓存session数据、暂时数据以降低对他们的数据库写操作。
缓存一些非常小可是被频繁訪问的文件。
2、简单理解缓存算法
1、LFU:对缓存的数据块的引用次数进行排序,次数相同则根据时间排序,满了之后淘汰最后一个;
2、LRU:将被访问的数据块放在最上面,最下面的先淘汰;
3、FIFO: 最先进入的数据,最先被淘汰;
在LRU的基础上:
4、 2Q:第一次访问放入FIFO,第二次被访问放入LRU;
5、LRU-K:一句话说不清, 其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”
七、参考文献
http://flychao88.iteye.com/blog/1977653
https://www.cnblogs.com/sten/p/5734512.html
https://blog.csdn.net/qq_26517369/article/details/78330694
https://blog.csdn.net/sxj6977380/article/details/78759491
8.更多讨论
1、memcached的优点?
Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信,因此不会增加 memcached的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached的集群很好用。内存不够了?增加几台 memcached吧;CPU不够用了?再增加几台吧;有多余的内存?在增加几台吧,不要浪费了。
2、MemCache的限制和特性
(1)MemCache中可以保存的item数据量是没有限制的,只要内存足够
(2)MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制
(3)Key最大为250个字节,超过该长度无法存储
(4)单个item最大数据是1MB,超过1MB的数据不予存储
(5)MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效
(6)不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作
(7)MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序
(8)MemCache设置添加某一个Key值的时候,传入expiry为0表示这个Key值永久有效,这个Key值也会在30天之后失效。
3、Memcache与Redis的区别都有哪些?
(1)存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。
(2)数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。
(3)使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
感谢观看,如有出错,恳请指正