使用redis实现简单的锁机制
在测试第三方账号注册时,授权拉取后,如果两台手册同时点击注册按钮,数据库中就会新增两天一模一样的数据,而我们的需求是一个第三方账号只能绑定一个账号,所以,由此现象可以知道,这里产生了并发访问,我们应该通过加锁的形式来杜绝该现象的产生。那么,如何操作呢?
我们先上代码:
<?php
/**
* 加锁
* @param string $action 业务逻辑,当前框架中未方法名即可
* @param string $extra 额外参数,例如用户ID等
* @return boolen true=加锁成功
*/
function lock($key) {
$Redis = new Redis();
$Redis->connect('127.0.0.1', 6379) or die('redis连接失败');
if($Redis::setnx($key, 1)) {
$Redis::expire($key, 30); //设置过期时间
return true;
}
//防止死锁,-1标识key存在,但未设置过期时间
if($Redis::ttl($key) == -1) {
$Redis::expire($key, 5);//设置过期时间
}
return false;
}
由上述代码,我们可以分析得到:
1、先使用setnx设置key值,setnx的意思是:
将 key 的值设为 value ,当且仅当 key 不存在。
若给定的 key 已经存在,则 SETNX不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
setnx不能设置过期时间,所以设置成功后应该调用expire来给key设置过期时间。
2、如果setnx设置失败了,则说明此时有别的用户加了锁,所以此时应该返回失败。
但是如果之前的用户在获取锁时,即第一步setnx时成功了,但是redis宕机了,且也没有手动解锁,这就会造成下一个用户一直获取不到锁,这就被称为死锁。
为了防止这种现象发生,我们可以调用redis的 ttl 方法:
使用redis实现简单的锁机制的更多相关文章
- 基于Redis的简单分布式锁的原理
参考资料:https://redis.io/commands/setnx 加锁是为了解决多线程的资源共享问题.Java中,单机环境的锁可以用synchronized和Lock,其他语言也都应该有自己的 ...
- 使用Redis模拟简单分布式锁,解决单点故障的问题
需求描述: 最近做一个项目,项目中有一个功能,每天定时(凌晨1点)从数据库中获取需要爬虫的URL,并发送到对应的队列中,然后客户端监听对应的队列,然后执行任务.如果同时部署多个定时任务节点的话,每个节 ...
- php+redis 学习 三 乐观锁
<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现乐观锁机制 * * @example php ...
- php+redis 学习 二 悲观锁
<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现悲观锁机制 * */ $timeout = 5 ...
- 【Redis 分布式锁】(1)一把简单的“锁”
原文链接:https://www.changxuan.top/?p=1230 在单体架构向分布式集群架构演进的过程中,项目中必不可少的一个功能组件就是分布式锁.在开发团队有技术积累的情况下,做为团队的 ...
- Redis 利用锁机制来防止缓存过期产生的惊群现象-转载自 http://my.oschina.net/u/1156660/blog/360552
首先,所谓的缓存过期引起的“惊群”现象是指,在大并发情况下,我们通常会用缓存来给数据库分压,但是会有这么一种情况发生,那就是在一定时间 内生成大量的缓存,然后当缓存到期之后又有大量的缓存失效,导致后端 ...
- Redis Cluster架构和设计机制简单介绍
之前另一篇文章也介绍了 Redis Cluster (link,在文章的后半部分) 今天看到这一篇,简单说一下(http://hot66hot.iteye.com/blog/2050676) 作者的目 ...
- redis锁机制介绍与实例
转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...
- Mysql锁机制简单了解一下
历史文章推荐: 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问题看这篇就够了 Java NIO 概览 关于分布式计算的一些概念 一 锁分类(按照锁的粒度分类) Mysq ...
随机推荐
- 面向对象封装的web服务器
import socket import re import os import sys # 由于前面太繁琐,可以用类封装一下,也可以分几个模块 class HttpServer(object): d ...
- (转)为什么国外 MMORPG 中不采用自动寻路等功能?
不只是自动寻路,现在网游中的教学引导系统,辅助系统的功能强大程度,友好程度都可以说到了变态的程度,开发这些功能投入的资源甚至要超过游戏内容本身.究其原因,还是竞争越来越激烈,人心越来越浮躁,游戏商家为 ...
- 【PHP】nl2br转化输出input框的换行
在input或者textarea框中输入的换行符保存到数据库是/n,如果直接输出到前端的话是不会有换行的,所以要用到nl2br转化 nl2br($test);
- LAMP架构的搭建
什么是LAMP架构? L : Linux,2.6.18-308.el5(redhat5.8) A :Apache,httpd 2.4.4 M : mysql-5.5.28 P : php-5.4. ...
- QToolBox学习笔记
抽屉控件效果类似于QQ界面 最外面一层叫工具盒QToolBox QToolBox中装的是QGroupBox,分组的盒子 在分组的盒子QGroupBox中装的是QToolButton.
- Robots Gym - 101915G
传送门 The Robotics Olympiad teams were competing in a contest. There was a tree drawn on the floor, co ...
- 笔记-scrapy-请求-下载-结果处理流程
笔记-scrapy-请求-下载-结果处理流程 在使用时发现对scrpy的下载过程中的处理逻辑还是不太明晰,-写个文档温习一下. 1. 请求-下载-结果处理流程 从哪开始呢? engine.p ...
- 搭建Linpack
环境:vmware workstation14 + centos7(linux基本都可以) 一.开始安装mpich 1. 解决依赖gcc gcc-gfortran sudo yum install g ...
- Spring Boot :Request请求处理流程
技术交流群:233513714
- Redis数据更新
技术交流群: 233513714