PHP使用Redis实现防止大并发下二次写入的方法

2017-10-12 317 0 编辑:深正互联 来源:互联网

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; // 获取不到锁权限,直接返回

}


本站文章均为深正网站建设摘自权威资料,书籍,杂志或原创文章,如有版权纠纷或者违规问题,请即刻联系我们删除,我们欢迎您分享到社交网站,引用和转载,我们谢绝直接复制和抄袭!感谢您...

学习课堂

设计规范对设计师的价值是?

在产品发展到稳定阶段、参与的人越来越多时,还是十分有必要整理设计规范的,因为它可以帮助我们提升产品统一性、团队工作效率以及细节体验。

2017-02-28
2017-09-28
2017-08-18
2016-10-20

动态更新

【签约】乐佰津酒店管理有限公司

乐佰津会展公司是一家立足于中美两地的专业会展服务供应商。我们利用美国丰富的展览、会议资源,帮助中国的外贸企业拓展国际市场、了解最新的行业发展趋势。

2016-03-08
2017-09-12
2016-10-19
2016-05-18

资讯知识

如何购买最合适的网站服务器?

深圳网站建设公司中,98%的网站公司都会全包网站服务器,网络公司选择全包服务器,这里面有三个重要的因素:网站便于网络公司管理,有任何问题可以第一时间处理,省时省力,方便客户,方便网络公司...

>2017-09-15
>2017-06-19
>2017-06-14
>2017-08-28
亲,请您联系我们吧

您的疑问,只要您主动联系,将为您得到最专业,最全面的解答,欢迎您询问...