一、问题由来

现在正在做的小程序后台中,有一个功能叫做高光时刻,在操作高光时刻的时候,可能会有多个用户来同时想操作这个功能,可是在同一时间只能

有一个用户能够操作。刚开始做的时候,自己的做法是在redis中添加一个简单的相同的key,当有一个用户在操作这个功能时,就将这个key的值

设置为TRUE,并且设置一定的有效时间。进入这个方法时,先从redis中获取这个key的值,如果为TRUE,则直接返回错误结果,不为TRUE就

将其设置为TRUE。代码如下,

这样进行实际测试的时候发现,还是出了问题。当有两个人同时进行操作的时候,两个用户的状态都更新了,可是高光时刻的效果只操作一个人的。

这样BUG就出现了。

二、问题分析

对于这个问题的分析,自己的理解是当两个用户同时进行操作时,不同的线程都执行了这个方法,而且由于方法执行很快,因此两个方法获取到的

key的值都不为TRUE,就继续执行后面的代码,然后设置key的值为TRUE,导致出现BUG。

三、解决方案

以前也听说过redis的同步锁,自己就想着使用redis的同步锁,当使用同步锁之后,就相当于把这个方法给锁住了,同一时间这个方法只能有一个线程执行,

只有当这个锁释放掉之后,其他线程才能执行这个方法。方案确定后,进行进行尝试。

使用redis的同步锁代码很简单,

/**
* redisson 用于分布式锁
**/
@Autowired
private RedissonClient redissonClient;

这样就把这个方法给锁住了。这里有一点需要注意的是,锁必须是同一把锁,不能是不同的锁,这样当有一个线程在执行这个方法被锁住后,其他线程想操作

这个方法就需要等待。只有等锁被释放掉之后,其他线程才能执行这个方法,也就解决了同一时刻可能有多个用户进行操作的问题。代码写好后,立马进行

测试,完全可行,很好的解决了这个问题。

redis同步锁的真实应用场景的更多相关文章

  1. 应用Redis分布式锁解决重复通知的问题

    研究背景: 这几天被支付宝充值后通知所产生的重复处理问题搞得焦头烂额, 一周连续发生两次重复充钱的杯具, 发事故邮件发到想吐..为了挽回程序员的尊严, 我用了Redis的锁机制. 事故场景: 支付宝下 ...

  2. Lua脚本在redis分布式锁场景的运用

    目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...

  3. 结合 Redis 实现同步锁

    1.技术方案 1.1.redis的基本命令 1)SETNX命令(SET if Not eXists) 语法:SETNX key value 功能:当且仅当 key 不存在,将 key 的值设为 val ...

  4. 死磕 java同步系列之redis分布式锁进化史

    问题 (1)redis如何实现分布式锁? (2)redis分布式锁有哪些优点? (3)redis分布式锁有哪些缺点? (4)redis实现分布式锁有没有现成的轮子可以使用? 简介 Redis(全称:R ...

  5. Redis全方位详解--数据类型使用场景和redis分布式锁的正确姿势

    一.Redis数据类型 1.string string是Redis的最基本数据类型,一个key对应一个value,每个value最大可存储512M.string一半用来存图片或者序列化的数据. 2.h ...

  6. Redis基础知识之—— 缓存应用场景

    转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端- ...

  7. redis咋么实现分布式锁,redis分布式锁的实现方式,redis做分布式锁 积极正义的少年

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  8. redis分布式锁的几种实现方式,以及Redisson的配置和使用

    最近在开发中涉及到了多个客户端的对redis的某个key同时进行增删的问题.这里就会涉及一个问题:锁 先举例在分布式系统中不加锁会出现问题: redis中存放了某个用户的账户余额 ,例如100 (用户 ...

  9. Redis分布式锁的正确实现方式

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  10. Redis分布式锁---完美实现

    这几天在做项目缓存时候,因为是分布式的所以需要加锁,就用到了Redis锁,正好从网上发现两篇非常棒的文章,来和大家分享一下. 第一篇是简单完美的实现,第二篇是用到的Redisson. Redis分布式 ...

随机推荐

  1. 强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解

    强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C.与生成对抗网络的联系等详解 1.核心词汇 优势演员-评论员(a ...

  2. 在K8S中,PV和PVC是如何关联?

    在Kubernetes(简称K8s)中,PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 是实现存储持久化的关键组件.它们之间的关联是用来动态或静 ...

  3. a标签download属性跨域问题

    1.如果是加载了非同源的内容,该属性将失效,等于导航功能 2.在服务端设置Content-Disposition,使用HTTP响应头Content-disposition进行处理 3.先下载数据文件, ...

  4. 遥感图像处理笔记之【Сrор field boundary detection: approaches and main challenges】

    遥感图像处理学习(6) 前言 遥感系列第6篇.遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月16日 2024年1月24日搬运至本人博客园平台 文章标题:Сrор field b ...

  5. Mygin中间件优化及日志中间件

    本篇是mygin的第七篇,参照gin框架,感兴趣的可以从 Mygin第一篇 开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现. 目的 中间件Middleware优化 ...

  6. 数据共享Manager(Python)

    from multiprocessing import Process,Manager,Lock def change_dic(dic,lock): with lock: dic['count'] - ...

  7. Odoo16—即时通信模块discuss

    odoo中自带的discuss模块是一个简易版的即时通信系统,虽然简单,但是功能还是挺强劲的.可以发送图文消息,可以语音,可以视频,也可以共享屏幕,看下效果吧! PC端效果 手机端效果 重点说明 没错 ...

  8. 【阅读笔记】对比度增强-《Efficientcontrast enhancement using adaptive gamma correction with weighting distribution 》 date: 2023-12-08 10:08:00

    2013年发表在TIP上的对比度增强算法AGCWD(Efficient contrast enhancement using adaptive gamma correction with weight ...

  9. 零基础入门学习Java课堂笔记 ——day02

    流程控制 1.Scanner对象 来源:java.util.Scanner 我们可以通过Scanner类来获取用户的输入输出 用户交互Scanner 通过new关键词创建Scanner对象 Scann ...

  10. 小知识:OGG的TRANLOGOPTIONS MINEFROMACTIVEDG参数

    最近客户有一个需求,OGG源端需要配置在ADG环境,按历史配置规范,开启抽取进程报错: 2020-08-26 18:02:27 ERROR OGG-00060 Extract requires a v ...