Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 582|回复: 0

高并发架构系列:Redis并发竞争key的解决方案详解

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-7 09:40:22 | 显示全部楼层 |阅读模式

    https://blog.csdn.net/ChenRui_yz/article/details/85096418

    https://blog.csdn.net/ChenRui_yz/article/list/2?          -good blog

    需求由来

    1.Redis高并发的问题

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

    这里的并发指的是多个redis的client同时set key引起的并发问题。

    2.出现并发设置Key的原因

    Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redis进行并发访问时会出现问题。

    比如:同时有多个子系统去set一个key。这个时候要注意什么呢?

    3.举一个例子

    多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4,但是顺序变成了4,3,2,最后变成了2。
    在这里插入图片描述

    如何解决redis的并发竞争key问题呢?下面给到2个Redis并发竞争的解决方案。

    第一种方案:分布式锁+时间戳

    1.整体技术方案

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

    加锁的目的实际上就是把并行读写改成串行读写的方式,从而来避免资源竞争。

    2.Redis分布式锁的实现

    主要用到的redis函数是setnx()

    用SETNX实现分布式锁

    利用SETNX非常简单地实现分布式锁。例如:某客户端要获得一个名字youzhi的锁,客户端使用下面的命令进行获取:

        SETNX lock.youzhi<current Unix time + lock timeout + 1>

    如返回1,则该客户端获得锁,把lock.youzhi的键值设置为时间值表示该键已被锁定,该客户端最后可以通过DEL lock.foo来释放该锁。
    如返回0,表明该锁已被其他客户端取得,这时我们可以先返回或进行重试等对方完成或等待锁超时。

    3.时间戳

    由于上面举的例子,要求key的操作需要顺序执行,所以需要保存一个时间戳判断set顺序。

        系统A key 1 {ValueA 7:00}

        系统B key 1 { ValueB 7:05}

    假设系统B先抢到锁,将key1设置为{ValueB 7:05}。接下来系统A抢到锁,发现自己的key1的时间戳早于缓存中的时间戳(7:00<7:05),那就不做set操作了。

    4.什么是分布式锁

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

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

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

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

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

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

    以上就是Redis并发竞争key技术方案详解,相关的Redis高并发问题具体还可以参考:高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题

    我是mikechen,每日分享bat架构+面试+技术干货!坚持原创不易,觉得不错点赞支持,送你【分布式架构23期学习资料合集】,加QQ 649449578领取资料、深度交流,验证通关暗号【架构】。
    在这里插入图片描述
    注意|日本旅游攻略,满足你对度假的一切幻想.
    ---------------------  
    作者:mikechen优知  
    来源:CSDN  
    原文:https://blog.csdn.net/ChenRui_yz/article/details/85096418  
    版权声明:本文为博主原创文章,转载请附上博文链接!

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 02:35 , Processed in 0.082856 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表