解决数据一致性方案(库存问题) 落日映苍穹つ 2022-12-28 09:22 172阅读 0赞 # 解决数据一致性方案 # 本文只讲述原理,均为伪代码,具体实现还得小伙伴实现。 ## Redis ## #### Redis中第一种库存存储方式 #### 1. hset(key,value,goods) == set(key,goods) 2. 秒杀业务下单 代码: //查询商品 goods = redis.get(key); //判断库存 if (goods.getStockCount <= 0) { //已售馨 } else { //减redis库存 //下单业务 } 问题: 在第一步执行,如果有多个线程一起进来,都会拿到相同数量库存,会出现超卖现象。 #### Redis中第二种方式 #### 1. hset(key,value,goods) == set(key,goods) 2. 库存:hset(key, value, stockCount) //减库存 Long result = redis.increment(key, value, -1); if (result <= 0) { //已售馨 } //下单业务 #### Redis中第三种方式 #### 1. hset(key,value,goods) == set(key,goods) 2. lpush(key, ltemid) //使用队列存储商品id ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNzM5Nzk1ODY_size_16_color_FFFFFF_t_70] ## 队列 ## 扣减缓存库存时候,发送消息通知数据库库存也进行扣减,从而到达缓存数据和数据库数据一致性。 //从redis扣减库存 Long increment = redisTemplate.opsForValue().increment(商品id, -1); //判断扣减库存是否成功 if (increment > 0) { //发送下单信息 boolean res = mq.send(商品id); if (!res) { //消息发送失败,库存回滚 redisTemplate.opsForValue().increment(商品id, 1); } } else if (increment == 0) { //商品已售馨 } else { //扣减库存失败,库存回滚 redisTemplate.opsForValue().increment(商品id, 1); } //下单业务 问题: 1. 异步消息发送失败——已解决(上述代码) 2. 扣减操作失败——已解决(上述代码) 3. 下单失败(数据无法正确回滚)发送事务型消息(半消息,提交) #### 事务消息 #### 如果下单业务处理失败,那么数据库库存已经扣减,需要回滚消息。 Long increment = redisTemplate.opsForValue().increment(商品id, -1); //判断扣减库存是否成功 if (increment > 0) { //库存扣减成功 } else if (increment == 0) { //商品已售馨 } else { //扣减库存失败,库存回滚 redisTemplate.opsForValue().increment(商品id, 1); } //下单业务 //发送事务消息,没有发送成功抛异常回滚事务 boolean res = Mq.sendTransaction(消息); if (!res) { new RunnTimeException(“下单失败”); } [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNzM5Nzk1ODY_size_16_color_FFFFFF_t_70]: /images/20221120/02a16c5daa584ac5922dad7cce71872e.png
相关 数据同步问题:Java应用间数据一致性解决方案 在Java应用间实现数据一致性,可以采取以下几种方案: 1. **数据库级同步**: - 使用事务来确保对数据库的一致性操作。 - 可以使用数据库的级联更新(如M 梦里梦外;/ 2024年09月10日 03:42/ 0 赞/ 15 阅读
相关 java缓存一致性问题及解决方案 java缓存一致性问题及解决方案:使用缓存,肯定会存在一致性问题; 读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容 易出现缓存(Redis)和数 绝地灬酷狼/ 2023年01月07日 12:22/ 0 赞/ 122 阅读
相关 解决数据一致性方案(库存问题) 解决数据一致性方案 本文只讲述原理,均为伪代码,具体实现还得小伙伴实现。 Redis Redis中第一种库存存储方式 1. hset(key,value, 落日映苍穹つ/ 2022年12月28日 09:22/ 0 赞/ 173 阅读
相关 java缓存一致性问题及解决方案 java缓存一致性问题及解决方案:使用缓存,肯定会存在一致性问题; 读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容 易出现缓存(Redis)和数 女爷i/ 2022年11月19日 11:12/ 0 赞/ 291 阅读
相关 对于缓存数据一致性的解决方案 1:操作缓存时,先写数据库,再写缓存。 ![20210223163501386.png][] 2:对于缓存的并发性问题 ![watermark_type_ZmFu 小咪咪/ 2022年11月01日 01:35/ 0 赞/ 126 阅读
相关 分布式系统数据一致性的解决方案 转载的链接,可以查看 第一:[https://mp.weixin.qq.com/s?\_\_biz=MzAwMDU1MTE1OQ==&mid=2653546976&idx=1 深藏阁楼爱情的钟/ 2022年09月23日 03:53/ 0 赞/ 181 阅读
相关 DMA导致的CACHE一致性问题解决方案 先简单说一下DMA的CACHE一致性是个啥问题。 复制: CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中(hit)”,此时CPU直接从C 怼烎@/ 2022年05月16日 13:55/ 0 赞/ 208 阅读
相关 Redis和DB数据一致性解决方案 问题出现原因 并发时候无法保证读写的先后顺序,如果删掉了缓存还没来得及写库,另外一个县城就多来读取,发现缓存为空就去读取数据库并且写入缓存,这时候缓存中就是脏数据 ゝ一纸荒年。/ 2022年01月07日 05:29/ 0 赞/ 273 阅读
相关 RabbitMQ数据同步一致性解决方案 1.概述 我们知道在使用RabbitMQ时,生产者将消息发布出去之后,消息是否顺利到达broker代理服务器呢?默认情况下发布操作没有任何信息返回给生产者,也就是生产者是不知 小咪咪/ 2022年01月06日 03:51/ 0 赞/ 349 阅读
还没有评论,来说两句吧...