PHP使用redis锁防止并发访问
锁必须具备的特点
1、互斥: 任意时刻, 只能有一个客户端获得锁
2、不会死锁: 客户端持有锁期间崩溃, 没有主动解除锁, 能保证后续的其他客户端获得锁(加一个短暂的过期时间)
3、锁归属标识: 加锁和解锁的必须是同一个客户端, 客户端不能解掉非自己持有的锁(锁应具备标识)
以下是PHP代码
$redis = new Redis();
$redis->pconnect("127.0.0.1", 6379);
$redis->auth("password");
// 密码验证
$redis->select(1);
// 选择所使用的数据库, 默认有16个
$lock_key = 'LOCK_KEY;
$is_lock = $redis->exists($lock_key);
if(!$is_lock) { // 如果没有锁
$redis->set($lock_key, 1, 'nx', 'ex', 4);
// 加锁,持续4秒
try{
//业务逻辑
}catch(Exception $e){
$redis->del($lock_key);
//发生异常也解锁
}
$redis->del($lock_key);
return ['code' => '0000', 'msg' => '领取成功'];
}else{
return ['code'=>'1005','msg'=>'请稍后重试'];
}
推荐阅读
- PHP强化之09|PHP强化之09 - 常量
- 使用SAP|使用SAP WebIDE进行SAP Cloud Platform Business Application开发
- Python基础|使用Python求解数独
- 使用本地计划任务定时关闭azure虚拟机
- Anaconda不再使用国内镜像
- 【睡前好事冥想201703012】
- 使用VIPER构建iOS应用
- 搭建单机Redis
- 【翻译】使用Swift语言来进行数据科学研究的指南
- MAC下使用Visual|MAC下使用Visual Studio Code来运行C/C++的记录