标签:
分布式,内存缓存,服务器
内存缓存:
提供将数据缓存到内存中服务。数据在内存中,为一个临时的存储器,通常作为缓存服务器来使用,而不是数据服务器来使用。
缓存:将中间结果临时存储,就是缓存技术。
Memcache是缓存服务器,仅仅提供存储缓存数据,而不决定什么样的数据存储于缓存中。
分布式:
多台memcache服务器,组成memcache集合。
下载,解压,并拷贝到指定目录
官网:http://memcached.org/
Memcached的服务器端程序。
Linux:
Memcached服务器安装完毕。
方案一:基于CMD(命令行)的程序
通过CMD命令行,进行管理:
全部使用默认参数,即可开启memcached服务器:
此时,该memcached服务器,监听任意网卡(IP),11211端口上的请求。
典型的选项:
-p 所监听的端口
-l 所监听的网卡接口
如果一台电脑存在多个网络连接,可以指定监听哪个网络的请求
方案二:针对windows:
通过访问的方式,管理memcached。
选择–d 来控制该守护进程(deamon)
以管理员权限运行cmd
-d install安装服务
-d uninstall卸载服务
刚刚memcached是服务器端软件。
需要提供客户端软件。
Memcached的数据交互协议,基于文本的。因此只要可向目标服务器发送文本,即可memcached客户端使用。例如:telnet。
通过客户端软件 secureCRT来发送telnet协议,连接memcached服务器:
(putty,windows自带的telnet都可以)
一个KEY,对应一个值。
Set KEY 是否压缩 有效期 长度
值
Key: 具有独立标志功能的字符串,长度在250个字节之内。
是否压缩: 是否将数据压缩后进行存到服务器端。节省存储空间(需要压缩与解压时间)。
有效期: 数据在服务器端存储的有效时间。有效期的表示方式存在2种,时间间隔,时间戳。其判断使用哪种方式,依据有效期整数值的大小。临界值为: 30*24*3600 = 2592000
测试获取:
发现e3过期,因为:超过2592000当作时间戳来处理。
如果需要设置超过30天的数据,则使用时间戳的形式:
Time()+间隔
长度: 数据占用的空间,单位字节。与字符集相关。
存在则替换,不存在则创建。
添加
使用方式与参数与set一致。
仅仅可以完成添加,如果key已经存在,则add失败。
替换
使用方式与参数与set一致。
仅仅完成存在时替换。
Increment,递增
将已有值,递增N个数
(get,+,set)
Decrement,递减
(get,-,set)
Get KEY
删除某个key
删除全部
获取当前服务器状态信息
PHP作为memcached服务器的客户端来使用。
将扩展文件:php_memcached.dll 看拷贝到PHP的扩展目录
修改PHP.ini增加开启该扩展指令:
该扩展提供面向对象的操作语法:
Connect
$mem->set(KEY, VALUE, 是否压缩, 有效期)
$mem->add(KEY, VALUE, 是否压缩, 有效期);
$mem->replace(KEY, VALUE, 是否压缩, 有效期);
如果需要压缩存储,将flag标志设置为
MEMCACHE_COMPRESSED
$mem->increment();
$mem->decrement();
$mem->get(KEY);
分成两类进行处理:
标量类型:
整型,浮点型,布尔型,字符串
以字符串的形式进行存储:
非标量类型:
数组,对象, NULL
数据类型可以被保存,获得原始数据。可见,set方法,在判断当前的数据为非标量类型时,自动进行序列化存储,获取时完成反序列化返回。
各个memcached服务器间互不通讯的分布式算法。
要求,分布式算法(一个key 对应哪台memcached服务器)是由客户端决定(实现)的。
Memcached默认实现的是:
取模(求余):依据服务器的数量,计算余数,对应某台memcached服务器。
使用:
后续的使用与基本操作是相同的:
注意,由于分布式算法是求余算法,导致:
设置与获取时:服务器的数量,与服务器的顺序,应该匹配才可以。
附:典型KEY求余的实现:
通过crc32冗余校验算法获得一个字符串的整型冗余值。
Memcached缓存项何时会失效?(未命中)
情况一:有效期控制失效。
需要注意:懒惰模式。
当缓存项失效时(过有效期),memcached不会主动删除该缓存项。
而是在get该缓存项时判断是否失效,则删除。
情况二:删除最近最少使用的缓存项
需要:LRU( Least Recently USE)
-m 指定使用的N兆字节
当新加缓存项时,空间不足,将最近最少使用的缓存项删除,释放空间。
不是数据库,而是缓存。
不需要做:数据持久化;数据的备份恢复。
缓存不会影响项目的业务逻辑,仅仅会影响处理速度。
安全性问题?
Memcached本身没有提供认证机制。
通常,memcached服务器都是局域网内服务器。
如果memcached服务器可以被访问到,通过系统上其他软件进行控制:
Firewall
Iptables
Session处理非常频繁,为了高速存储session数据,将session数据存储于内存中。
扩展memcache中,已经提供好了叫 memcache 的session存储处理器(session.save_handler)
将其设置为 memcache就可以使用session入内存了。
通过配置项:session.save_path 就可以配置session数据的存储位置,包括所使用的memcached服务器信息(集合信息)
常规使用session即可:
Tip:
Memcached存储的session数据,以session-ID为KEY,序列化的数据为值一种格式
总结:
存储方式:
1文件(默认)
2数据库表(user)
3内存(memcached)
除了速度快,session入数据库服务器,session入内存服务器,另外的一个优势(很重要):
多台web服务器共享session。
例如:项目中无限分类(树状分类)的获取:
获取时过程复杂:需要递归完成。
分类的更新频率:低
将获取好的分类数据,存储在memcached中,需要查询时,先判断是否已经缓存了,如果存在则完成从缓存中获取,如果不存在,则完成从数据表中获取,并更新缓存。
一旦缓存数据源(分类数据)变化,更新(删除)缓存
完成该例子:
列表页:
TP中,函数M,D
S()可以快捷的操作缓存。
好友列表登录状态显示
User_status表
User_id, is_login
23 1
45 0
Memcache:
User_23=>1
User_45=>0
标签:
原文地址:http://www.cnblogs.com/geyu/p/4654087.html