Redis实现分布式锁
1. 概述
随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景,而在分布式系统中访问共享资源就需要一种互斥机制,来防止彼此之间的相互干扰,以保证数据的一致性,在这样情况下,我们就需要用到分布式锁。
简单说就是在分布式系统中,会出现多个JVM中线程竞争共享资源,此时线程锁已经不适用了(线程锁只能解决同一个JVM中多线程的并发安全问题),必须要在多个JVM外部引入一个具有锁功能的组件,该组件叫做分布式锁。
实现分布式锁有三种方式,数据库锁、缓存锁、Zookeeper锁。下面主要讲一个使用Redis实现的分布式锁。
2. Redis分布式锁
2.1 分布式锁考虑的因素
若想要实现的分布式锁可用,必须要考虑以下四个必要因素:
(1). 互斥性,任意时刻,只有一个客户端获取到锁。
(2). 不会发生死锁,当客户端获取到锁之后,客户端奔溃了,要保证锁会被释放。
(3). 可重入锁,一个线程获取到锁之后,允许它再次获取锁。
(4). 解铃还须系铃人,要确保加锁和解锁的是同一个客户端。
2.1 Redis分布式锁实现
redis可以使用setnx来实现分布式锁,但是在实现过程中必须要考虑上面的4个要素。如果不想自己实现Redis分布式锁,可以使用Redis的工具类Redisson,Redisson中已经实现了分布式锁,并且非常简单易用。
public static void main(String[] args) {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
config.useSingleServer().setPassword("redis1234");
//获取redisson客户端
final RedissonClient client = Redisson.create(config);
//获取锁对象
RLock lock = client.getLock("lock1");
try{
//加锁
lock.lock();
}finally{
//解锁
lock.unlock();
}
}
备注: 本博客用于简单记录下分布式锁。具体想要看Redis实现的分布式锁原理,请查看该博客:点击