Memcached实践基础

5次阅读

共计 2863 个字符,预计需要花费 8 分钟才能阅读完成。

一、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 中,实现多服务器共享
缺点:集群错误会导致用户无法登陆,回收机制可能导致用户掉线

正文完
 0