遇到问题
在做项目中,遇到了一个点赞的业务逻辑需要实现原则性操作,即在 Redis 中存储两个键值对,点赞的时候需要将 set 集合中加入点赞的用户 id,并且将被点赞用户的总赞数 + 1。
我不希望在这两个业务之间插入其他命令执行,需要保证执行业务的原子性,所以第一想法是使用 Redis 本身的事务(MULTI)来实现。但是由于我使用的是 Redis 集群,Redis 只支持单机的事务管理,集群并不支持事务功能。于是乎我决定使用 setNX 分布式锁来实现需求。
确保加锁的原子性
首先想到的是使用 setNX 命令来实现加锁操作:SET locKey uuid EX time NX
。
在 Redis 2.6.12 版本之后,Redis 支持原子命令加锁,我们可以通过向 Redis 发送 「set key value EX 过期时间 NX」 命令,实现原子的加锁操作。
注意,这里在设置值的时候,value 应该是随机字符串,比如 UUID,而不是随便用一个固定的字符串进去,为什么这样做呢?
value 的值设置为随机数主要是为了更安全的释放锁,释放锁的时候需要检查 key 是否存在,且 key 对应的 value 值是否和指定的值一样,是一样的才能释放锁。
保证加锁原子性的原因
SpringBoot 中的具体实现
问题与不足
确保删除的是自己的锁
SpringBoot 中的具体实现
问题与不足
确保删除锁的原子性
SpringBoot 中的具体实现
setNX 锁在非单机模式下的缺陷
巨人的肩膀
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。