博客
关于我
memcached分布式部署
阅读量:802 次
发布时间:2023-02-08

本文共 2353 字,大约阅读时间需要 7 分钟。

memcache 与 memcached:PHP 缓存技术的对比与应用

在 PHP 开发中,memcache 和 memcached 是两种常用的缓存技术,常被混淆。尽管它们在功能上有诸多相似之处,但二者在实现细节和应用场景上存在显著差异。本文将从功能对比、分布算法以及配置方法等方面,详细探讨 memcache 和 memcached 的区别。

一、功能对比

1. 接口差异

memcache 提供了两套接口:原生接口和非原生接口(非 OO 接口)。其特点是灵活性强,支持多种开发语言。而 memcached 基于 libmemcached 库,只支持原生接口(OO 接口),因此在功能上存在一定的限制。

2. 协议与性能

memcached 支持 Binary Protocol,具有更高的性能。而 memcache 则不支持该协议,性能相对较低。这种协议差异直接影响了两者在高并发场景下的表现。

3. 功能扩展

memcached 的功能远超 memcache,例如支持 getMultigetKeyBy 等高级接口。此外,memcached 还支持分布式缓存的配置选项,如 addServers 和一致性哈希算法。

二、分布式缓存的实现

在分布式缓存中,memcache 和 memcached 采用不同的算法:

1. memcache 的默认分布算法

memcache 按照简单的模算法进行分布,默认使用 hash(key) % servers_count 来决定数据存储的位置。这种方法简单高效,但存在一个明显缺陷:当服务器数量发生变化时,缓存数据会大规模失效,影响命中率。

2. memcached 的一致性哈希

为了克服上述问题,memcached 采用了一致性哈希算法。具体流程如下:

  • 节点配置:将 memcached 服务器的哈希值映射到一个圆(0 到 2^32)上。
  • 数据存储:对存储数据的键计算哈希值,并将其映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过圆的范围仍未找到服务器,则将数据保存到第一台 memcached 服务器上。
  • 这种算法不仅解决了服务器数量变化的缓存失效问题,还能在高并发场景下保持较高的命中率。

    三、配置方法

    1. memcache 的配置

    在 memcache 中实现一致性哈希,通常需要在 php.ini 中进行如下配置:

    Memcache.hash_strategy = consistentMemcache.hash_function = crc32

    2. memcached 的配置

    对于 memcached,在程序中需要设置相应的选项:

    $md = new Memcached();$servers = array(    array('127.0.0.1', 11211, 90),    array('127.0.0.1', 11212, 10));$md->addServers($servers);$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);$md->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);

    3. 验证配置

    为了验证配置的正确性,可以通过以下命令查看缓存分布情况:

    $m = new Memcached();$m->addServers(array(    array('127.0.0.1', 11211, 90),    array('127.0.0.1', 11212, 10)));$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);$m->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);$keys = $m->getAllKeys();foreach ($keys as $key) {    echo "$key\n";}

    四、实际应用示例

    1. 简单的缓存操作

    // memcache 示例$mem = new Memcache();$mem->addServer('memcachehost', '11211');$mem->addServer('memcachehost', '11212');$mem->set('hx', '9enjoy');echo $mem->get('hx');

    2. memcached 示例

    // memcached 示例$md = new Memcached();$servers = array(    array('127.0.0.1', 11211, 90),    array('127.0.0.1', 11212, 10));$md->addServers($servers);$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);$md->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);$md->set('hx', '9enjoy');echo $md->get('hx');

    五、总结

    memcache 和 memcached 在功能和实现上各有优势。前者简单易用,适合小型分布式缓存场景;后者功能更强大,支持一致性哈希和高级接口,适合复杂的分布式缓存需求。在实际应用中,应根据项目需求选择合适的缓存技术,并合理配置相关参数,充分发挥缓存的性能优势。

    转载地址:http://dqyfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>