PHP调用redis进行读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写。
$lock_key = 'LOCK_PREFIX' . $redis_key;
$is_lock = $redis->setnx($lock_key, 1); // 加锁
if($is_lock == true){ // 获取锁权限
$redis->setex($redis_key, $expire, $data); // 写入内容
// 释放锁
$redis->del($lock_key);
}else{
return true; // 获取不到锁权限,直接返回
}
思路是:设置一个锁的key,setnx是原子操作,只能一个进程写入成功,写入成功返回true(表示获取锁权限),然后写入内容再释放锁即删除锁key。获取不到锁的进程直接返回。但是这里有种情况,获取锁权限的进程,获取锁后运行报错了,导致没有释放锁,那么一直就不能写入内容,这时就需要拿不到锁权限的进程去判断锁的剩余有效时间,如果为-1则设置锁的有效时间为5秒(预留5秒给拿到锁的进程的运行时间,足够多了)。改良后的代码:
$lock_key = 'LOCK_PREFIX' . $redis_key;
$is_lock = $redis->setnx($lock_key, 1); // 加锁
if($is_lock == true){ // 获取锁权限
$redis->setex($redis_key, $expire, $data); // 写入内容
// 释放锁
$redis->del($lock_key);
}else{
// 防止死锁
if($redis->ttl($lock_key) == -1){
$redis->expire($lock_key, 5);
}
return true; // 获取不到锁权限,直接返回
}

猜你喜欢
联络方式:
深圳 · 龙岗 · 大运软件小镇22栋302-308
电话:400 1828 580
邮箱:szhulian@qq.com



-
VR设计指南之基础概念与设计工具
Jean-Marc Denis:新的空间维度与沉浸式体验所带来的冲击是前所未有的。要在三维世界当中打造令人舒适的互动体验,你需要了解一些此前可能并未接触过的设计与技术原则。我们的Cardboard团队将一系列概念知识打包到了Cardboard Design Lab这款app(Android)当中,你可以配合Cardboard沉浸到VR世界当中进行学习。
-
MySQL数据库搭建方法详解
现在各大中小型网都都会使用mysql数据库主从服务器功能来对网站数据库进行异步备份了,下面我们来给大家介绍主从服务器配置步骤。
-
网站太LOW了?网站改版及301设置必看说明
为了解决这类问题,百度站长平台在12月下旬即将推出改版工具,之后通过工具与设置301两种方式相结合的形式将能够做到网站接近无损失的新旧交换
-
移动端 Web 页 input 控制软键盘
打开一个需要用户填写信息的表单界面时,为了提高可用性,PC 端一般会将光标聚焦到对应输入框(input),移动端也是同理,让对应的 input 获得 focus 状态,唤起软键盘,方便用户直接输入。
-
网站建设要考虑到做SEO优化推广
在这一个竞争激烈的市场,网站成为了企业打开互联网的一种方式,企业建设网站的做用不光是一种展现形式,还要为企业带来流量,网站想要获取流量,那就要做好关键词排名,所以说SEO优化推广是网站重要的部分。