redis同步锁的真实应用场景
一、问题由来
现在正在做的小程序后台中,有一个功能叫做高光时刻,在操作高光时刻的时候,可能会有多个用户来同时想操作这个功能,可是在同一时间只能
有一个用户能够操作。刚开始做的时候,自己的做法是在redis中添加一个简单的相同的key,当有一个用户在操作这个功能时,就将这个key的值
设置为TRUE,并且设置一定的有效时间。进入这个方法时,先从redis中获取这个key的值,如果为TRUE,则直接返回错误结果,不为TRUE就
将其设置为TRUE。代码如下,

这样进行实际测试的时候发现,还是出了问题。当有两个人同时进行操作的时候,两个用户的状态都更新了,可是高光时刻的效果只操作一个人的。
这样BUG就出现了。
二、问题分析
对于这个问题的分析,自己的理解是当两个用户同时进行操作时,不同的线程都执行了这个方法,而且由于方法执行很快,因此两个方法获取到的
key的值都不为TRUE,就继续执行后面的代码,然后设置key的值为TRUE,导致出现BUG。
三、解决方案
以前也听说过redis的同步锁,自己就想着使用redis的同步锁,当使用同步锁之后,就相当于把这个方法给锁住了,同一时间这个方法只能有一个线程执行,
只有当这个锁释放掉之后,其他线程才能执行这个方法。方案确定后,进行进行尝试。
使用redis的同步锁代码很简单,
/**
* redisson 用于分布式锁
**/
@Autowired
private RedissonClient redissonClient;

这样就把这个方法给锁住了。这里有一点需要注意的是,锁必须是同一把锁,不能是不同的锁,这样当有一个线程在执行这个方法被锁住后,其他线程想操作
这个方法就需要等待。只有等锁被释放掉之后,其他线程才能执行这个方法,也就解决了同一时刻可能有多个用户进行操作的问题。代码写好后,立马进行
测试,完全可行,很好的解决了这个问题。
redis同步锁的真实应用场景的更多相关文章
- 应用Redis分布式锁解决重复通知的问题
研究背景: 这几天被支付宝充值后通知所产生的重复处理问题搞得焦头烂额, 一周连续发生两次重复充钱的杯具, 发事故邮件发到想吐..为了挽回程序员的尊严, 我用了Redis的锁机制. 事故场景: 支付宝下 ...
- Lua脚本在redis分布式锁场景的运用
目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...
- 结合 Redis 实现同步锁
1.技术方案 1.1.redis的基本命令 1)SETNX命令(SET if Not eXists) 语法:SETNX key value 功能:当且仅当 key 不存在,将 key 的值设为 val ...
- 死磕 java同步系列之redis分布式锁进化史
问题 (1)redis如何实现分布式锁? (2)redis分布式锁有哪些优点? (3)redis分布式锁有哪些缺点? (4)redis实现分布式锁有没有现成的轮子可以使用? 简介 Redis(全称:R ...
- Redis全方位详解--数据类型使用场景和redis分布式锁的正确姿势
一.Redis数据类型 1.string string是Redis的最基本数据类型,一个key对应一个value,每个value最大可存储512M.string一半用来存图片或者序列化的数据. 2.h ...
- Redis基础知识之—— 缓存应用场景
转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端- ...
- redis咋么实现分布式锁,redis分布式锁的实现方式,redis做分布式锁 积极正义的少年
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- redis分布式锁的几种实现方式,以及Redisson的配置和使用
最近在开发中涉及到了多个客户端的对redis的某个key同时进行增删的问题.这里就会涉及一个问题:锁 先举例在分布式系统中不加锁会出现问题: redis中存放了某个用户的账户余额 ,例如100 (用户 ...
- Redis分布式锁的正确实现方式
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- Redis分布式锁---完美实现
这几天在做项目缓存时候,因为是分布式的所以需要加锁,就用到了Redis锁,正好从网上发现两篇非常棒的文章,来和大家分享一下. 第一篇是简单完美的实现,第二篇是用到的Redisson. Redis分布式 ...
随机推荐
- C++ Qt开发:TableWidget表格组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableWi ...
- 轻量级按键动作识别模块(C语言)
1.前言 继嵌入式(单片机)裸机 C 语言开发 + 按键扫描(模块分层/非阻塞式)文章后,原来的按键识别基本能满足大部分需求,但是对于双击和多击等多样化的功能需求并不能满足,因此对整个按键动作识别模块 ...
- 素数打表,洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
这道题的最后一个样例TLE(超时)了,判断素数的条件是 i*i<n 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include ...
- Label的背景色
Label的背景色是 color属性,但是这个属性是 必须 Transparent 为 false的时候 才生效,否则不生效
- 麒麟V10虚拟机安装(详细)
现在国企和央企单位都在做国产化适配工作,服务器采用:中科曙光(海光Hygon).中科德泰(龙芯Loongson).宝德(鲲鹏Kunpeng)等国产配备国产处理器的服务器:数据库采用:人大金仓(King ...
- IoT(Internet of things)物联网入门介绍
1.什么样的物可以入网? 要有数据传输通路 要有一点的存储功能 要有CPU 要有操作系统 要有专门的应用程序 遵循物联网的通信协议 在网络世界中有可被识别的唯一编号 2.MQTT协议 不是在说物联网吗 ...
- RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
前言 目前主流国产芯片为RV11XX.RK33XX.Hi35XX系列,本系列开启RK3568系列的技术教程笔记分享. 本篇主要介绍RK3568芯片和入手开发板的核心板详细介绍. RK3568 ...
- locals和globals,函数的嵌套,nonlocal,闭包函数及特点以及匿名函数---day11
1.locals和globals 1.1locals 获取当前作用域中的所有内容 locals 如果在函数外,调用locals(),获取打印的是打印之前的所有变量,返回字典,全局空间作用域 loca ...
- 协程与yield表达式
在函数内,yield语句可以作为表达式使用,出现在赋值运算符的右边,例如: def receiver(): print("Ready to receive") while True ...
- django学习第二天---django视图系统,基于类的视图写法,FBV和CBV加装饰器
django视图系统 request对象 常用属性和方法 print(request) #wsgirequest对象 print(request.path) #请求路径 /index/ print(r ...