应优先使用PHP的Memcached扩展(非memcache),因其支持多服务器、SASL认证及二进制协议;常用操作包括连接设置、键值读写、批量处理、原子计数及CAS一致性控制。

如果您需要在PHP应用中高效地读写Memcached缓存,则需通过PHP的Memcached扩展连接并操作Memcached服务。以下是几种常用的操作方法:
一、使用Memcached扩展连接并设置键值
该方法利用PHP官方推荐的Memcached扩展(非过时的memcache扩展),支持多服务器、SASL认证及二进制协议,具备更高性能和稳定性。需确保已安装并启用memcached.so扩展。
1、创建Memcached客户端实例:$memcached = new Memcached();
2、添加Memcached服务器节点:$memcached->addServer('127.0.0.1', 11211);
立即学习“PHP免费学习笔记(深入)”;
3、设置缓存键值对,有效期为300秒:$memcached->set('user:1001', ['name' => 'Alice', 'role' => 'admin'], 300);
4、获取缓存值:$data = $memcached->get('user:1001');
二、使用memcache扩展进行基础缓存操作
该方法适用于仍维护旧版PHP环境(如PHP 5.6)且仅启用memcache.so扩展的场景。注意此扩展不支持二进制协议和SASL,功能较精简。
1、实例化memcache对象:$memcache = new Memcache();
2、连接Memcached服务:$memcache->connect('127.0.0.1', 11211) or die("Could not connect");
3、写入字符串类型缓存:$memcache->set('config:site_name', 'MyApp', MEMCACHE_COMPRESSED, 600);
4、读取缓存并判断是否存在:$value = $memcache->get('config:site_name'); if ($value === false) { /* 缓存未命中 */ }
三、批量操作键值以提升效率
当需同时处理多个缓存项时,避免逐个调用get/set可显著降低网络往返开销。Memcached扩展原生支持批量接口,适用于列表预热或聚合查询结果缓存。
1、准备键名数组:$keys = ['post:123', 'post:456', 'post:789'];
2、一次性获取多个键对应值:$results = $memcached->getMulti($keys);
3、构造待批量写入的数据(关联数组):$items = ['post:123' => ['title' => 'Hello'], 'post:456' => ['title' => 'World']];
4、执行批量设置,统一设置过期时间为180秒:$memcached->setMulti($items, 180);
四、原子性操作与计数器管理
Memcached提供incr/decr命令实现无锁数值递增或递减,适用于访问计数、限流令牌桶等场景。操作前需确保键已存在且值为可解析为整数的字符串。
1、初始化计数器键(若不存在则设为0):$memcached->add('counter:page_views', 0, 0);
2、对计数器执行原子递增操作:$new_value = $memcached->incr('counter:page_views', 1);
3、递减操作示例(最小值限制为0):$memcached->decr('counter:rate_limit', 1);
4、检查当前计数值是否超出阈值:if ($memcached->get('counter:rate_limit')
五、缓存失效与条件更新策略
为避免缓存与数据库数据不一致,可结合CAS(Check and Set)机制实现乐观并发控制。该方式在高并发写场景下防止覆盖其他进程刚写入的新值。
1、获取带CAS令牌的缓存项:$cas_token = null; $value = $memcached->get('user:profile:1001', null, $cas_token);
2、修改业务数据后尝试CAS更新:$updated = $memcached->cas($cas_token, 'user:profile:1001', ['name' => 'Bob', 'updated_at' => time()], 0);
3、判断CAS是否成功:if (!$updated) { /* CAS失败,表示期间已被其他请求修改,需重试或放弃 */ }
4、手动删除缓存触发下次读库重建:$memcached->delete('user:profile:1001');











