专栏名称: 架构师之路
架构师之路,坚持撰写接地气的架构文章
目录
相关文章推荐
架构师之路  ·  我升级了,欢迎大家试用 ·  2 天前  
美团技术团队  ·  老显卡福音!美团开源首发INT8无损满血版D ... ·  3 天前  
51好读  ›  专栏  ›  架构师之路

有柳岩问:高并发库存扣减一致性问题,怎么用redis解决?(第42讲)

架构师之路  · 公众号  · 架构  · 2025-03-06 11:56

正文

《架构师之路:架构设计中的100个知识点》

42.redis解决库存扣减一致性

昨天和大家聊了库存异常的两种情况:
1. “先查后减”,容易出现异常
2. “先查后设”,幂等性优化,解决重试问题;
3. “先查后设,有条件的设”,CAS优化,解决并发问题;
有留言说: 可以用redis优化。 redis方案是可以的,今天简单展开说说。


redis一般如何操作库存?

一般在 redis 客户端执行:

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

这样操作存在什么问题?

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

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

本质也是乐观锁。

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

1. WATCH 观察 key 是否被改动;

2. 如果提交时 key 被改动, EXEC 将返回 null ,表示事务失败;


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

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

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

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

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

库存扣多啦,怎么用两行代码破解?(第41讲)


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

秒杀架构优化的核心原则!(第18讲)


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

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


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

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


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


稍作总结:

1. 可以使用 redis







请到「今天看啥」查看全文