冲击大厂第六天:分布式锁面试题
1、分布式锁是什么,分布式锁用过没,说说分布式锁,分布式锁和非分布式锁的区别? 我们在开发应用时,如果需要对某一个共享变量进行多线程同步访问的时候,由于目前java中的synchronized或者juc包中的锁都是针对单个jvm的,分布式环境下就无能为力,只能用分布式锁,用来解决跨JVM的互斥机制来控制共享资源的访问,这就是份分布式锁要解决的问题。 2、怎么实现分布式锁? 三种主流实现: 基于关系型数据库mysql实现 基于redis实现 基于zookeeper实现 性能:redis > zookeeper > mysql 安全:zookeeper (高度一致性)> redis == mysql 复杂度:zookeeper > mysql > redis 3、实现分布式锁应该具有的特点? 排他互斥:setnx 防死锁:
-
获取到锁之后,服务立马宕机,没有机会释放锁。 解决方案设置过期时间:expire 或者 set key value ex 3 nx(只在键不存在时, 才对键进行设置操作,NX : 只在键已经存在时, 才对键进行设置操作) 不可重入
保证原子性:
-
获取锁和设置过期时间要保证原子性 释放锁时,判断和删除之间也要保证原子性,使用lua脚本
防误删:删除时需要判断是否自己的锁 过期时间自动续期 可重入
上一篇:
IDEA上Java项目控制台中文乱码