Redis高并发的问题

Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:

高并发架构系列:Redis缓存和MySQL数据一致性方案详解

如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

以及今天要谈到的Redis并发竞争问题,这里的并发指的是多个redis的client同时set key引起的并发问题。

比如:多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4,但是由于并发设置的原因,最后顺序变成了4,3,2,最后变成的key值成了2。

如何解决Redis的并发竞争key问题

第一种方案:分布式锁

1.整体技术方案

这种情况,主要是准备一个分布式锁,大家去抢锁,抢到锁就做set操作。

2.为什么是分布式锁

因为传统的加锁的做法(如java的synchronized和Lock)这里没用,只适合单点。因为这是分布式环境,需要的是分布式锁。

当然,分布式锁可以基于很多种方式实现,比如zookeeper、redis等,不管哪种方式实现,基本原理是不变的:用一个状态值表示锁,对锁的占用和释放通过状态值来标识。

3.分布式锁的要求

  • 互斥性:在任意一个时刻,只有一个客户端持有锁。
  • 无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。
  • 容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁

4.分布式锁的实现方式

  • 数据库
  • Memcached(add命令)
  • Redis(setnx命令)
  • Zookeeper(临时节点)

具体的分布式锁实现,请参考:阿里P8架构师谈:分布式锁的3种实现(数据库、缓存、Zookeeper)

第二种方案:利用消息队列

在并发量过大的情况下,可以通过消息中间件进行处理,把并行读写进行串行化。

把Redis.set操作放在队列中使其串行化,必须的一个一个执行。

这种方式在一些高并发的场景中算是一种通用的解决方案。

你可能也喜欢:

  1. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别
  2. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解
  3. Redis系列教程(一):Redis缓存的设计、性能、应用与数据集群同步
  4. Redis系列教程(二):详解Redis的存储类型、集群架构、以及应用场景
  5. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
  6. Redis系列教程(八):分布式锁的由来、及Redis分布式锁的实现详解

Redis系列教程(七):Redis并发竞争key的解决方案详解相关推荐

  1. Redis并发竞争key的解决方案详解

    1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争. 这里的并发 ...

  2. 【Redis系列】缓存击穿、穿透、雪崩解决方案详解

    文章目录 前言 一.击穿 1.介绍 2.产生原因 3.解决方案 二.穿透 1.介绍 2.产生原因 3.解决方案 三.雪崩 1.介绍 2.产生原因 3.解决方案 结尾 前言 众所周知,计算机的瓶颈之一就 ...

  3. linux中的shell有printf吗,Linux Shell系列教程之(八)Shell printf命令详解

    在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell printf命令有了一个简略的介绍,本篇给大家详细介绍下Shell中的printf命令. 一.Shell p ...

  4. linux打印机添加命令,Linux Shell脚本系列教程(二):终端打印命令详解

    终端打印 终端是交互式工具,用户可以通过它与shell环境进行交互.在终端中打印文本是大多数shell脚本和工具日常需要执行的基本任务.通过终端打印,人们可以知道系统的运行状态,这对用户来说是至关重要 ...

  5. 【Java基础系列教程】第十五章 Java 正则表达式详解

    一.正则表达式概述 什么是正则表达式 正则表达式:用于匹配规律规则的表达式,正则表达式最初是科学家对人类神经系统的工作原理的早期研究,现在在编程语言中有广泛的应用.正则表达式通常被用来检索.替换那些符 ...

  6. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  7. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  8. Redis系列教程(二):详解Redis的存储类型、集群架构、以及应用场景

    高并发架构系列 高并发架构系列:数据库主从同步的3种一致性方案实现,及优劣比较 高并发架构系列:Spring Cloud的核心成员.以及架构实现详细介绍 高并发架构系列:服务注册与发现的实现原理.及实 ...

  9. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解

    Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...

最新文章

  1. Java 三位正整数的个十百位数字的立方和
  2. Redis-18Redis主从同步
  3. Deploy One Project on Heroku (Week IV)
  4. 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件(转)
  5. Java类加载机制深度分析
  6. 蔚来Q3营收近百亿、毛利率20.3%,预计明年下半年推出2款新车
  7. 「镁客·请讲」HelloEOS梓岑:嘻哈外表下的区块链式达尔文主义
  8. Adobe PDF虚拟打印机 如何添加
  9. Oracle 购买价格 和 服务费 计算方式
  10. 华为模拟器eNSP免费下载
  11. win10计算机恢复到一天前,win10怎么系统还原到某一时刻 win10系统还原之后会怎么样...
  12. ip地址计算器php源码,php版 子网掩码计算器
  13. Spring Data Neo4j解除两个节点之间的关系
  14. 用PHP制作简单的登录页面
  15. RNAmmer:预测基因组上的核糖体RNA
  16. PMP考试六大管理学定律
  17. 利用python发邮件
  18. html创建盒子,HTML 盒子
  19. Cast-Designer 助力蔚来汽车,共同打造更美好未来
  20. vue前端UI框架整理

热门文章

  1. 如何:通过现有代码创建 C++ 项目
  2. 判断一个单链表中是否存在环
  3. JavaScript——使用对话框
  4. cloudstack java api_CloudStack API编程指引
  5. vk_down 每次下翻丙行 c++_笔记本接口不够用?不妨试试这款Type-C拓展坞,给你7个接口用...
  6. python 播放声音_如何用Python播放声音?
  7. ValueError: Found array with dim 4. Estimator expected和ValueError: Expected 2D array, got 1D array i
  8. LeetCode 1955. 统计特殊子序列的数目
  9. LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)
  10. LeetCode 281. 锯齿迭代器(map+vector)