Memcached 的工作原理

www.discuz.net
php和其他语言交换数据用Json/XML;
1.什么是Memcache?
a)高性能的分布式的内存对象缓存系统
b)来缓存键值对
c)可以存储任意数据类型的数据
d)是一个网站项目,后台才发展起来
e)C/S   memcached
2.什么是Memcache,什么是Memcached?
a)Memcache是项目名称
b)Memcached是该项目在服务器端的守护进程的名称,软件名称;
c)Memcache和memcached是PHP两套不同的扩展库
d)Memcache扩展库可以支持面向对象和面向过程两种写法
e)Memcached只支持面向对象的写法
f)Memcached是基于libmemcache扩展的
g)Memcached方法更加丰富,效率更高
3.为什么要使用Memcache?
a)将数据缓存到内存
4.什么时候使用?
a)将数据缓存到内存时使用
b)可以使用Redis(NoSQL)替代
5.如何使用Memcache?
a)安装
i.服务器端
1.Memcached.exe –d install 安装
2.Memcached.exe –d start 开启服务
3.Memcahced.exe –d stop 停止服务
4.Memcached.exe –d restart 重启
5.Memcached.exe –d uninstall 卸载
6.如果是win7或者是win8,需要使用管理员身份执行命令提示符
ii.客户端
1.安装telnet客户端
2.控制面板===》程序和功能====》添加组件====》勾选telnet客户端====>确定
3.telnet 127.0.0.1  11211
b)Memcache的相关命令:
i.stats 返回服务器相关信息
ii.add 添加数据,不能修改数据
1.add  键名  标志位  有效期  数据的长度
2.设置值
iii.set 添加/修改数
1.set  键名  标志位  有效期  数据的长度
iv.get 查询
1.get  键名
v.delete 删除
1.delete  键名
vi.flush_all 清空内存
vii.遍历数据:
1.获取标志位
a)stats  items
2.根据标志位获取名称
a)Stats  cachedump 标志位  0
3.通过get依次获取
a)get  name….
viii.quit 退出
6.PHP作为Memcached的客户端:
a)安装扩展:
i.找到php_memcache.dll扩展文件
ii.将此扩展文件放
入至php5.4/ext目录下
iii.修改配置文件php.ini
1.extension_dir = “F:/php5.4/ext”;
2.extension=php_memcache.dll
iv.重启apache
v.通过phpinfo()检测
b)PHP扩展类Memcache的方法
i.Connect
ii.Close
iii.add
1.最后一个参数的过期时间需要注意:
a)0 永不过期
b)秒数   不能超过30天的秒数
c)时间戳 超过30天可以使用时间戳来指定
iv. Set
v. Get
vi. Delete
vii.Flush

// filemtime — 取得文件修改时间
// file_exists — 检查文件或目录是否存在
// json_decode — 对 JSON 格式的字符串进行编码
// json_encode — 对变量进行 JSON 编码

// file_get_contents — 将整个文件读入一个字符串

MemcachedC/S架构)是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。

Memcache整个项目的名称,Memecachedmem:内存;cache:换存;d:daemon服务端进程模式服务)是服务器端主程序名称。其协议简单,通过内存提供服务,只持高并发。

 

Memcached特征:基于一个存储键/值对的hashmap

     协议简单:基于文本行的协议

     基于libevent的事件处理:libevent是一个程序库,它将liunx的epoll、BSD类操作系统的kqueue等事件处理功能封装成一个接口。即使对服务器的连接数量增加,也能发挥0(1)性能。因此memcache在linux、BSD、Solaris等操作系统上也能发挥其高性能。

     内置内存存储方式内存容量达到指定值后,就基于LRU算法自动删除不使用的缓存

     不互相通信的分布式memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,分布式是完全取决于客户端的实现。

Memcached的工作原理:

Memcached处理的原子是每一个(keyvalue)对(以下简称kv对),key会通过一个hash算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。

Memcached有两个核心组件组成:服务器端(server)和客户端(client),在一个memcached的查询中,client先通过计算keyhash值来确定kv对所处在的server位置。当server确定后,客户端就会发送一个查询请求给对应的server,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以memcached交互带给网络的影响是最小化的。

举例说明有三个client分别是c1c2c3,还有三个ms分别是s1s2s3

设置kv对:
c1
想设置key=”com”,value=”iQiyi”
c1
拿到server列表,并对keyhash转化,根据hash值确定kv对所存的server位置
s2
被选中了
c1
连接上s2s2收到请求,把(key=”com”,value=”iQiyi”)存了起来

获取kv对:
c3
想得到key=”com”value
c3
用相同的hash算法算出hash值,并确定key=”com”的值存在s2
c3
连接上s2,并从s2那边得到value=”iQiyi”
其他任何从c1c2c3的想得到key=”com”的值的请求都会发向s2

内置内存存储方式:

Memcached的内存分配以page为单位,默认情况下一个page1M ,可以通过-I参数在启动时指定。如果需要申请内存 时,memcached会划分出一个新的page并分配给需要的slab区域。Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储,其大小可以通过启动参数设置增长因子,默认为1.25,即下一个slab的大小是上一个的1.25倍。最大可以支持128M

 :每个slab只存储大于其上一个slabsize并小于或者等于自己最大size的数据。

如:需要存储一个100Bytes的对象时,会选用112BytesSlab Classes

memcached的数据都存储在memcached内置的内存存储空间中。

由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。

内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

Memcached的内存管理:

memcached默认情况下采用了名为Slab Allocatoion的机制分配,管理内存。

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,已完全解决内存碎片问题。slab allocator还有重复使用已分配内存的目的。也就是说,分配到的内存不会释放,而是重复利用。

Slab Allocation 的主要术语:

 Page :分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk.

Chunk :用于缓存记录的内存空间。

Slab Class:特定大小的chunk的组。

Memcached的缓存策略:

mshash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用),以及每个kv对的有效时限。Kv对存储有效时限是在mc端由app设置并作为参数传给ms的。

同时ms采用是偷懒替代法,ms不会开额外的进程来实时监测过时的kv对并删除,而是当且仅当,新来一个插入的数据,而此时又没有多余的空间放了,才会进行清除动作。

Memcache各类数据操作原理:

查询数据(select),首先通过指定的Key查询 (get)Memcache中间缓存层数据,如果存在相对应数据,则直接获取出数据结果,查询过程完全不需要查询数据库。如果不存在,则查询MySQL据库,并以key对应value的形式将查询结果存储在Memcache缓存数据中,然后将结果返回给查询语句。

更新数据(update),首先更新数据,然后删除相关的memcache数据(delete)

增加数据(add),首先删除相关缓存数据,然后增加数据。

删除数据(delete)删除数据,并删除Memcache数据。

memcached的删除机制:
memcached是缓存,所以数据不会永久保存在服务器上,其实数据不会真正从memcached中消失。实际上memcached不会释放已分配的内存,记录超时后,客户端就无法再看见该记录,其存储空间即可重复使用。

Lazy Expiration:memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。


memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

memcached的分布式:
memcached但服务器端并没有“分布式”功能。分布式是完全由客户端程序库实现的。这种分布式是memcached的最大特点。


set (存数据到memcached)时,set(‘key’,data),将’key’传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存(’key’,data);


get(从 memcached取数据)时,get(‘key’),此时客户端把’key’传递给函数库,函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。


以上将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。


Cache::Memcached 的分布式算法简单来说,就是“根据服务器台数的余数进行分散”。求得键的整数哈希值[使用crc32函数,如crc32($key)],再除以服务器台数,根据其余数来选择服务器。余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。那就是当添加或移除服务器时,缓存重组的代价相当巨大。

Memcached注意事项: 
(一)memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached   进程中止,数据便会丢失,所以memcached不能用来持久保存数据。 
(二)memcached 的实际瓶颈在于网络连接。很多人的错误理解,memcached的性能非  常好,好到了内存和硬盘的对比程度,其实 memcached使用内存并不会得到成百上千的读写速度提高,因为他的瓶颈在于网络连接。它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。 
(三)memcached之间不互相通信。 
(四)memcached缺乏认证以及安全管制,所以memcached服务器应该放置在防火墙后。 


Telnet: 是进行远程登录的标准协议和主要方式它为用户提供了在本地计算机上完成远程主机工作的能力。可以用telnet命令来测试端口号是否正常打开还是关闭状态。

O(1)哈希查找,索引查找【时间复杂度为1
O(n)遍历查找,有序数组可以优化成O(logN)折半查找,也可以优化为O(1)哈希查找
O(n^2)冒泡排序,可以优化为快速排序O(n*logN)分治思想

O(1)的算法,就是算法执行完需要的时间与问题规模无关,是一个常数
O(n)的算法,就是算法执行完需要的时间与问题规模成正比
O(n^2)的算法,就是算法执行完需要的时间与问题规模的平方成正比
三者比较,从时间开销上来说,O(1)的算法最好,O(n^2)的算法最差。
拿排序算法举例,如果要排序的数字从n10增长到n=10000,那么O(1)的算法运行的时间不会随着增加,但O(n)的算法执行的时间就线性增加了,而O(n^2)的算法的执行时间就平方级增加了。
比较下来O(1)算法的执行效率最高,O(n^2)算法的执行效率最差 


软件

类型

作用

缓存数据

 

Memcache

纯内存

缓存后端数据库中数据

动态内容

 

Mongodb,redis

持久化储存,内存加磁盘

1缓存后端数据库中数据;

2数据库的储存补充

 

动态内容

 

Squid,nginx(内存加磁盘)

Varnish(内存)

ats

内存加磁盘

 

内存

前端静态web内容的缓存

图片,附件,js,css,html

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值