Redis原子操作和分布式锁setnx

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: Redis原子操作和分布式锁setnx

Redis是一款高性能的NoSQL数据库,自增操作是Redis中一个常见的操作,它可以用来实现唯一ID生成、计数器等应用场景。

Redis的原子性操作

Redis原子性操作指的是Redis中对于某个键值对的读写操作是互斥的,并且Redis的所有操作都是原子性操作。因此,Redis可以非常方便地实现一些需要用到原子性操作的场景。

Redis自增操作

Redis自增操作可以使用Redis提供的INCR命令实现:    INCR key其中key为需要自增的键,执行该命令后,Redis会自动将该键对应的值加1,并返回加1后的值。同理,自减操作为DECR。

Redis原子自增/自减技术的实现方式

  • 分布式锁实现
  • Redis可以通过SETNX命令实现分布式锁,可以利用这个特性来实现原子自增操作。当一个进程需要对一个键进行自增操作时,首先需要获取该键的分布式锁,然后执行INCR命令实现自增操作,最后释放该键的分布式锁。
  • 由于Redis获取分布式锁和自增操作都是原子性的操作,因此这样实现能够保证原子性。
  • lua脚本实现
  • Redis支持使用Lua脚本实现原子操作,可以将多个命令封装在Lua脚本中,然后通过EVAL命令一次性执行。利用这个特性,可以实现原子自增操作。

sentx分布式锁的几个常见问题和解决方式

  • setnx抢占锁成功,业务代码或者程序在运行过程中宕机了,没有执行锁删除逻辑,就会造成死锁。
  • 解决方式:设置锁的自动过期,即使没有手动删除,会自动删除;
  • 设置过期时间跟加锁不是一条语句 如果加锁成功但设置过期时间未成功,会出现问题。
  • 解决方式:将加锁与设置过期时间原子完成。
  • 删除锁直接删除,由于业务处理时间长,锁过期了,我们直接删除,有可能把别人正在持有的锁删除。
  • 解决方式:占锁的时候,值指定为uuid,每个人匹配是自己的锁才删除;
  • 如果在查询的时候key没有过期,但执行删除之前key过期了 我们删除的还是别人的锁。
  • 解决方式:使用lua脚本 原子的查询与删除锁。

参考链接:

[1] https://www.dbs724.com/307116.html

[2] https://cloud.tencent.com/developer/article/2046710

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7天前
|
NoSQL Java Redis
实现基于Redis的分布式锁机制
实现基于Redis的分布式锁机制
|
17天前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
46 0
|
18天前
|
NoSQL 算法 Java
技术好文:Redis实现分布式锁的7种方案
技术好文:Redis实现分布式锁的7种方案
|
3天前
|
NoSQL 安全 Java
技术好文:Redis分布式锁的正确实现方式
技术好文:Redis分布式锁的正确实现方式
|
17天前
|
NoSQL Java Redis
通过Redis 实现分布式锁_利用Jedis 客户端
通过Redis 实现分布式锁_利用Jedis 客户端
|
17天前
|
缓存 NoSQL 数据库
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
25 0
|
17天前
|
NoSQL 安全 Java
分享Redis实现分布式锁
分享Redis实现分布式锁
14 0
|
NoSQL Java 关系型数据库
浅谈Redis实现分布式锁
浅谈Redis实现分布式锁
|
存储 canal 缓存
|
NoSQL PHP Redis
redis实现分布式锁
redis实现分布式锁
152 0
redis实现分布式锁