<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $productId = 1; $stockKey = "inventory:{$productId}"; // 监视库存键 $redis->watch($stockKey); // 检讨库存 $currentStock = $redis->get($stockKey); if ($currentStock > 0) { // 开始事务 $redis->multi(); // 减少库存 $redis->decrBy($stockKey, 1); // 提交事务 $result = $redis->exec(); if ($result === false || empty($result)) { // 事务失落败,可能是库存键被其他客户端修正 // 这里可以添加重试逻辑 echo "Transaction failed, retry or handle error.\n"; } else { echo "Inventory updated successfully.\n"; } } else { echo "Out of stock.\n"; } // 把稳:实际利用中,你可能须要在一个循环中处理WATCH的失落败情形,并设置适当的重试次数和延迟 ?>
把稳:上面的代码示例没有包含自动重试逻辑,由于PHP的Redis扩展不支持自动重试WATCH后的操作。在实际运用中,你可能须要在一个循环中包裹这段代码,并在$result为空时重试,同时设置适当的重试次数和延迟。方案二:利用分布式锁(如Redisson)
如果你不想手动处理乐不雅观锁的逻辑,可以考虑利用Redisson这样的库来实现分布式锁。Redisson供应了丰富的分布式和可扩展的Java驻内存数据构造,包括分布式锁。然而,由于Redisson是Java库,你须要在PHP项目中通过某种办法(如通过HTTP API调用Java做事)来间策应用它。
替代方案:
由于PHP的限定,你可能更方向于利用像Redis自带的Lua脚本或Redis集群/哨兵配置来确保数据的同等性,或者在你的运用层实现更繁芜的锁机制(如基于数据库的行锁或表锁)。

在Redis中处理并发写入时,我们可以根据详细的运用处景和需求选择得当的策略。对付须要严格担保数据同等性的场景,分布式锁是一个可靠的选择。而对付一些对同等性哀求不是非常严格的场景,乐不雅观锁或事务也可以作为备选方案。在实际开拓中,我们该当根据项目的详细情形来选择得当的并发掌握策略。