【并发】详解redis的incr、decr命令
创始人
2025-06-01 16:17:53
0

一、前言

redis是一个单线程的服务,那么所有的命令肯定会排队被redis执行,redis提供的命令都是原子性的,百度搜索incr\decr就是说将对应的key+1,key-1的值重新set到redis中,而且很多都是认为incr\decr原子性的,那么现在就有一个问题,如果redis的key:a, value:100,那么100个线程并发执行decr操作,那么对应的key的value是不是应该为0?

按照百度的说法,应该是。-1、-1、-1、-1进行排队等待redis执行,那么总有100的-1,那么value也是100,那么值肯定也是减去100了,最后的值是0?

这样的话,是不是incr\decr可以做秒杀业务,不需要采用锁机制呢?

我们动手试试了下

package redisStockNumber;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** @author : fangcong* @date : 2023/3/22 15:22* @description : 类作用**/
public class RedisUtils {private static JedisPool jedisPool;static {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(20000);jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1", 6379);jedisPool.getResource().set("testNumber", ""+2024);}public static void main(String[] args) {int number = 2024;for(int i = 0; i < number ; i++){Thread thread= new Thread(() -> {Jedis currentJedis = jedisPool.getResource();currentJedis.decrBy("testNumber", 1);});thread.start();}Jedis jedis = jedisPool.getResource();String testNumber = jedis.get("testNumber");System.out.println(testNumber);}}

对应pom

     redis.clientsjedis3.6.0

引入一个jedis客户端来操作redis ,我们需要注意这里的jedis是一个非线程安全的类,因此可以使用jedispool对象来获得不同的线程客户端来模拟多个客户端。

在这里插入图片描述

我们得到的结果是411,这就说明了incr\decr并不是我们上述说的那种原理,在多个客户端并发下是线程不安全的。

二、官方介绍

在这里插入图片描述
但是从官方介绍上其实也不太清楚该内存含义,如果按照官方介绍,我还是以为incr是 +1 、 +1 、+1进行执行。

三、猜想

因为写了一个测试文件,验证了incr并不是+1、+1这样的实现的,因此猜测
在使用 DECRBY 命令减少库存时,每个命令执行时会读取当前键的值,然后对这个值进行减少操作,最后将减少后的结果保存回 Redis 中。如果有多个客户端同时执行 DECRBY 命令,那么 Redis 会按照客户端发送命令的顺序执行这些命令,并且在执行命令时会保证读取到的值是最新的,从而确保每个客户端都在最新的库存量上进行减少操作。

也就是incr会。 读值+1 、 读值+1 ,然后redis会将读值+1这个结果重新执行一个类型set命令将对应的key的value覆盖成最新的。

因此在多线程下 可以存在多个客户端读的值会相同,而不是读的是最新的值。

四、总结

如果有人明确incr \decr底层是怎么样的一个实现逻辑请留言,麻烦谢谢了

相关内容

热门资讯

文言《越州赵公救灾记》阅读练... 文言《越州赵公救灾记》阅读练习(附答案)  越州赵公救灾记  熙宁八年夏,吴越大旱。九月,资政殿大学...
文言文阅读专项训练习题及答案 文言文阅读专项训练习题及答案  元行钦,幽州人。庄宗与梁军战,军败而溃,梁兵数百追及,攒槊围之。行钦...
《诗经》爱情解读:汉广-拒绝... 《诗经》爱情解读:汉广-拒绝泅渡的爱情  《国风·周南·汉广》是先秦现实主义诗集《诗经》中《国风·周...
端午节粽子祝福语 端午节粽子祝福语  粽子包着枣,祝你健康永不老;粽子夹着肉,愿你爱情长又久;粽子沾点糖,望你快乐幸福...
《新唐书姚南仲传》原文及注释 《新唐书姚南仲传》原文及注释  【原文】  姚南仲,华州下邽人。乾元初,擢制科①,授太子校书。迁累右...
迂公修屋文言文翻译 迂公修屋文言文翻译  迂公修屋记叙了个性吝啬的迂公篱笆破了也不修理,屋顶上的瓦片破了也不修理,修了还...
孔子《论语》全文及译文 孔子《论语》全文及译文  导语:《论语》主要记录孔子及其弟子的言行,较为集中地反映了孔子的思想,由孔...
红楼梦中薛宝钗的性格特点剖析 关于红楼梦中薛宝钗的性格特点剖析  《红楼梦》,中国古代章回体长篇小说,中国古典四大名著之一,通行本...
题燕太子丹传后原文及赏析 题燕太子丹传后原文及赏析  题燕太子丹传后  李翱〔唐代〕  荆轲感燕丹之义,函匕首入秦,劫始皇,将...
精彩名著段落摘抄 精彩名著段落摘抄  名著是指具有较高艺术价值与知名度,且包含永恒主题与经典的人物形象,能够经过时间考...
楚辞《哀时命》的原文及译文 楚辞《哀时命》的原文及译文  原文:  哀时命之不及古人兮,夫何予生之不遘时!  往者不可扳援兮,徠...
文言文《左传桓公桓公九年》原... 文言文《左传桓公桓公九年》原文及翻译  原文:  【经】九年春,纪季姜归于京师。夏四月,秋七月。冬,...
《岳阳楼记》中的通假字、一词... 《岳阳楼记》中的通假字、一词多义、古今异义、及鉴赏  《岳阳楼记》是北宋文学家范仲淹应好友巴陵郡太守...
三字经全文童声朗读 三字经全文童声朗读  导语:人生下来的时候都是好的,只是由于成长过程中,后天的学习环境不一样,性情也...
铜奔马正名阅读理解附答案 铜奔马正名阅读理解附答案  铜奔马正名  作为中国旅游标志的东汉铜奔马是1969年在甘肃武威出土的,...
三字经:汤伐夏,国号商,六百... 三字经:汤伐夏,国号商,六百载,至纣亡。  商汤姓子,名汤,又名履、天乙等,史称“汤有七名”。商族活...
《题破山寺后禅院》阅读答案及... 《题破山寺后禅院》阅读答案及翻译赏析  题破山寺后禅院  常建  清晨入古寺,初日照高林。  竹径通...
但称“甘如饴” 勿谓是《诗经... 但称“甘如饴” 勿谓是《诗经》  “谁谓荼苦,其甘如饴”。这句话是不是诗经里的名句呢,下面一起来看看...
大同文言文翻译赏析 大同文言文翻译赏析  《大同》文中"大道"就是指治理社会的最高准则,其治理的效果就是国泰民安的理想状...
红楼梦中王熙凤的诗词 红楼梦中王熙凤的诗词  红楼梦中王熙凤的诗词  凡鸟偏从末世来,都知爱慕此生才。  一从二令三人木,...