redis setnx 分布式锁_Redis 分布式锁PHP

Redis 分布式锁的作用

在单机环境下,有个秒杀商品的活动,在短时间内,服务器压力和流量会陡然上升。这个就会存在并发的问题。想要解决并发需要解决一下问题

1、提高系统吞吐率也就是qps 每秒处理的请求书

解决问题一:采用内存型数据库提高系统的qps

解决问题二:就要用到经常会遇到的锁,例如MySQL 有读锁、写锁、排他锁、悲观锁、乐观锁。不过这里只讨论redis来实现锁

简单版设置锁

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); //连接Redis
$expire = 10;//有效期10秒
$key = 'lock';//key
$value = time() + $expire;//锁的值 = Unix时间戳 + 锁的有效期
$lock = $redis->setnx($key, $value);
//判断是否上锁成功,成功则执行下步操作
if(!empty($lock))
{
//下步操作...
}

如果以这样的简单版设置锁就能解决所有问题,未免也太小看 锁 在程序中应用了。

按正常的操作示例基本上都是这样写的。但是这样写有一些问题

1、假如有10000 个请求访问了redis 不存在的键,这样请求就是指接到了MySQL数据,造成CPU短时间内达到100%甚至宕机。这样场景俗称缓存击穿造成的缓存雪崩。

解决问题:引用reids setnx 方法的作用是,当设置的key 不存在时,设置新的值。这样就避免了缓存击穿的问题。检测键的过期时间,避免产生死锁

解决死锁问题

$expire = 10;//有效期10秒
$key = 'lock';//key
$value = time() + $expire;//锁的值 = Unix时间戳 + 锁的有效期
$status = true;
while($status)
{
$lock = $redis->setnx($key, $value);
if(empty($lock))
{
$value = $redis->get($key);
if($value < time())
{
$redis->del($key);
}
}else{
$status = false;
//下步操作....
}
}

2、分布式集群业务业务场景下,每台服务器是独立存在的。多台服务器怎么通过一个标识来相互竞争锁呢。这里就用到了分布式锁

这里简单介绍一下,以MYSQL 的事务机制来延生。事务四个特性ACID,有四种隔离级别:为提交读、已提交读、可重复读、串行化。这些特性都只在单台服务器上生效。到了分布式集群了,数据在不同的服务器上,紧靠事务很难保持数据的一致性及隔离性,事务的作用就意义不大了。Redis也是如此。

正确的分布式锁的打开方式

/**
* 实现Redis分布锁
*/
$key = 'demo'; //要更新信息的缓存KEY
$lockKey = 'lock:'.$key; //设置锁KEY
$lockExpire = 10; //设置锁的有效期为10秒
//获取缓存信息
$result = $redis->get($key);
//判断缓存中是否有数据
if(empty($result))
{
$status = TRUE;
while ($status)
{
//设置锁值为当前时间戳 + 有效期
$lockValue = time() + $lockExpire;
/**
* 创建锁
* 试图以$lockKey为key创建一个缓存,value值为当前时间戳
* 由于setnx()函数只有在不存在当前key的缓存时才会创建成功
* 所以,用此函数就可以判断当前执行的操作是否已经有其他进程在执行了
* @var [type]
*/
$lock = $redis->setnx($lockKey, $lockValue);
/**
* 满足两个条件中的一个即可进行操作
* 1、上面一步创建锁成功;
* 2、 1)判断锁的值(时间戳)是否小于当前时间 $redis->get()
* 2)同时给锁设置新值成功 $redis->getset()
*/
if(!empty($lock) || ($redis->get($lockKey) < time() && $redis->getSet($lockKey, $lockValue) < time() ))
{
//给锁设置生存时间
$redis->expire($lockKey, $lockExpire);
//******************************
//此处执行插入、更新缓存操作...
//******************************
//以上程序走完删除锁
//检测锁是否过期,过期锁没必要删除
if($redis->ttl($lockKey))
$redis->del($lockKey);
$status = FALSE;
}else{
/**
* 如果存在有效锁这里做相应处理
* 等待当前操作完成再执行此次请求
* 直接返回
*/
sleep(2);//等待2秒后再尝试执行操作
}
}
}

结尾

文章从知识面的广度(mysql)、示例代码优缺点的简介及应用的场景,区别于其他博客文章。嘿嘿~

2b9bcff80612507db0303dc32c8dd8c8.png

更多精彩

敬请关注“PHP技术大全”微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinForm窗体自适应分辨率

我们自己编写程序的界面&#xff0c;会遇到各种屏幕分辨率&#xff0c;只有自适应才能显的美观。实际上&#xff0c;做到这点也很简单&#xff0c;就是首先记录窗体和它上面控件的初始位置和大小&#xff0c;当窗体改变比例时&#xff0c;其控件的位置和大小也按此比例变化即可…

ping端口_干货分享:shell脚本批量telnet ip 端口

问1&#xff1a;亲&#xff0c;请教个问题&#xff0c;我这边有200台服务器&#xff0c;怎么看它是否在线呢&#xff1f;答&#xff1a;简单&#xff0c;下载个PingInfoView直接批量ping下&#xff0c;能ping通的就在线&#xff0c;反之离线。问2&#xff1a;那怎么看我这200台…

IIS 7.0 部署MVC

开发的MVC 3.0 项目&#xff0c;在部署服务上还是与需要花一点功夫&#xff0c;这里把遇到的问题罗列出来。 本文主要介绍IIS 7.5中安装配置MVC 3.0的具体办法&#xff01; 部署必备&#xff1a; Microsoft .net FrameWork 4.0安装包 安装ASP.NET MVC 3.0 如果 Asp.NET v4.0.30…

不是有效的函数或过程名_过程和函数

VBA代码有两种组织形式&#xff0c;一种是过程&#xff0c;另一种就是函数。其实过程和函数有很多相同之处&#xff0c;除了使用的关键字不同之外&#xff0c;还有不同的是&#xff1a;函数有返回值&#xff0c;过程没有。函数可以在Access窗体&#xff0c;查询中像一般的Acces…

浏览器快捷键_浏览器快捷键,让你事半功倍

随着互联网时代的发展&#xff0c;手机、电脑已经成为人们生活中不可或缺得一部分&#xff0c;无论是生活还是工作。尤其是办公室族&#xff0c;几乎每天都要面对电脑7/8个小时&#xff0c;查找各种信息或者浏览新闻&#xff0c;浏览器无可厚非的成为了装机必备的软件&#xff…

小程序iconfont报错_【经验】开发微信小程序经验总结

一.技术要求(语言方面)有H5或H4和CSS3的书写经验&#xff0c;没有建议观看B站中的 渡一教育-Web前端开发(html css不算语言)。强烈推荐他们的视频&#xff0c;主讲人没有口音且视频质量很高&#xff0c;是哈尔滨理工大学毕业之后进入阿里工作的Web前端工程师 姬成老师。JavaScr…

python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...

热门推荐html/css一、escape和它们不是同一类简单来说&#xff0c;escape是对字符串(string)进行编码(而另外两种是对URL)&#xff0c;作用是让它们在所有电脑上可读。编码之后的...标签&#xff1a;03-22html/css场景&#xff1a; 在项目开发过t程中需要找到url中某个参数的值…

【BZOJ】【1086】 【SCOI2005】王室联邦

树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/http://blog.csdn.net/popoqqq/article/details/42772237 这题是要把树分成一块一块的……&#xff08;感觉好像不是原来理解的树分块处理操作啊……&#xff09; 每块…

红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)

红黑树的使用场景非常广泛&#xff0c;比如nginx中用来管理timer、epoll中用红黑树管理事件块&#xff08;文件描述符&#xff09;、Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块、CSTL中map,set的底层实现全是用的红黑树。掌握红黑树的原理以及使用场景&…

linux中按行读取文件,Linux按行读取文件内容

方法1&#xff1a;while循环中执行效率最高&#xff0c;最常用的方法。function while_read_LINE_bottm(){While read LINEdoecho $LINEdone < $FILENAME}#!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件)注释&#xff1a;习惯把这种方式叫做read釜…

酱油和gbt酱油哪个好_酱油越贵越好?认准瓶身这4处,轻松挑到好酱油!

买酱油这件事&#xff0c;爷叔阿姨们都不陌生。现在市面上酱油品种很多&#xff0c;除了普通的生抽、老抽以外&#xff0c;还有些别的口味&#xff0c;比如海鲜酱油、菌菇酱油等等&#xff0c;价格比普通的还高出不少&#xff0c;这些酱油真的更鲜更好吗&#xff1f;买酱油的2大…

linux网站465端口是什么端口,发送端口25,465,587端口疑问解答

25端口(SMTP)&#xff1a;25端口为SMTP(Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议)服务所开放的&#xff0c;是用于发送邮件。如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时&#xff0c;你的机器的某个动态端口(大于1024)就会与邮件服务器的25号…

uml 时序图_程序猿都应学习的语言:看 25 张图学 UML

作者 | 逸珺责编 | 屠敏来源 | 嵌入式客栈作为程序猿都最好掌握的一门语言&#xff0c;那就是UML(Unified Modeling Language)&#xff0c;统一建模语言(UML)是软件工程领域中一种通用的开发建模语言&#xff0c;旨在提供一种可视化系统设计的标准方法。是开发人员、系统设计人…

新服务器的配置

新服务器的安装好那三款软件后还是打不开会报错&#xff0c;去服务器管理网站增加执行权即可。 转载于:https://www.cnblogs.com/longhun/p/4266665.html

Linux下好用的日志库,我使用過的Linux命令之tailf - 跟蹤日志文件/更好的tail -f版本...

用途說明tailf命令幾乎等同於tail -f&#xff0c;嚴格說來應該與tail --followname更相似些。當文件改名之后它也能繼續跟蹤&#xff0c;特別適合於日志文件的跟蹤(follow the growth of a log file)。與tail -f不同的是&#xff0c;如果文件不增長&#xff0c;它不會去訪問磁盤…

Android学习笔记(四十):Preference的使用

Preference直译为偏好&#xff0c;博友建议翻译为首选项。一些配置数据&#xff0c;一些我们上次点击选择的内容&#xff0c;我们希望在下次应用调起的时候依旧有效&#xff0c;无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这样的情况&#xff…

telegr怎么连接不上_无线网密码正确但是手机连接不上wifi?

现在企业、家庭、餐厅、宾馆到处都有WiFi无线网络信号&#xff0c;为大家的电脑、手机提供免费的无线网络服务&#xff0c;但是有的时候明明有信号而无线网密码正确却连不上&#xff0c;是多么痛苦的一件事情。那么无线网密码正确但是手机连接不上wifi怎么回事&#xff1f;下面…

hdu3652(数位dp)

要求找出范围内含有“13”且能被13整除的数字的个数 可以使用数位dp dp[i][j][0] 表示长度为i&#xff0c;余数为j&#xff0c;不含13的数字的个数 dp[i][j][1] 表示长度为i&#xff0c;余数为j&#xff0c;3开头的数字的个数 dp[i][j][2] 表示长度为i&#xff0c;余数为j&…

怎么查看电脑是不是禁ping_怎么查看电脑内存的大小,找回丢失的内存,电脑小技巧...

小A自己组装了一台电脑&#xff0c;配件都是在jd买了。他高高兴兴的安装了系统准备开始体验一把&#xff0c;同事突然问&#xff0c;你的电脑内存是多少&#xff0c;他点来点去也没找到答案。他只知道他买了一个8G的内存条。.我们一般查看内存有两个地方。一我们的电脑 属性 安…

finereport字段显示设置_QA | 表单如何设置字段显示逻辑?

Hi&#xff0c;大家好&#xff01;表姐又来给大家答疑解惑啦&#xff01;这一期的Q&A我们来聊聊表单如何设置字段显示逻辑。字段显示逻辑是什么&#xff1f;字段显示逻辑是指根据设定字段条件&#xff0c;显示或隐藏特定的字段&#xff0c;可以实现选择不同内容&#xff0c…