有柳岩问:高并发库存扣减一致性问题,怎么用 Redis 解决?

开发 架构
之前和大家聊了库存异常的两种情况,有留言说可以用 Redis 优化。Redis方案是可以的,今天简单展开说说。

昨天和大家聊了库存异常的两种情况:

  • “先查后减”,容易出现异常;
  • “先查后设”,幂等性优化,解决重试问题;
  • “先查后设,有条件的设”,CAS优化,解决并发问题;

有留言说:可以用redis优化。redis方案是可以的,今天简单展开说说。

redis一般如何操作库存?

一般在redis客户端执行:

$num = GET key$num = $num - $countSET key $num

这样操作存在什么问题?

在并发量大的时候,会遇到和上一篇文章中提到的并发一致性问题。

是如何利用redis事务操作优化?

本质也是乐观锁。

redis的WATCH和EXEC可以提供类似事务的机制:

  • WATCH观察key是否被改动;
  • 如果提交时key被改动,EXEC将返回null,表示事务失败;

保证一致性的库存扣减可以优化为:

WATCH key$num = GET key$num = $num - $countMULTISET key $numEXEC

在WATCH之后,EXEC执行之前,如果key的值发生变化,则EXEC会失败。

redis的WATCH为何能够保证事务性?

本质上,和上一篇文章中提到的乐观锁CAS机制是一样的,详见:

库存扣多啦,怎么用两行代码破解?

大部分情况下,redis不同的客户端会访问不同的key,所以WATCH碰撞的概率会比较小,在秒杀的业务场景,使用WATCH,也会有一定的冲突,需要针对秒杀业务做单独的优化。

为什么redis更能应对超高并发的库存管理?

根本原因,还是redis内存访问与mysql数据落盘的性能差异。

redis库存管理有什么需要注意的?

数据具备“易失性”,如果重启,数据可能丢失,所以redis大部分时候是用来存储允许cache miss的数据。如果实在要用redis来存储业务上不能够丢失的数据,需要重点设计一致性与可用性。

当然,redis也可以固化数据,但如果把redis当做DB用,为什么不直接使用mysql呢?

稍作总结

  • 可以使用redis的事务性扣减库存,其核心原理也是CAS机制;
  • redis高性能的核心是内存存储,一般用来存储允许cache miss的数据;
  • 如果使用redis存储不允许丢失的数据,需要注意一致性与可用性,这一点上,对比mysql没有额外优势;

具体怎么用,还得结合业务折衷。

任何脱离业务的架构设计都是耍流氓!

知其然,知其所以然。

思路比结论更重要。

责任编辑:赵宁宁 来源: 架构师之路
相关推荐

2024-04-11 13:45:14

Redis数据库缓存

2019-09-18 08:41:53

并发扣减一致性redis

2022-08-11 07:55:05

数据库Mysql

2016-11-29 09:00:19

分布式数据一致性CAS

2023-04-13 08:15:47

Redis缓存一致性

2022-09-06 15:30:20

缓存一致性

2024-11-14 07:10:00

2024-10-18 10:04:01

2023-08-01 07:42:33

Redis数据项目

2022-10-08 00:00:09

数据库缓存系统

2019-09-08 22:45:48

并发扣款一致性幂等性

2024-10-10 08:32:28

Redis高并发Lua

2024-01-10 08:01:55

高并发场景悲观锁

2024-11-07 22:57:30

2019-02-13 11:04:42

系统缓存软件

2022-06-21 21:47:13

数据系统

2022-05-31 08:37:59

RedisMySQL数据一致性

2017-09-04 14:46:10

分布式事务问题

2020-09-04 06:32:08

缓存数据库接口

2012-09-24 09:35:42

分布式系统
点赞
收藏

51CTO技术栈公众号