分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

PHP中redis加锁和解锁的简单实现

发布时间:2023-09-06 02:14责任编辑:蔡小小关键词:PHPredis

背景说明

在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存。这时就需要对资源加锁。实现锁的方式有很多,比如数据库锁、文件锁等等。本文简单介绍PHP中使用redis来实现加锁和解锁。实现方式参考了redis官方文档。

示例代码

代码环境:单redis实例,PHP5.6及以上,且需开启redis扩展

 ???$redis = new \Redis(); ???$redis->connect(‘127.0.0.1‘); ???$lockKey = ‘lock_key‘; ???$randValue = rand(10000, 99999); ???//lock ???$lock = $redis->set($lockKey, $randValue, [‘NX‘, ‘EX‘=>1]); ???if($lock) { ???????//do something ???????//unlock ???????$script = ‘ ???????????if redis.call("get",KEYS[1]) == ARGV[1] then ???????????????return redis.call("del",KEYS[1]) ???????????else ???????????????return 0 ???????????end ???????‘; ???????$redis->eval($script, [$lockKey, $randValue], 1); ???}

代码说明

这段代码会在资源未被锁定(NX选项)时获取锁,同时设定了1s的过期时间(EX)选项,可在代码出错或超时情况下自动释放锁。值被设定为一个随机数,且执行lua脚本来解锁,就不会误释放其它用户加的锁。
分布式锁的实现可参考 https://redis.io/topics/distlock。

PHP中redis加锁和解锁的简单实现

原文地址:https://www.cnblogs.com/cnsr/p/9645995.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved