愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

Memcached学习总结

一、什么是Memcached?

Memcached是key-value型的分布式存储系统,其使用目的缓存小块的任意数据(字符串、对象),一般用于缓存数据库查询结果,减少数据库的访问次数,提高Web应用的相应速度。目前主流编程语言都实现了Memcached的客户端

二、特点

  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

三、安装

个人使用OSX,OSX下用homebrew一键安装就可以了:brew install memcached

四、启动

我们在使用Memcached的时候,需要事先启动它,启动Memcached具有如下常用的启动设置项:
1、-d 启动一个守护进程
2、-m 分配给Memcached的内存数量,单位为MB
3、-u 运行Memcached的用户
4、-l 监听的服务器IP地址,可以监听多个地址
5、-p 监听的端口,端口号建议大于1024
6、-c 最大并发连接数,默认1024
7、-P 保存Memcached的pid文件
(查看更多的选项,可以使用memcached -h
我们可以即可以使Memcached作为前台程序运行,也可以常驻内存作为后台程序运行,只要启动的时候,加上-d选项就可以了,通常情况下,作为前台服务,我们用如下的方式来启动:

memcached -p 11211 -m 64M -vv

加上-vv的目的,是为了显示调试信息,作为后台服务的时候,可以这么启动:

memcached -d -m 64M -u root -l 127.0.0.1 -p 11211 -P /tmp/memcached.pid

五、第一个运用Memcached的程序

$m = new Memcached;
$m->addServer("localhost", 11211);

$m->set("Hello", "World");

echo $m->get("Hello");
echo PHP_EOL;

六、Memcached API使用

Memcache对象具有如下的常用方法:

1、连接服务器

  • addServer($host, $port) 向服务器池增加一台服务器
  • addServers($servers) 向服务器池增加多台服务器

2、设置值

  • set($key, $value, $expireTime),设置$key的值为$value$expireTime设置过期时间,单位为秒,0表示永不过期
  • setMulti($itemsArray [, $expireTime]) 同时设置多个项目
  • cas($casToken, $key, $value [, $expireTime]),“检查并设置(Check-And-Set)”的操作,仅在当前客户端最后一次取值后,该key对应的值没有被其他客户端修改的情况下,才能将值写入。检查是通过cas_token参数完成的。这个操作能够保证高并发下的数据安全,是通过系统级的冲突检测机制(乐观锁)实现的
  • casByKey($casToken, $serverKey, $key, $value [, $expireTime])
  • setOption($optionConst, $value) 设置选项值
  • setOptions($optionArray) 设置多个设置项

(注意,以下的方法均支持xxxByKey操作,最前面多了个$serverKey参数)

3、修改值

  • add($key, $value, $expireTime),向一个新的key设置值,如果key已存在,操作无效
  • addByKey($serverKey, $key, $value, $expireTime),功能与add相同,但是设定到serverKey为指定值的服务器上
  • replace($key, $value, $expireTime),用于替换应该已存在的key的值和过期时间(和set的区别就是如果key不存在的时候,操作将失效)
  • append($key, $value),向已存在的key的value附加数据,相当于+=操作
  • prepend($key, $value),向已存在的key的value的开头处追加数据
  • increment($key, $offset),key的数值 += $offset,offset默认值为1
  • decrement($key, $offset),key的数值 -= $offset,offset默认值为1
  • touch($key, $expireTime),修改过期时间

4、删除值

  • delete($key, $time),$time表示删除时间(数值为多少秒后删除,0表示立即删除,UNIX时间戳为具体时间删除)
  • deleteMulti($keysArray [, $time = 0 ]) 一次删除多个项目
  • flush([$time = 0]) 清除所有的元素

5、获取值

  • getOption($optionConst) 获取设置项的值,如getOption(Memcached::OPT_COMPRESSION)
  • get($key) 获取键为$key的值
  • getAllKeys() 获取在所有服务器中存储的keys
  • getDelayed($keysArray [, $withCas]) 请求多个元素,当要收集的时候用fetch()(迭代收集)或者fetchAll()(一次性收集)
  • getMulti($keysArray),同时检索多个元素,如:
$m->set("int", 99);
$m->set("string", "Hello, world!");
$m->set("array", [1, 2, 3, 4]);

print_r($m->getMulti(['int', 'string', 'array']));
/* 返回:
Array
(
    [int] => 99
    [string] => Hello, world!
    [array] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )
)
*/
  • getResultCode() 获取最后一次操作结果的代码,获取结果信息则用getResultMessage()
  • getServerByKey($serverKey) 获取一个key所映射的服务器信息
  • getServerList() 返回服务器池中的所有服务器信息