【Redis】回顾下Redis实现分布式锁

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 了解一下分布式锁

分布式锁需要满足哪些条件?

分布式锁需要满足的一些条件:

  • 多进程互斥:同一时刻,只有一个进程可以获取锁。
  • 保证锁可以释放:任务结束或出现异常,锁一定要释放,避免死锁。
  • 阻塞锁(可选):获取锁失败时可否重试。
  • 重入锁(可选):获取锁的代码递归调用时,依然可以获取锁。

在这里插入图片描述

Redis最基本的分布式锁实现方式

Redis使用setnx命令,这个命令的特征是如果多次执行,只有第一次执行会成功,可以实现互斥的效果。但是为了保证服务宕机时也可以释放锁,需要利用expire命令给锁设置一个有效期,过期后就失效释放了。

setnx lock thread-1   # 尝试获取锁
expire lock 10         # 设置有效期

那如果在设置expire之前服务宕机怎么办?解决办法:要保证set NX和expire(EX)命令的原子性。
redis的set命令可以这样操作:

set key value [NX] [EX time] 

在释放锁的时候,如果自己的锁已经过期了,此时会出现安全漏洞,如何解决?
在锁中存储当前进程和线程标识,释放锁时对锁的标识判断,如果是需要删除的数据就删除,不是则放弃操作。但是这两步操作要保证原子性,需要通过Lua脚本来实现:

if redis.call("get",KEYS[1]) == ARGV[1] then
    redis.call("del",KEYS[1])
end

如何实现数据库与缓存数据一致?

实现方案有下面几种:

  • 本地缓存同步: 当前微服务的数据库数据与缓存数据同步,可以直接在数据库修改时加入对Redis的修改逻辑,保证一致。
  • 跨服务缓存同步: 服务A调用了服务B,并对查询结果缓存。服务B数据库修改,可以通过MQ通知服务A,服务A修改Redis缓存数据。
  • 通用方案: 使用Canal框架,伪装成MySQL的salve节点,监听MySQL的binLog变化,然后修改Redis缓存数据。

面对分布式锁留下了几个问题:
1.Redis可以实现可重入分布式锁吗?
2.Redis可重入分布式锁的获取锁和释放锁的实现方式怎样的呢?
这两个问题有会的朋友们欢迎在评论区留言交流解答。在技术的道路上欢迎您来指导解惑交流。

相关实践学习
基于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
相关文章
|
10月前
|
NoSQL Java 应用服务中间件
Redis系列-10.Redis分布式锁(上)
Redis系列-10.Redis分布式锁
70 0
|
消息中间件 负载均衡 监控
【Redis】Redis实现分布式锁
分布式锁无论在开发中还是面试里都是老八股了,本篇文章整理江湖上常见的Redis分布式锁解决方案
292 0
|
10月前
|
缓存 NoSQL Java
【Redis】Redis 分布式锁
【Redis】Redis 分布式锁
90 0
【Redis】Redis 分布式锁
|
存储 NoSQL Redis
基于redis实现分布式锁(下)
基于redis实现分布式锁(下)
|
缓存 NoSQL Redis
Redis 分布式锁应用
Redis 分布式锁应用
211 0
|
NoSQL 算法 Java
Redis分布式锁的10个坑
日常开发中,经常会碰到秒杀抢购等业务。为了避免并发请求造成的库存超卖等问题,我们一般会用到Redis分布式锁。但是使用Redis分布式锁,很容易踩坑哦~ 本文田螺哥将给大家分析阐述,Redis分布式锁的10个坑~
205 0
|
NoSQL Java Redis
分布式锁实现:Redis
前言 单机环境下我们可以通过JAVA的Synchronized和Lock来实现进程内部的锁,但是随着分布式应用和集群环境的出现,系统资源的竞争从单进程多线程的竞争变成了多进程的竞争,这时候就需要分布式锁来保证。
1233 0
|
运维 NoSQL 安全
被问烂的Redis分布式锁,你真的懂了? 下
被问烂的Redis分布式锁,你真的懂了? 下
|
安全 算法 NoSQL
|
10月前
|
NoSQL Java 关系型数据库
浅谈Redis实现分布式锁
浅谈Redis实现分布式锁
70 0