一、Memcached实践基础
1、Memcached简介
自由开源的,高性能,分布式内存对象缓存系统
作用:
数据缓存
存储session
短信验证码存储
安装
memcached是基于libevent,所以安装memcached之前需要安装libevent
2、Memcached常用命令
set命令
将value(数据值)存储到指定的key(键)中,如果指定的key已经存在,更新key所对应的值
语法:
set key flags expire bytes
参数:
key 键值key-value结构中的key,用于查找缓存
flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expire 在缓存中保存键值对的时间长度 以秒为单位 0 表示永久
bytes 在缓存中存储的字节长度
value 存储的值
输出信息
stored 表示存储成功
error 保存信息出错
get命令
获取存储在key(键)中的value(数据值)
语法
get key1 key2 key3
gets命令
获取带有cas令牌存的value(数据值)
如果key不存在,则返回空
语法
gets key1 key2 key3
在使用gets命令的输出结果中,在最后一列的数字代表当前key的cas令牌
cas命令
检查并设置,这个命令仅在当前客户端最后一次取值后,该key对应的值没有被其他客户端修改的情况下,才能将值写入
语法
cas key flags expire bytes unique_cas_token
key 键值key-value结构中的key,用于查找缓存值
flags 可以包括键值对的整型参数,客户机使用它存储关于键值的额外信息
expire 在缓存中保存键值对的时间长度 以秒为单位 0 表示永久
bytes 在缓存中存储的字节数
unique_cas_token 通过gets命令获取的唯一的64位值
value 存储的值
delete命令
删除已经存在的key(键)
delete key
语法:
delete key
参数说明
key 键值对key-value结构中的key,用于查找缓存值
输出值说明
deleted 成功
error 语法错误或删除失败
not_found key 不存在
prepend / append 命令
在前面追加
prepend key flags expire bytes
在后面追加
append key flage expire bytes
参数说明
key 键值key-value结构中的key,用于查找缓存值
flags 可以包括键值对的整型参数
expires 在缓存中保存键值对的时间长度 单位是秒 0 表示永久有效
bytes 在缓存中的字节长度
value 存储的值
输出的信息
stored 成功
not stored 存储失败
client error 错误
incr / decr 命令
对已存在的key(键)的数字值进行自增或自减操作
incr与decr命令操作的数据必须是十进制32位无符号整数
如果key不存在返回not found 如果键的值不为数字,则返回client error 其他错误返回error
语法
incr key increment_value
decr key decrement_value
参数说明
key 键值key-value结构中的key,用于查找缓存值
increment_value:增加的数值
decrement_value:减少的数值
add 命令
将value(数据值)存储在指定的key(键)中
如果add的key已经存在,则不会更新数据,之前的值仍然保持相同,并且将获得not stored
语法
add key flags expire bytes
参数说明
key 键值key-value结构中的key 用于查找缓存值
flags 可以包括键值对的整型参数
expire 在缓存中保存键值对的时间长度 单位为秒 0 表示永久
bytes 在缓存中存储的字节长度
3、Memcached扩展安装和存储session
安装libmemcached=>安装memcached=>安装php-memcached扩展
cookie与session
1、http request =》
2、http reponse+set cookie (sessionId) =》
3、http request+cookie =>
4、http response
file存储session的缺点:
1、文件IO读写慢
2、分布式受限制
存储session方式
- 修改php.ini
- 代码中设置文件
4、Memcached 类的使用
文件缓存 redis缓存 memcahce缓存
- 链接服务器
重置服务器地址
$cache->resetServerList();
$cache->addServers(
array(127.0.0.1,11211,60),
array(127.0.0.1,11212,40),
)
第三个参数对应服务器中的权重,来控制服务器被选中的概率
- 设置获取更改数据
$cache->setMulti(
array(
key1=>value1,
key2=>value2,
key3=>value3
),time()+900
);
$cache->get(key1);
$cache->getMulti(key1,key2,...);
//cas数据唯一性 多服务端 并发场景下
$cache->get('k1',null,$cas);
- 常用方法
抢座买票
$cache->add(key,value,time()+900);
$cache->increment(key,incr);
$cache->decrement(key,decr);
incr与decr命令操作的数据必须是十进制的32位无符号整数,结果不会出现负值
二、Memcached使用场景
- Session存储
- 缓解数据库压力,提高交互速度
- 数据库主从同步中继
注意事项
value < 1M key < 512
缓存实践 < 30 day
Mysql数据同步更新
三、Memcached缓存简介
优势
- 内存数据库是将数据放在内存中直接操作的数据库
- 解决数据使用效率的问题,减少IO消耗
- 分为关系型内存数据库和非关系型内存数据库
特征
- 协议简单,使用简单的基于文本行的协议
- 基于libevent事件处理,灵活调整服务器连接数
- 内存存储,存读速度快
- 不互相通信的分布式,每个服务器只对自己的数据进行管理
- 缺乏认证以及安全管制
使用memcached实现分布式算法
- 服务器互不通信
- 由于程序实现分布式
- 考虑算法分散存储压力
- 考虑算法的命中率
分布式算法之余数计算分散法
根据key来计算CRC,然后结果对服务器数进行取模得到memcached服务器节点,服务器无法链接的时候,将尝试的链接次数加到key后面重新计算
缺点:添加或移除服务器时,几乎所有缓存将重建,还考虑雪崩式崩溃问题
分布式算法之一致性哈希算法
- 求出服务器节点的哈希值分配到0-2^32的圆上
- 求出存储数据键的哈希值映射到圆上
- 从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上
优点:冗余少 负载均衡 过度平滑 存储均衡
使用memcached实现session共享
session存放在公用的memcached中,实现多服务器共享
缺点:集群错误会导致用户无法登陆,回收机制可能导致用户掉线