评论

收藏

[JavaScript] React 配置化+Serverless 开发个人博客fsaf

开发技术 开发技术 发布于:2021-12-21 22:19 | 阅读数:626 | 评论:0

download:​​React 配置化+Serverless 开发个人博客​​

为什么需要分布式锁

  • 用户下单
锁住 uid,防止重复下单。

  • 库存扣减
锁住库存,防止超卖。

  • 余额扣减
锁住账户,防止并发操作。
分布式系统中共享同一个资源时往往需要分布式锁来保证变更资源一致性。

分布式锁需要具备特性

  • 排他性
锁的基本特性,并且只能被第一个持有者持有。

  • 防死锁
高并发场景下临界资源一旦发生死锁非常难以排查,通常可以通过设置超时时间到期自动释放锁来规避。

  • 可重入
锁持有者支持可重入,防止锁持有者再次重入时锁被超时释放。

  • 高性能高可用
锁是代码运行的关键前置节点,一旦不可用则业务直接就报故障了。高并发场景下,高性能高可用是基本要求。

实现 Redis 锁应先掌握哪些知识点

  • set 命令
SET key value [EX seconds] [PX milliseconds] [NX|XX]


  • ​​EX ​​second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
  • ​​PX ​​millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
  • ​​NX ​​:只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
  • ​​XX ​​:只在键已经存在时,才对键进行设置操作。

  • Redis.lua 脚本
使用 redis lua 脚本能将一系列命令操作封装成 pipline 实现整体操作的原子性。

go-zero 分布式锁 RedisLock 源码分析
​​core/stores/redis/redislock.go​​

  • 加锁流程
-- KEYS[1]: 锁key
-- ARGV[1]: 锁value,随机字符串
-- ARGV[2]: 过期时间
-- 判断锁key持有的value是否等于传入的value
-- 如果相等说明是再次获取锁并更新获取时间,防止重入时过期
-- 这里说明是“可重入锁”
if redis.call("GET", KEYS[1]) == ARGV[1] then
  -- 设置
  redis.call("SET", KEYS[1], ARGV[1], "PX", ARGV[2])
  return "OK"
else
  -- 锁key.value不等于传入的value则说明是第一次获取锁
  -- SET key value NX PX timeout : 当key不存在时才设置key的值
  -- 设置成功会自动返回“OK”,设置失败返回“NULL Bulk Reply”
  -- 为什么这里要加“NX”呢,因为需要防止把别人的锁给覆盖了
  return redis.call("SET", KEYS[1], ARGV[1], "NX", "PX", ARGV[2])
end

关注下面的标签,发现更多相似文章