一、问题由来

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

有一个用户能够操作。刚开始做的时候,自己的做法是在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. 19.4 Boost Asio 远程命令执行

    命令执行机制的实现与原生套接字通信一致,仅仅只是在调用时采用了Boost通用接口,在服务端中我们通过封装实现一个run_command函数,该函数用于发送一个字符串命令,并循环等待接收客户端返回的字符 ...

  2. C/C++ 实现URL路径拆分

    URL路径拆分: 例如我们传入 http://www.baidu.com/index.php 拆分为 www.baidu.com 和 /index.php #include <Windows.h ...

  3. CE修改器入门:寻找指针基址

    上一步阐述了如何使用代码替换功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,所以我们需要学习如何利用指针,在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个不 ...

  4. 遥感图像处理笔记之【Multi-label Land Cover Classification with Deep Learning】

    遥感图像处理学习(3) 前言 遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月14日 2024年1月24日搬运至本人博客园平台 文章标题:Multi-label Land Cov ...

  5. Python下的三维建模和可视化

    本文介绍基于AnyCAD Rapid Py三维图形平台开发Python的三维应用 1 准备工作 1.1 安装 vc_resit 2022 在Windows下,AnyCAD Rapid SDK依赖Vis ...

  6. PHP 编程技巧与优化

    PHP 编程技巧与优化 1. 尽量采用大量的PHP内置函数. 2. 使用echo代替print,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接 3. 用单引号代替双引号来包含字符 ...

  7. Liunx知识点整理

    Linux知识点整理 目录和文件 ls (list)显示当前目录下的文件或目录 a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) l 除文件 ...

  8. 洛谷P2415 集合求和(数学问题,使用集合子集求和公式)

    可以知道对于一个有n个数据的集合,其子集个数有2^n个 至于证明可以这样理解,对于n个数据,其子集就是对数据进行组和,而对于每个位置上的数据,组合时仅有两种状态即有此数据或无此数据,也就是有两种可能, ...

  9. 数学问题,2的n次方 - 1 是怎么来的? 通常用作计算数值

  10. Python-统计执行时间

    方法一:datetime.datetime.now() import datetime import time starttime = datetime.datetime.now() print(st ...