memcached原理及介绍- memcached介绍
- 提速方法 :
- memcached特征 :
- memcached作用 :
- memcached适合做的东西 :
- memcached工作原理 :
- memcached内存算法 :
- memcached缓存策略 :
- memcached失效策略 :
- memcached分布式算法 :
- memcached与redis比较
memcached介绍
代码语言:javascript
复制memcached是一种缓存技术,在存储在内存中(高性能分布式内存缓存服务器).目的 : 提速.(传统的都是把数据保存在关系型数据库管理系统既RDBMS,客户端请求时会从RDBS中
读取数据并在浏览器中显示,这样当访问量过大时或集中时,导致RSBMS负担过重,数据库响应恶化,浏览器中显示延迟等严重问题,使用memcached减少数据库查询和访问次数以
提供访问速度,提供扩展性)memcached为key->value非关系型数据库,key为一般子串,值唯一.value除了php中的资源不能存,其它的数据都能存储(字符串,数值,数组,对象,布尔值
,null,二进制<图片,视频>)
提速方法 :
代码语言:javascript
复制1.传统 : 模拟cached方法(存储到数据库时生成一份静态文件到磁盘中)
2.直接操作内存(内存表,memcached服务维持了一张内存表hashdata)
3.CPU寄存器(最高速的,但是代价成本高)
memcached特征 :
代码语言:javascript
复制1.协议简单(文本行协议)
2.基于libevent事件处理(注 : libevent是一个程序库,封装了linux的epoll,BSD等操作系统的kqueue等事件处理功能.即使对服务器的连接数添加,也能发挥O(1)的性能.
memcached在linux,BSD等操作系统上能发挥其高性能.)
3.内置内存存储方式(存储在memcached内置的内存存储空间中,提高性能.问题 : memcached重启或操作系统重启数据会丢失,达到一定量后会启动算法自动删除不使用的缓存)
4.不互相通信的分布式(不互相通信共享信息)
memcached作用 :
代码语言:javascript
复制1.高性能分布式缓存服务器(缓存数据库查询结果,减少数据库访问次数)
缓存读取/写入过程 : 首次访问 : 从RDBMS中取得数据保存到memcached;第二次后 : 从memcached中取得数据显示页面.
memcached适合做的东西 :
代码语言:javascript
复制1.访问频繁的字典数据
2.大量的hot数据(热门数据缓存)
3.页面缓存(web站常用)
4.搜索的查询条件和结果(热门搜索的内存缓存起来)
5.临时处理数据(不需要入库,排重)
memcached工作原理 :
代码语言:javascript
复制memcached的工作就是在专门的机器的内存里维护一张巨大的hash表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率.
采用的是C/S模式,在server端启动服务进程,在启动时可以指定监听的ip,自己的端口号,所使用的内存大小等几个关键参数.采用了单进程,单线程,异步I/O,基于事件(event_based)
的服务方式.使用libevent作为事件通知实现.每个Server只是对自己的数据进行管理.Client端通过指定Server端的ip地址(通过域名应该也可以).以key->value形式,key
的值通过hash进行转换,然后确定对那台server存储/获取数据.
memcached内存算法 :
代码语言:javascript
复制使用的是slab allocation机制分配和管理内存,按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值大小去
匹配slab大小,找就近的slab存放,所以存在空间浪费现象.
memcached缓存策略 :
代码语言:javascript
复制是LRU(最近最少使用)加上到期失效策略.当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久.当memcached服务器用完分配的内存时,失效的
数据被首先替换,然后也是最近使用的数据.在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/value对是否过期,而是在获取key值时查看记录
的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载.
memcached失效策略 :
代码语言:javascript
复制Lazy expiration LRU
Lazy expiration作用 : 假如我们所存储的数据项相对多的时候,在这时候进行监控的话,话费的代价是相当大的,所以memcached不会在过期监视上耗费风度哦的CPU时间,
从而在性能方法也起到一定的优化作用.
LRU : memcached会优先使用已超时的空间,但是还是会有追加信息时空间不足的状态,这时候会使用Least Recently Used(LRU)机制来分配空间,就从最近未被使用的记录
中搜索,并将其空间分配给新的记录.
memcached分布式算法 :
代码语言:javascript
复制当向memcached集群存入/取出Key/value时,memcached客户端会根据一定算法计算存入那台服务器.(第一步 : 选择服务器,第二步 : 存取数据)
余数算法 : 先求得键的整数散列值,再除以服务器数量,根据余数觉得存储那台服务器.(特点 : 简单,高效.但是扩展性差,服务器数量变更时,几乎所有的缓存都会失效)
散列算法 : 先计算memcached的散列值,并将其发布在0-2^32的圆上,然后用同样的方法算出存储数据键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,
将数据保存在查找到的第一台服务器,如果超过2^32还是找不到,则将数据保存在第一台memcached服务器上.如果添加一台memcached服务器,则只在圆上添加的逆时针方向
的第一台服务器上的键会受到影响.
memcached与redis比较
代码语言:javascript
复制memcached : 支持多核,内存利用率高,无持久性,数据结构简单.
redis : 单核,内存利用率低(采用压缩会比memcached高),有(硬盘存储,主从同步),数据结构复杂.
注释 :
散列值 : 将值从一个大的(可能很大)定义域映射到一个较小值域的(数学)函数.散列函数是把该函数应用到大的定义域中的若干值得(大)集合的结果可以均匀地(和随机地)
被分布在该范围上.