PHP使用redis设置锁
- 一、场景
- 二、解决
- 三、redis 代码
- 四、相关代码
一、场景
用户第一次登录进去要进行某些操作
- 我们都知道:用户登录成功之后会从
登录页login
跳到首页index
- 我们也知道用户是否登录是根据浏览器的
session
来判断的 - 现在我们要在首页处理用户第一次登录进来的逻辑,如果直接在首页处理就会有问题:因为用户
第一次登录
进来会执行,用户F5刷新
首页也会执行(用户刷新首页时,我们不需要处理这个逻辑)。
二、解决
- 用户首次登录进来设置一个redis锁
- 如果锁设置成功,则执行需要进行的逻辑;如果锁设置失败,则说明锁已存在,不需要处理第一次登录进来的逻辑
- 何时释放锁
- 用户登录成功
login.php
时释放上次设置的锁,在index.php
中设置本次登录的新锁 - 用户点击
退出
时释放本次登录的锁
- 用户登录成功
三、redis 代码
- 设置锁:我们在
redis
set
的基础上封装一个设置锁的方法setNx
/*** 设置锁* @param $key 锁的键* @param $value 锁的值* @param int $ttl 锁的过期时间(单位:秒 s),默认立即过期* @return mixed*/
public function setNx($key, $value, $ttl = 0) {$result = $this->redis->set($key, $value, ['nx', 'ex' => $ttl]);return $result;
}
- 删除锁
/*** 删除锁,直接del key 即可。* @param $key* @return mixed*/
public function delete($key) {return $this->redis->del($key);
}
- 封装默认的redis方法:PHP - Redis实现入队出队
四、相关代码
- 用户
登入页
处理
public function login() {if ($this->request()->isPost()) {//...登录逻辑//删除上次登录的锁$redis->delete("is_first:" . $uid); //清空redis锁}else{$this->view(); //登录页}
}
- 用户
登出
处理
public function logout() {$redis->delete("is_first:" . session('user')['id']); //清空redis锁session(null); //session清空//...返回数据
}
- 用户登录成功 ->
主页
处理
public function index() {$lock = $redis->setNx('is_first:' . $uid, true, 86400); //lock: bool类型(true / false);设置锁-过期时间:1天$this->assign('lock', $lock); //把锁是否设置成功传到html页面,页面判断,如果成功则执行第一次登录的逻辑$this->view(); //主页
}
PHP使用redis设置锁相关推荐
- Redis分布式锁失效场景分析
本文主要介绍了分布式锁失效的三种场景,并通过一些案例进行分析 背景 最近在项目中发现一些因为错误使用Redis分布式锁导致锁失效的问题.在此整理了一下使用分布式锁时要注意的点. 什么是分布式锁 分布式 ...
- Redis分布式锁背后的原理
什么是分布式锁? 分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性. 分布式锁需要具 ...
- java如何保证redis设置过期时间的原子性_redis专题系列22 -- 如何优雅的基于redis实现分布式锁
几个概念 线程锁:主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比 ...
- java如何保证redis设置过期时间的原子性_分布式锁用 Redis 还是 Zookeeper
在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单. 由于系统有 ...
- c# 操作redisclient 设置过期时间_C# Redis分布式锁单节点
(给DotNet加星标,提升.Net技能) 转自:热敷哥cnblogs.com/refuge/p/13774008.html 为什么要用分布式锁? 先上一张截图,这是在浏览别人的博客时看到的. 在了解 ...
- c# 操作redisclient 设置过期时间_C# Redis分布式锁 单节点
为什么要用分布式锁? 先上一张截图,这是在浏览别人的博客时看到的. 在了解为什么要用分布式锁之前,我们应该知道到底什么是分布式锁. 锁按照不同的维度,有多种分类.比如 1.悲观锁,乐观锁; 2.公平锁 ...
- Redis多容器高并发场景 , 设置缓存的时候,要考虑多容器加锁的场景。(incr计数和redis分布式锁区别)
1.设置缓存的时候,要考虑多容器加锁的场景. (1)场景,短信回执场景,会有二次回执的情况,但是我们只处理一次回执的消息体,如何不处理二次回执呢? // 队列中有数据且容量未达到100,可继续放入队列 ...
- 分布式锁的过期时间设置多长合适_科普:Redis 分布式锁进化史(解读 + 缺陷分析)...
近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Z ...
- redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...
在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...
- 快来学习Redis 分布式锁的背后原理
以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这 ...
最新文章
- 2019-2020 Google研究资助奖(Faculty Research Award)获奖出炉!185人上榜
- es6语法-let定义变量和常量
- 如果我是一线技术主管…… 1
- ToolTip特效 JavaScript 盗取厦门人才网的特效
- 39. 确保判别式是纯函数
- APISpace 通用文字识别OCR接口 免费好用
- 字体直链提取器_MIUI主题直链提取器下载-MIUI主题直链提取软件 v1.3.5_5577安卓网...
- vue在线预览word踩坑日记
- Python打字练习程序
- 企业微信开发实战:自建审批流引擎
- 2022腾讯云学生云服务器申请攻略(25岁以下免学生认证)
- 迅雷“去中心化”再升级 转型中All in 区块链
- 文件系统以及硬盘分区概念
- Cocos2d-x游戏开发之骨骼动画详解-Spine
- 密码学系列之四:一文搞懂序列密码
- Java通过SMS短信平台实现发短信功能
- 数据恢复软件在苹果电脑上的应用
- LayUI_02 前端框架 页面元素
- 华为mate40pro和小米10pro哪个好
- 卷妹带你学数据库---5天冲刺Day5
热门文章
- c++ *p++ (*p)++ ++(*p)详细实战解读
- 快速排序C++方法(3种)
- 页面刷新_刷新vue页面,解决数据丢失
- nginx nodejs环境配置_nginx的脚本特性-nginScript笔记
- okhttp返回内容乱码_okHttp 采坑指南-interceptor(乱码)
- abb工业机器人电压不稳_ABB工业机器人常见故障及解决方法,想要提升自己的就赶紧保存下来吧...
- sstv解码_新的业余无线电 SSTV 设备已运抵国际空间站
- linux mysql外网连接不成功的可能原因
- Redis 的字符串是这样实现的…
- javascript美术馆