AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
[TOC] ## 管道 将多个命令一次性发送到服务器,然后由服务器一次性返回所有结果。 管道技术在批量执行命令的时候可以大大减少网络传输的开销,提高性能。 ``` <?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // 1. 开启管道模式 // Redis::PIPELINE 模式下,命令不会立即发送,而是缓存在本地内存中 $pipe = $redis->pipeline(); // 2. 批量添加命令 for ($i = 0; $i < 1000; $i++) { $pipe->set("key:$i", "value:$i"); $pipe->get("key:$i"); } // 3. 一次性发送所有命令并获取结果 // $results 是一个数组,包含了上面所有命令的返回值 $results = $pipe->execute(); ``` ## 分布式锁 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中 常常需要协调它们的动作,如果不同的系统或同一个系统的不同主机之间共享了一个/ 组资源,那么访问这些资源的时候,往往需要通过互斥来防止彼此干扰以保证一致性 在这种情况下,便需要使用分布式锁。 ``` <?php class RedisLock { private $redis; private $lockKey; private $token; public function __construct($redis, $key) { $this->redis = $redis; $this->lockKey = "lock:" . $key; } /** * 加锁 * @param int $ttl 锁的有效期(秒) * @return bool */ public function lock($ttl = 10) { $this->token = bin2hex(random_bytes(16)); // 生成唯一随机值 // SET key value NX EX seconds // 只有 key 不存在时才设置成功 $result = $this->redis->set($this->lockKey, $this->token, ['nx', 'ex' => $ttl]); return $result === true; } /** * 释放锁 (使用 Lua 脚本保证原子性) */ public function unlock() { // Lua 脚本:判断锁的值是否等于我持有的 token,如果是则删除 $script = ' if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end '; return $this->redis->eval($script, [$this->lockKey, $this->token], 1); } } // --- 使用示例 --- $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $lock = new RedisLock($redis, "update_user_balance_1"); if ($lock->lock(5)) { try { echo "成功获取锁,开始处理业务...\n"; // 执行业务逻辑 sleep(2); } finally { $lock->unlock(); echo "锁已释放。\n"; } } else { echo "获取锁失败,其他请求正在处理中。\n"; } ```