标题:【PHP小课堂】学习了解PHP中Memcached扩展的使用

文章目录
    分类:存储运维 标签:缓存

    学习了解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

    视频链接

    微信文章地址:https://mp.weixin.qq.com/s/b697j865iaPc5GWzV9A_zQ

    搜索
    关注