博客
关于我
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 是如何加锁的?
    查看>>
    MySQL 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>
    mysql 添加索引
    查看>>