利用Redis设计常用系统(分布式锁)

SpringBoot使用Redis实现分布式锁 一、Redis分布式锁概念篇 建议直接采用Redis的官方推荐的Redisson作为redis的分布式锁 1.1、为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间! 后来业务发展,需要做集群,一个应用... 阅读详情

Redis因为其丰富的数据结构,在高并发场景下经常作为缓存使用。
在高并发流量下,我们要在业务层解决流量截断工作,让更少的请求到达redis缓存这一层。主要做法是:
比如redis中有n个资源待抢,部署了m台业务服务器,每台业务服务进程内部会有一个计数器,初始值为n,用户每发送一个请求,计数器减1,如果计数器值>0,则继续访问redis抢占资源(一般用decr命令);如果计数器值<=0,则不会再访问redis,直接返回抢占失败。这样到达redis的请求数目只剩下n*m个,极大地减少了redis的压力。

一. 发红包

用redis队列。
用户发红包时,输入金额m和红包个数n。后台程序接收到这两个参数后,将m分成随机的n份,将这n个数写入到redis队列中。
用户抢红包时,访问redis队列,每抢一个就lpop出一个金额,直到队列为空。
为了减少redis的压力,用上面的方法做流量截断工作。

二. 商品秒杀系统

用redis的DECR命令。
Redis Decr 命令将 key 中储存的数字值减一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
在这里插入图片描述
思路:

  1. 商品信息在秒杀活动开启之前, 将其从关系型数据库(比如mysql)里加载到redis里面去。用set key counter命令对应商品的秒杀总数。
  2. 活动开始后, 秒杀系统只需要调用DECR 商品id命令, 返回的数据就是数字减一之后的值, 如果大于等于0, 就代表抢到了一件商品, 将该商品加入购物车即可(加入购物车调用现有的接口即可), 如果小于0, 则代表商品都抢完了, 则秒杀失败, 前端做相应的展示提示。

这只是最基本的设计思路,由于秒杀请求量会特别大,所以对于超过秒杀数的请求,我们可以直接返回,没有必要再进行redis操作。
比如某商品10件物品待秒,假设有10台业务服务器,接收到秒杀请求后,每台业务服务器在进程内部保存一个计数器,设置初始值=待秒商品总数,每来一个请求,减一次计数器,计数器>0的,继续访问redis,计数器<=0的,直接返回秒杀结束页面,这样经过第一步的处理只剩下10台*10个=1000个请求。

三. 积分排行榜

Redis 提供了 sorted set 有序集合数据结构,高效的插入和删除性能,适用于需实时排序的场景。
比如我们要做一个积分排名系统,积分可以奖励(增加积分),也可以惩罚(扣除积分)。

  1. 用zadd命令新增玩家
127.0.0.1:6379> zadd game 0 user1
(integer) 1

表示,排行榜名称为game,玩家user1赋予初始积分为0。
2. 用zincrby命令增减玩家分数

127.0.0.1:6379> ZINCRBY game 3 user1
"3"
127.0.0.1:6379> ZINCRBY game -2 user2
"8"
  1. zscore命令查看玩家分数
127.0.0.1:6379> zscore game user2
"8"
127.0.0.1:6379> zscore game user1
"3"
  1. zrevrange命令查看排行榜
    由于排行榜一般是按照分数由高到低排序的,所以我们使用zrevrange,而命令zrange是按照分数由低到高排序。
    起始位置和结束位置都是以0开始的索引,且都包含在内。如果结束位置为-1则查看范围为整个排行榜。
    带上withscores则会返回玩家分数。
127.0.0.1:6379> zrevrange game 0 -1 withscores
1) "user2"
2) "8"
3) "user1"
4) "3"
  1. zrem移除某个玩家
127.0.0.1:6379> zrem game user2
(integer) 1
  1. 删除排行榜
del game

四. 分布式锁

分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。

由此可见分布式锁的目的其实很简单,就是为了保证多台服务器在执行某一段代码时保证只有一台服务器执行。

为了保证分布式锁的可用性,至少要确保锁的实现要同时满足以下几点:
(1) 互斥性。在任何时刻,保证只有一个客户端持有锁。
(2) 不能出现死锁。如果在一个客户端持有锁的期间,这个客户端崩溃了,也要保证后续的其他客户端可以上锁。
(3) 保证上锁和解锁都是同一个客户端。

Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则 SET)的简写。

127.0.0.1:6379> setnx lock value1 #在键lock不存在的情况下,将键key的值设置为value1
(integer) 1
127.0.0.1:6379> setnx lock value2 #试图覆盖lock的值,返回0表示失败
(integer) 0
127.0.0.1:6379> get lock #获取lock的值,验证没有被覆盖
"value1"
127.0.0.1:6379> del lock #删除lock的值,删除成功
(integer) 1
127.0.0.1:6379> setnx lock value2 #再使用setnx命令设置,返回0表示成功
(integer) 1
127.0.0.1:6379> get lock #获取lock的值,验证设置成功
"value2"

上面这几个命令就是最基本的用来完成分布式锁的命令。
加锁:使用setnx key value命令,如果key不存在,设置value(加锁成功)。如果已经存在lock(也就是有客户端持有锁了),则设置失败(加锁失败)。
解锁:使用del命令,通过删除键值释放锁。释放锁之后,其他客户端可以通过setnx命令进行加锁。

【Redis】之分布式锁 1、Redis 的并发竞争 Key 问题 所谓 Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同! 推荐一种方案:分布式锁(zookeeper 和 redis 都可以实现分布式锁)。(如果不存在 Redis 的并发竞争 Key 问题,不要使用分布式锁,这样会影响性能) 基于 zookeeper 临时有序节点可以实现的分布式锁。大致思想为:每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节 阅读详情

相关推荐

设计一个Redis分布式锁需要考虑哪些问题

设计一个Redis 分布式锁锁的唯一性:确保锁在分布式环境中是全局唯一的。原子性操作:确保加锁和解锁的操作原子性。锁的过期时间:避免死锁的发生。锁的释放:只有锁的持有者才能释放锁。可重入性:可以考虑是否支持重入锁。公平性:是否需要实现公平锁。锁的超时控制和重试机制:合理的超时和重试机制,避免系统资源浪费。容错和网络分区:应考虑网络故障和 Redis 集群的影响。通过使用 Redis 的基本命令(如SETNX。

longgelaile的博客 721

分布式锁之redis实现方案

什么是分布式锁?分布式锁的redis实现方案

m0_47743175的博客 959

ICESat-2数据下载的两种方法

ICESat-2数据下载

weixin_46341898的博客 2899

Redis学习(三)之 分布式锁详解

zookeeper也是一种k-v形式的存储中间件,它内部结构是树形的,zk集群中主节点叫做leader,从节点叫做follower,使用zk就能解决主从同步引起的分布式锁失效问题,这是因为zk保证的是一致性,leader收到请求后会同步数据给follower,收到半数上的follower ack之后leader才会给线程返回ack,即使这个时候leader挂了,已经同步到数据的follower由于数据最新必然会被选为新的leader,因此zk不存在集群分布式锁失效问题。

royal1235的博客 3611

AD5940阻抗测量开发板实战:从源码获取到工程调试全解析

本文详细解析了AD5940阻抗测量开发板的实战应用,从源码获取到工程调试的全过程。AD5940作为ADI公司的高精度阻抗测量前端芯片,适用于生物阻抗分析、电化学传感器等领域。文章提供了开发环境搭建、工程配置、常见问题排查及进阶调试技巧,帮助开发者快速掌握AD5940开发板的使用方法。

weixin_30919429的博客 212

一文详解AUTOSAR COM ComSignal结构体

ComSignalLength指定信号的长度,以字节为单位,影响数据的解析范围和精度。比如车速信号若为UINT16类型,ComSignalLength=16。这里需要注意必须ComSignalLength与ComSignalType匹配(比如FLOAT32类型需配置ComSignalLength=32),超出实际物理值范围时需配置缩放(Scaling)参数。ComSignalType定义信号的物理数据类型,决定如何解析原始字节数据。

menghuyouyou的博客 942

基于Redis的分布式锁 以及 超详细的改进思路

什么是分布式锁满足分布式系统或集群模式下多进程可见并且互斥的锁获取锁互斥:确保只能有一个线程获取锁,可以利用的互斥特性非阻塞:尝试一次,成功返回true,失败返回false释放锁手动释放,超时释放:获取锁时添加一个超时时间,避免服务宕机引起的死锁,组合 实现思路 改进思路 存在的问题 存在一种情况,按照以下顺序执行:示意图:这个问题,实际上就是释放了不是自己产生的锁,故我们可以通过特定的标识,在释放锁之前判断锁是否是由自己产生的,且只释放自己产生的锁。可以将线程id存入value,在释放之前判断锁的val

阿杆的博客 814

基于的公司考勤系统(程序+开题报告)(开题报告+源码)

我们将研究和设计系统的架构和功能模块,包括员工信息管理模块、部门信息管理模块、考勤信息记录模块、工资信息计算模块、请假信息处理模块、奖惩信息管理模块、公告信息发布模块、上班打卡模块以及加班申请模块等。目的: 本项目旨在设计并实现一个基于的公司考勤系统,通过该系统,可以实现对员工、部门信息、考勤信息、工资信息、请假信息、奖惩信息、公告信息、上班打卡、加班申请等功能的统一管理。基于的公司考勤系统的设计与实现,旨在通过自动化技术提高考勤管理的效率和准确性,为企业管理提供有力的数据支持。最终成品以下面运行环境。

迟限程序设计 997

Redis-分布式锁

为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。1、处理效率提升:应用分布式锁,可以减少重复任务的执行

weixin_44044929的博客 271

Kali Linux下John the Ripper实战:从识别yescrypt哈希到破解zip压缩包(保姆级避坑指南)

本文详细介绍了在Kali Linux中使用John the Ripper工具从识别yescrypt哈希到破解zip压缩包的全过程。针对常见的'No password hashes loaded'报错,提供了两种解决方案,并扩展讲解了哈希识别、zip文件破解及性能优化技巧,是安全测试人员的实用指南。

weixin_29323365的博客 236

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1878

(四)分布式锁解决方案-Redis实现方式(Jedis实现)

基于Redis的分布式锁 使用常用命令 SETNX SETNX key val当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。 Expire expire key timeout 为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。 Delete delete key 删除key 在使用R...

mtsbv110的专栏 517

全网最强AI辅助课题申报教程!超详细流程拆解,助你快速提高课题申报成功率(附各部分高效提示词)

实验法要详细说明自变量、因变量、实验类型、实验过程、实验步骤、测量工具名称、被试取样方式、无关变量控制方法。这个部分就是让评审专家相信我们有能力把这个项目干成,写的时候要重点突出两块内容:第一是研究基础,包括你或团队在相关领域已有的研究成果,比如发表的论文、承担过的课题、获得过的奖励、相关研究经验等,要具体、有说服力;课题申报专门给我们留了一小节用来突出课题的创新之处,不管是研究角度、研究对象、研究方法,还是应用价值都可以提炼作为我们的创新点,最后的语气成果也要明确具体,且要和课题内容紧密相关。

智能AI让学术科研更容易 664

Redis实现分布式锁

在多线程并发的情况下,我们可以使用锁来保证一个代码块在同一时间内只能由一个线程访问。比如Java的synchronized关键字和Reentrantlock类等等。 这样子可以保证在同一个JVM进程内的多个线程同步执行。 如果在分布式的集群环境中,如何保证不同节点的线程同步执行呢? 怎么才能在分布式系统中,实现不同线程对代码和资源的同步访问? 对于单进程的并发场景,我们可以使用语言...

forever-and-ever的博客 4万+

120、NPU的Mythic M1076:模拟存算一体NPU

这篇文章分享了作者调试Mythic M1076模拟存算一体NPU的实战经验,主要包含以下要点: 硬件设计陷阱:参考电压输入必须使用低ESR电容,普通贴片电容会导致模拟计算阵列工作异常。 核心技术原理: 采用真正的存算一体架构,将权重存储为模拟电压 使用浮栅晶体管存储权重,通过电流叠加实现乘法运算 包含108个计算单元阵列(Tile),每个256×256规模 使用注意事项: 编程模型特殊,需要依赖SDK自动映射网络层 存在6-8位有效精度限制,需用量化感知训练 功耗特性独特,静态偏置电流占主要功耗 调试手段有

m0_50546716的博客 122

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis的分布式锁分析

开发同学都知道,在分布式系统中,为了保证多个机器并发操作的数据一致性,常常需要使用分布式锁机制。常用的比如数据库锁,ZK锁,Reis锁等等,今天我们就探讨下Redis分布式锁,说说他的实现原理和应用场景,并介绍如何正确使用分布式锁来解决并发问题

战斧的博客 7253

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Redis 实现分布式锁

本文主要介绍了Redis的分布式锁。涉及Reids的原子操作,分布式锁,Redis的事务,以及用Go语言实现通过Lua脚本来扣减库存。

tatasix的博客 1817

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot之使用Redis实现分布式锁(秒杀系统)

一、Redis分布式锁概念篇 1.1、为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间! ...

一叶知秋hwb的博客 2万+

如何利用Redis实现一个分布式锁?

Redis分布式锁的核心实现基于SET key value NX PX milliseconds命令的原子性操作,通过NX保证互斥性,PX设置过期时间防止死锁。基础版本使用Lua脚本确保解锁的原子性,但存在锁超时问题。生产环境推荐Redlock算法,在多个独立Redis节点上获取多数派锁以提高可靠性。关键设计包括:使用唯一值避免误删、合理设置过期时间、确保操作原子性。相比ZooKeeper,Redis锁性能更高但一致性稍弱,实际项目中推荐使用Redisson等成熟客户端库。

2301_80096362的博客 885

lua+redis:分布式锁解决方案分享

分布式锁的是确保在多个进程或多个节点之间对共享资源的访问是有序、互斥和原子的,以避免竞态条件和数据不一致性问题。在多进程或多节点环境中,分布式锁广泛应用于协调共享资源的安全访问。

yangyufneg的博客 3551

Redis分布式锁原理(一)——redis分布式锁需要注意的问题

1、什么场景会用到分布式锁(用本地锁举例,分布式场景在并发情况下存在的问题) 2、redis为什么可以实现分布式锁 3、假设一分布式场景,运用redis分布式锁并剖析各种坑 结合视频157、158

齐天小圣^O^ 的博客 2901

Redis分布式锁原理与实现

在分布式系统中,数据的一致性和并发控制是至关重要的。随着微服务架构的普及,多个服务实例可能同时访问同一份数据,这就需要一种机制来确保数据的一致性和避免并发冲突。Redis分布式锁正是为了解决这一问题而诞生的。想象一个在线支付系统,当用户发起支付请求时,系统需要确保同一时间只有一个服务实例处理这笔交易,以防止重复扣款或数据不一致。这种情况下,分布式锁就扮演了至关重要的角色。Redis分布式锁是一种基于Redis的锁机制,它利用Redis的原子操作来保证锁的互斥性和可见性。

我是Java程序员廖志伟,感谢朋友们的支持! 2145

什么是分布式锁?Redis的分布式锁又是什么?

分布式锁是一种用于解决分布式系统中多节点对共享资源并发访问问题的机制。在分布式系统中,多个服务器实例或服务进程可能同时操作某个共享资源(如数据库记录、缓存条目、文件等),导致数据不一致或竞争条件。分布式锁可以确保同一时刻只有一个节点可以访问或修改该资源,避免并发问题。

Stringzhua的博客 2409

Redis分布式锁详解

一、分布式简介 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面;就比如: 本来一个程序员可以完成一个项目:需求->设计->编码->测试 但是项目多的时候,一个人也扛不住,这就需要不同的人进行分工合作了 这就是一个简单的分布式协同工作了; 二、分布式锁 首先看一个问题,如果说某个环节被终止或者别侵占,就会发生不可知的事情 这就会出现,设计好的或者设计的半成品会被破坏,导致后面环节出错; 这时候,我们就需要引入分布式锁的概念; 何为分布式锁?

Apollo的博客 1万+

Redis分布式锁解决幂等问题

本文介绍了分布式锁,分布式锁的实现方式以及基于Redis如何来实现分布式锁。

技术杠精的博客 2488
上一篇: Redis主从同步原理
下一篇: 消息队列实现原理(以kafka为例)
okiwilldoit
博客等级 码龄17年 86粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值