Laravel通过Redis的SET命令结合NX和PX选项实现原子性加锁,使用唯一token标识进程,并借助Lua脚本安全释放锁,确保分布式环境下任务不重复执行。

Laravel 使用 Redis 实现分布式锁,核心是利用 Redis 的原子操作特性来保证同一时间只有一个进程能获取到锁。这在多服务器、队列任务或定时命令并发执行的场景中非常有用,避免重复处理造成数据异常。
1. 安装并配置 Redis 扩展
Laravel 默认支持 Redis,但需要确保已安装 predis/predis 或启用 PHP 的 Redis 扩展。
composer require predis/predis
然后在 config/database.php 中确认 Redis 配置正确:
'redis' => [ 'client' => 'predis', 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ],],
2. 使用 Redis::set 实现原子加锁
Redis 的 SET 命令支持 NX(不存在时设置)和 PX(毫秒过期),可以原子性地实现加锁。
示例代码:
$lockKey = 'lock:send_report';$ttl = 10000; // 锁过期时间,单位毫秒$token = uniqid(); // 唯一标识当前进程$locked = Redis::set($lockKey, $token, 'NX', 'PX', $ttl);if (! $locked) { // 获取锁失败,说明其他进程正在执行 return response('任务已在执行中', 423);}// 成功获取锁,开始执行任务try { // 你的业务逻辑,比如发送报表 dispatch(new SendReportJob());} finally { // 使用 Lua 脚本安全释放锁(防止删除别人的锁) $script = <<<'LUA'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1])else return 0endLUA; Redis::eval($script, 1, $lockKey, $token);}
3. 封装为可复用的锁服务
为了方便使用,可以封装一个简单的分布式锁类:
class DistributedLock{ protected $key; protected $token; protected $ttl; public function __construct($key, $ttl = 10000) { $this->key = "lock:{$key}"; $this->ttl = $ttl; $this->token = uniqid(); } public function acquire() { return Redis::set($this->key, $this->token, 'NX', 'PX', $this->ttl); } public function release() { $script = <<key, $this->token); }}
使用方式:
$lock = new DistributedLock('import_data', 5000);if (! $lock->acquire()) { return '资源被占用';}try { // 执行关键操作} finally { $lock->release();}
4. 注意事项与最佳实践
使用 Redis 分布式锁时要注意以下几点:
设置合理的过期时间:避免死锁,但也不能太短导致任务未完成锁就释放 使用唯一 token 标识锁持有者:防止误删其他进程的锁 必须用 Lua 脚本释放锁:保证“判断+删除”的原子性 考虑 Redis 单点问题:生产环境建议使用 Redis Sentinel 或 Cluster 提高可用性基本上就这些。Laravel 结合 Redis 的 SET + NX + PX 和 Lua 脚本,能简单高效地实现可靠的分布式锁。
以上就是laravel如何使用Redis实现分布式锁_Laravel Redis分布式锁实现方法的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/141167.html
微信扫一扫
支付宝扫一扫