分布式锁课题

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

分布式锁概念

解决分布式服务下,多线程环境对同一份资源竞争的数据安全性分布式锁是 用于保证整个集群内的多线程并发线程安全性的一种手段

分布式锁特征

高性能、可重入、防死锁和互斥性

  • 高性能:最求高QPS
  • 可重入:当一次请求的代码中包含两个锁时,并且递归调用两个锁时,要保证可重入,否则会出现死锁

,重入几次就要释放几次

public synchronized void test1() {
    // 阻塞卡死了 
    test2(); 
} 
public synchronized void test2() { 
    test1()
}
  • 防死锁

除上面的情况下,如果加锁后服务器宕机,锁不释放也会产生死锁

  • 互斥性

实现分布式锁的方式

  • Mysql

性能低下,通过insert时的唯一索引实现

  • redis

可以通过setNx方法实现,这个是最简单的分布式锁,比如执行一个方法时,加一个锁,且不设置过期时间,或者设置一个很大的过期时间,但是有弊端,对于业务量不高也可以使用
另外一种就是使用redission框架,这个安全性更高

  • zookeeper

该锁最安全,但是成本有点大,因为还要引进zookeeper

使用场景

  • 保证接口的幂等,防止重复提交,这个时很高频的使用
  • 分布式的任务调度,分布式的系统可能多个执行器执行定时任务,防止任务重复执行,使用分布式锁,这个在我执行实现的任务调度中也使用过
  • 防止超卖的情况
    这个实际工作中我也遇到过,做过抢单业务都会遇到此种情况

使用redis实现分布式锁特性

  • 原子性

由于redis的设置分布式锁,需要两个命令

  1. 设置key value
  2. 设置过期时间

即便使用setNx方法,底层也是两个命令
setNX item-4 111
set item-4 111 EX 20
如果第一个命令执行成功了,第二个失败了,那么就没有了过期时间,照成死锁,就不具备原子性,要么都成功,要么都失败,所以要通过使用lua脚本来解决

  • 过期时间

上面说了,没有过期时间可能会出现死锁的情况

  • 锁续期

如果一个业务锁到了过期时间但是业务没有执行完,就会造成锁失效,没有锁住,这部分的解决方案就是通过watchdog来实现

  • 正确释放锁

A上的锁被B释放了,这样就会造成错误释放锁,原因是A与B的key值是相同的,所以要注意key值

使用redis实现分布式锁的部署方式

  1. 单机

简单,但是风险大

  1. 哨兵 主从

如果mater挂掉,又没同步到slave会导致,锁丢失

  1. 集群

虽然是集群但是,也是部署在集群中其中一台机器上,挂掉就没了

  1. 红锁

全都是master,但是性能低,成本高

redission实现分布式锁

加锁

image.png

watchdog锁续期

watch会在锁在剩余三分之一时间过期时自动续期,从而实现锁续期

image.png

相关实践学习
基于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
相关文章
|
3月前
|
缓存 NoSQL 算法
认真学习分布式应用中的分布式锁
认真学习分布式应用中的分布式锁
57 0
|
3月前
|
存储 NoSQL Java
分布式锁中的王者方案 - Redission
分布式锁中的王者方案 - Redission
54 1
|
3月前
|
存储 NoSQL 关系型数据库
聊一聊分布式锁的设计模型
本文介绍了分布式锁的设计模型、运行原理以及具体用法,作者也在文中体现了自己的关于分布式锁的思考以及具体实践。
52829 0
|
3月前
|
NoSQL 安全 Java
面试官:分布式锁最终解决方案是RedLock吗?为什么?
面试官:分布式锁最终解决方案是RedLock吗?为什么?
77 1
|
3月前
|
消息中间件 缓存 安全
清华架构大牛剖析高并发与多线程的关系、区别,带你击穿面试难题
当提起这两个词的时候,是不是很多人都认为高并发=多线程? 当面试官问到高并发系统可以采用哪些手段来解决,是不是一脸懵逼?
|
11月前
|
NoSQL Java Redis
实现分布式锁的解决方案 2
实现分布式锁的解决方案
96 1
|
11月前
|
NoSQL Java 应用服务中间件
实现分布式锁的解决方案 1
实现分布式锁的解决方案
65 0
|
12月前
|
缓存 NoSQL Dubbo
京东三面惨遭被虐,关于redis,高并发,分布式,微服务一窍不通
三面大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜~)。回来之后把这些题目做了一个分类并整理出答案(强迫症的我~狂补知识~)分为redis缓存,高并发,分布式,微服务等,接下来分享一下我的这京东面试的面经+一些我的学习笔记。
|
存储 算法 安全
分布式架构的必问理论
分布式架构的必问理论
88 1
|
存储 NoSQL 数据可视化
一文讲清楚硬核分布式锁
一文讲清楚硬核分布式锁
128 0