学习了解PHP中Memcached扩展的使用
说实话,在目前的开发环境中,使用 Memcache 的项目还真的不多。在 Redis 大行其道的今天,Memcache 的衰退也可以说是大势所趋。不过,可能很多刚开始学习 PHP 的新同学不知道,当年在 LAMP 时代,除了这四个字母所代表的这些服务端软件之外,缓存上最出名的就是这个 Memcache ,它和 PHP 搭配的历史也非常的长。
因此,今天我们就是简单地入门学习了解一下,不做过多的深入学习。对于小的项目来说,如果只是需要一个键值对的缓存系统,Memcache 其实也是非常不错的选择,毕竟它更加地简单易用,不用考虑过多的数据结构问题。
我们需要在服务器上安装 Memcached 这个服务端组件,然后启动运行它。这个就不多做解释了,基本上 yum 和 apt 都能非常方便地安装它。而 PHP 中的扩展我们可以选择 Memcached 和 Memcache 两种扩展包,现在比较推荐的是直接安装 Memcached 这个扩展。它们两个其实没啥区别,这个缓存软件叫做 Memecahce ,但它的运行主程序叫做 Memcached ,而在 PHP 层面的话,Memcache 这个扩展是在 PHP 框架内部开发的,而 Memcached 则是要使用 libmemcached 这个系统组件的。具体更多的区别大家可以自行搜索相关的文档资料,这里就不多解释了,反正只要知道它们大概的区别以及现在更推荐使用谁就可以了。
连接 Memcached 服务器并查看信息
安装好各种软件之后,我们就可以连接到 Memcache 服务了。
$m = new Memcached();
$m->addServer('127.0.0.1', '11211');
print_r($m->getStats());
// Array
// (
// [127.0.0.1:11211] => Array
// (
// [pid] => 1713
// [uptime] => 1277
// [time] => 1614646202
// [version] => 1.5.22
// [libevent] => 2.1.8-stable
// [pointer_size] => 64
// …………………………
// …………………………
// …………………………
print_r($m->getServerList());
// Array
// (
// [0] => Array
// (
// [host] => 127.0.0.1
// [port] => 11211
// [type] => TCP
// )
// )
使用 addServer() 这个方法来添加服务器,是不是隐约感觉到了什么?而且我们可以通过 getServerList() 查看所有的连接的服务器列表。很明显,Memcached 相关的扩展都是支持多台服务器扩展访问的。getStats() 方法可以看到连接的服务器的各种统计信息。
添加、查看数据
添加数据
$m->add("test1", "a");
$m->add("test2", 1);
$m->add("test3", "c", 3);
sleep(4);
print_r($m->getAllKeys());
// Array
// (
// [0] => test1
// [1] => test2
// [2] => test3
// )
echo $m->get("test1"), PHP_EOL; // a
echo $m->get("test3"), PHP_EOL; //
我们直接使用 add() 方法就可以添加数据,最后一个参数可以设置这个数据的过期时间。通过 getAllKeys() 方法可以看到添加数据的键信息,不过过期的数据键还会存在一会。而我们直接使用 get() 方法获取数据内容时,过期的数据就无法访问了。
一次性获得数据信息
$m->getDelayed(['test1', 'test2', 'test3']);
print_r($m->fetchAll());
// Array
// (
// [0] => Array
// (
// [key] => test1
// [value] => a
// )
// [1] => Array
// (
// [key] => test2
// [value] => 1
// )
// )
使用 getDelayed() 方法可以获得指定键数组的全部数据信息,它是包含 key 和 value 的内容,返回的是一个游标,我们可以直接用 fetchAll() 获得全部的内部,也可以使用 fetch() 一条一条的遍历。
追加与设置数据
$m->setOption(Memcached::OPT_COMPRESSION, false);
$m->append("test1", "aa");
echo $m->get("test1"), PHP_EOL; // aaa
$m->set("test4", "d");
print_r($m->getMulti(["test1", "test4"]));
// Array
// (
// [test1] => aaaaaaaaaaaaaaaaaaaaa
// [test4] => d
// )
使用 append() 方法可以向指定的数据追加内容,比如这里我们向 test1 追加内容,它原本的值是 a ,追加之后就变成了 aaa 。需要注意的是,使用 append() 方法需要设置 OPT_COMPRESSION 为 false 。默认情况下,这个常量属性值是 true 的,也就是它会将数据压缩,如果是压缩的数据,那么使用这种追加函数可能会产生错误,所以如果要使用 append() 这种函数,就需要将这个属性设置为 false 。
set() 函数用于直接设置一个 key 的值,如果它存在就相当于修改,如果不存在就会创建一个新的。
最后,我们还演示了 getMulti() 这个方法,相比 getDelayed() 来说,它就是批量获取到指定数据的值。
自增、自减操作
$m->increment("test2");
echo $m->get("test2"), PHP_EOL; // 2
$m->decrement("test2");
echo $m->get("test2"), PHP_EOL; // 1
使用 increment() 和 decrement() 方法就可以实现对指定键的值的自增自减操作,这两个函数在 redis 中也是非常常用的。
更新、删除
没有代码的演示,因为比较简单,replace() 用于修改,delete() 用于删除,也就不对它们进行过多的研究了。
Memcache 扩展
上面我们使用的都是 Memcached 这个扩展,接下来我们再简单看一下 Memecache 的操作,其实都是差不多的,但其实 Memcached 扩展的功能会更丰富一些,也就是提供的方法函数更多一些,就像文章开头说的,使用哪种扩展大家自己根据业务情况选择吧。
$mem = new Memcache();
$mem->connect('127.0.0.1', 11211);
print_r($mem->getStats());
// Array
// (
// [pid] => 1713
// [uptime] => 1281
// [time] => 1614646206
// [version] => 1.5.22
// [libevent] => 2.1.8-stable
// [pointer_size] => 64
// [rusage_user] => 0.085507
// [rusage_system] => 0.145715
// [max_connections] => 1024
// ………………………………
// ………………………………
// ………………………………
echo $mem->getVersion(), PHP_EOL;
// 1.5.22
$mem->set("test5", "e");
echo $mem->get("test5"), PHP_EOL; // e
总结
关于 Memcache 相关的内容就是这些,比较简单的介绍了一下它们的使用。目前,或者说最近这些年,真的已经没怎么见过使用 Memcache 的项目或者公司了。不管什么公司,上来真的就是一套 redis ,完全不考虑其它的缓存扩展了。所以这里我们也就不对 Memcache 再进行更多的研究了。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/03/source/1.%E5%AD%A6%E4%B9%A0%E4%BA%86%E8%A7%A3PHP%E4%B8%ADMemcached%E6%89%A9%E5%B1%95%E7%9A%84%E4%BD%BF%E7%94%A8.php
参考文档:
https://www.php.net/manual/zh/book.memcache.php
https://www.php.net/manual/zh/book.memcached.php