Memcached实践基础

一、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缓存

  1. 链接服务器
重置服务器地址
$cache->resetServerList();
$cache->addServers(
array(127.0.0.1,11211,60),
array(127.0.0.1,11212,40),
)

第三个参数对应服务器中的权重,来控制服务器被选中的概率

  1. 设置获取更改数据
$cache->setMulti(
array(
key1=>value1,
key2=>value2,
key3=>value3
),time()+900
);
$cache->get(key1);
$cache->getMulti(key1,key2,...);
//cas数据唯一性 多服务端 并发场景下
$cache->get('k1',null,$cas);
  1. 常用方法
抢座买票
$cache->add(key,value,time()+900);
$cache->increment(key,incr);
$cache->decrement(key,decr);

incr与decr命令操作的数据必须是十进制的32位无符号整数,结果不会出现负值

二、Memcached使用场景

  1. Session存储
  2. 缓解数据库压力,提高交互速度
  3. 数据库主从同步中继

注意事项

value < 1M key < 512
缓存实践 < 30 day
Mysql数据同步更新

三、Memcached缓存简介

优势

  • 内存数据库是将数据放在内存中直接操作的数据库
  • 解决数据使用效率的问题,减少IO消耗
  • 分为关系型内存数据库和非关系型内存数据库

特征

  • 协议简单,使用简单的基于文本行的协议
  • 基于libevent事件处理,灵活调整服务器连接数
  • 内存存储,存读速度快
  • 不互相通信的分布式,每个服务器只对自己的数据进行管理
  • 缺乏认证以及安全管制

使用memcached实现分布式算法

  • 服务器互不通信
  • 由于程序实现分布式
  • 考虑算法分散存储压力
  • 考虑算法的命中率

分布式算法之余数计算分散法
根据key来计算CRC,然后结果对服务器数进行取模得到memcached服务器节点,服务器无法链接的时候,将尝试的链接次数加到key后面重新计算
缺点:添加或移除服务器时,几乎所有缓存将重建,还考虑雪崩式崩溃问题

分布式算法之一致性哈希算法

  • 求出服务器节点的哈希值分配到0-2^32的圆上
  • 求出存储数据键的哈希值映射到圆上
  • 从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上

优点:冗余少 负载均衡 过度平滑 存储均衡

使用memcached实现session共享

session存放在公用的memcached中,实现多服务器共享
缺点:集群错误会导致用户无法登陆,回收机制可能导致用户掉线

阅读 338

推荐阅读