-
『Redis』什么是分布式锁?如何实现?
一、什么是分布式锁?
要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。
- 线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。
- 进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。
- 分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
二、分布式锁的使用场景
线程间并发问题和进程间并发问题都是可以通过分布式锁解决的,但是强烈不建议这样做!因为采用分布式锁解决这些小问题是非常消耗资源的!分布式锁应该用来解决分布式情况下的多进程并发问题才是最合适的。有这样一个情境,线程A和线程B都共享某个变量X。
如果是单机情况下(单JVM),线程之间共享内存,只要使用线程锁就可以解决并发问题。
如果是分布式情况下(多JVM),线程A和线程B很可能不是在同一JVM中,这样线程锁就无法起到作用了,这时候就要用到分布式锁来解决。
三、分布式锁的实现
分布式锁实现的关键是在分布式的应用服务器外,搭建一个存储服务器,存储锁信息,这时候我们很容易就想到了Redis。首先我们要搭建一个Redis服务器,用Redis服务器来存储锁信息。
在实现的时候要注意的几个关键点:
1、锁信息必须是会过期超时的,不能让一个线程长期占有一个锁而导致死锁;
2、同一时刻只能有一个线程获取到锁。
几个要用到的redis命令:
- setnx(key, value):“set if not exits”,若该key-value不存在,则成功加入缓存并且返回1,否则返回0。
- get(key):获得key对应的value值,若不存在则返回nil。
- getset(key, value):先获取key对应的value值,若不存在则返回nil,然后将旧的value更新为新的value。
- expire(key, seconds):设置key-value的有效期为seconds秒。
分布式锁的三种实现方式
-
数据库乐观锁;
-
基于Redis的分布式锁;
-
基于ZooKeeper的分布式锁。
出 处:https://www.cnblogs.com/linkeke/p/15691654.html
最新更新
iframe页面总是提示需要重新登录怎么办
mybatis(CRUD)
2021 全球程序员收入报告出炉,看完我真
Maven插件开发教程
引爆全球的 Log4j2 核弹级漏洞,JNDI 到底是
java 读写 ini 配置文件
动力节点-王妈妈Springboot教程(一)Xml 和
一文搞懂Flink Window机制
jdk8下载安装与配置环境变量(windows)
SpringBoot项目启动即执行某个方法
MongoDB常用命令(2)
MongoDB基本介绍与安装(1)
SQLServer触发器调用JavaWeb接口
SQL Server索引的原理深入解析
SqlServer2016模糊匹配的三种方式及效率问题
SQL中Truncate的用法
sqlserver 多表关联时在where语句中慎用tri
链接服务器读取Mysql---出现消息 7347,级别
SQL Server解惑——为什么你拼接的SQL语句换
MySQL视图了解一下
戏说HTML5
让 HTML5 来为你定位
Asp.net 微信H5唤起支付和支付回调
C# asp.net mvc 创建虚拟目录
浅薄的一些JAVA基础知识
【JS 逆向百例】网洛者反爬练习平台第一
springboot配置swagger2
160_Vue实战:路由模式,404,路由钩子
150_Vue实战:参数传递及重定向
140_Vue实战:路由嵌套