PHP使用Redis实现防止大并发下二次写入的方法
发布:smiling 来源: PHP粉丝网 添加日期:2021-08-11 14:06:49 浏览: 评论:0
这篇文章主要介绍了PHP使用Redis实现防止大并发下二次写入的方法,结合实例形式分析了php使用锁机制实现并发读写redis情况下的读写错误,需要的朋友可以参考下
本文实例讲述了PHP使用Redis实现防止大并发下二次写入的方法,分享给大家供大家参考,具体如下:
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; // 获取不到锁权限,直接返回
- }
Tags: Redis PHP二次写入
- 上一篇:PHP完全二叉树定义与实现方法示例
- 下一篇:彻底搞懂PHP 变量结构体
相关文章
- ·php实现redis数据库指定库号迁移(2014-09-10)
- ·redis访问权限控制,密码设置(2014-09-10)
- ·php怎么安装redis扩展?redis安装以及php扩展的介绍(2018-07-20)
- ·laravel项目利用twemproxy部署redis集群的完整步骤(2018-11-07)
- ·PHP+redis实现的悲观锁机制示例(2018-11-14)
- ·PhpRedis与Predis之间的性能比较(实例)(2020-02-04)
- ·Redis分片(分布式缓存)(2020-02-04)
- ·浅谈redis的缓存穿透和缓存失效的预防和解决(2020-04-09)
- ·PHP使用Redis的GEO(地理位置)命令(2020-04-28)
- ·php实现redis数据库指定库号迁移的方法(2021-05-08)
- ·php操作redis缓存方法分享(2021-05-27)
- ·PHP实现操作redis的封装类完整实例(2021-06-26)
- ·PHP+redis实现添加处理投票的方法(2021-06-26)
- ·PHP使用redis实现统计缓存mysql压力的方法(2021-06-26)
- ·PHP+Redis 消息队列 实现高并发下注册人数统计的实例(2021-09-01)
- ·php+redis消息队列实现抢购功能(2021-09-03)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)