Redis的中并发问题的解决方案小结

什么是Redis的并发竞争问题

Redis的并发竞争问题,主要是发生在并发写竞争。考虑到redis没有像db中的sql语句,update val = val + 10 where …,无法使用这种方式进行对数据的更新。

假如有某个key(mileage), value(10),现在想把value值进行+10操作。正常逻辑下,就是先把数据key为mileage的值读回来,加上10,再把值给设置回去。

如果只有一个连接的情况下,这种方式没有问题,可以工作得很好,但如果有两个连接时,两个连接同时想对还mileage进行+10操作,就可能会出现问题了。

例如:两个连接同时对mileage进行写操作,同时加10,最终结果我们知道,应该为30才是正确。

考虑到一种情况:

T1时刻,连接1将mileage读出,目标设置的数据为10+10 = 20。

T2时刻,连接2也将数据读出,也是为10,目标设置为20。

T3时刻,连接1将mileage设置为20。

T4时刻,连接2也将mileage设置为20,则最终结果是一个错误值20。

另外假设有个A线程正在写mileage,B线程正在读写mileage,当A,B同时执行的时候也可能发生并发竞争问题:

即B将mileage值读出来的时候,A正好更新了mileage值,然后B又更新回mileage值,此时照成A的更新无效。

解决方案

利用redis自带的incr命令,具体用法看这里http://doc.redisfans.com/string/incr.html。

利用redis的setnx实现内置的锁。

使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高)。如何用乐观锁方式进行解决?本质上是假设不会进行冲突,使用redis的命令watch进行构造条件。伪代码如下:

解释一下:

这个是针对同一个服务的客户端来的,在代码里要对redis操作的时候,针对同一key的资源,就先进行加锁(java里的synchronized或lock)。

可以使用独占锁的方式,类似操作系统的mutex机制。(网上有例子,http://blog.csdn.net/black_ox/article/details/48972085 不过实现相对复杂,成本较高)

Original: https://www.cnblogs.com/lys_013/p/10207609.html
Author: 13
Title: Redis的中并发问题的解决方案小结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594315/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Webpack的使用

    全局安装Webpack(尽量在项目目录中执行cmd命令) npm install -g webpack webpack-cli 在项目目录的js目录中创建几个js文件(之间的关联任…

    Java 2023年6月13日
    081
  • springboot项目运行报错Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean

    Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFacto…

    Java 2023年5月30日
    074
  • 并发编程学习

    Semaphore Semaphore 可以允许多个线程访问一个临界区。 应用:实现线程池 CountDownLatch 应用: 业务原始状态:一个线程执行查询订单,查询派送单,对…

    Java 2023年6月8日
    046
  • 奇怪的知识又增加了,ImageMagick PDF转JPG图片合并的时候报Unsupported Image Type

    之前在PDF转JPG时使用了ImageMagic这个强大的工具,起初使用都没有什么问题,但是突然生产出现部分转换后的图片合并失败的问题 报错信息: javax.imageio.II…

    Java 2023年6月7日
    082
  • Markdown语法

    本地编辑器的选择 1. 推荐文本编辑器:Typora2. Typora编辑器的下载和安装 编辑器下载地址 安装步骤如下: 下载之后,双击打开,一直点击下一步则可安装好。 Markd…

    Java 2023年6月9日
    070
  • Spring Cloud OpenFeign 的基本工作原理

    背景 OpenFeign 是 Spring Cloud 家族的一个成员, 它最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式。 如果说 …

    Java 2023年6月6日
    065
  • MyBatis Generator备份

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/ys-wuhan/p/7126391.htmlAutho…

    Java 2023年5月30日
    047
  • MQ 简介

    You must try things that may not work. And you must not let anyone define your limits beca…

    Java 2023年6月9日
    044
  • 正交编码器

    增量式编码器 增量式编码器也称为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲就对应于一个增量位移,编码器眉庄东固定的位移就会产生一个脉冲信号,通过读取单位时间…

    Java 2023年6月5日
    077
  • Skywalking-05:在Skywalking RocketBot上添加监控图表

    在 Skywalking RocketBot 上添加监控图表 效果图 该图的一些配置信息如下: 标题为: JVM Thread State Count (Java Service)…

    Java 2023年6月5日
    070
  • CentOS7-ElasticSearch的使用

    1.下载 ElasticSearch官方下载地址​www.elastic.co/cn/downloads/past-releases#elasticsearch 最好选择版本7.x…

    Java 2023年6月7日
    068
  • Java 北京时间 转 UTC时间

    ” 北京时间” 转为” UTC时间“,根据需要转换格式不同,实现方式有所不同。 简单整理如下4种格式: 1、UTC格式:2021-1…

    Java 2023年5月29日
    056
  • 安装Linux8.3.2011

    镜像地址:http://mirrors.aliyun.com/centos/8.3.2011/isos/x86_64/ 非DVD镜像安装时的安装源地址:http://mirrors…

    Java 2023年6月6日
    090
  • 群晖MariaDB10 远程连接

    群晖MariaDB10 远程连接 ssh进入群晖 cd /volume2/@appstore/MariaDB10/usr/local/mariadb10/bin 命令进入Maria…

    Java 2023年6月6日
    068
  • SQLyog连接MySQL8.0报2058错误的解决方法

    SQLyog连接MySQL8.0报2058错误的解决方法 原因: MySQL8.0密码的加密方法发生了改变 解决方法: 进入mysql执行以下语句 ALTER USER ‘root…

    Java 2023年6月5日
    063
  • 戏说领域驱动设计(廿七)——Saga设计模式

    上一节我们讲解了常用的事务,也提及了Saga,这是在分布式环境下被经常使用的一种处理复杂业务和分布式事务的设计模式。本章我们的主要目标是编写一个简单版本的Saga处理器,不同于Se…

    Java 2023年6月7日
    065
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球