分布式锁
- 当在分布式模型下,数据只有一份(或有限制),此时需要利用锁的技术控制某一时刻修改数据的进程数。
-
与单机模式下的锁不仅需要保证进程可见,还需要考虑进程与锁之间的网络问题。(我觉得分布式情况下之所以问题变得复杂,主要就是需要考虑到网络的延时和不可靠。。。一个大坑)
-
分布式锁还是可以将标记存在内存,只是该内存不是某个进程分配的内存而是公共内存如Redis、Memcache。至于利用数据库、文件等做锁与单机的实现是一样的,只要保证标记能互斥就行。
实现方式
- 基于数据库实现
- 基于缓存实现(redis)
- zookeeper实现
本篇基于redis实现分布式锁
实现的三个关键点
- 原子性:加锁和解锁原子操作不可打断
- 避免死锁:锁不会被某个进程一直占有或者在占有锁进程无法解锁(宕机)情况下能够解锁
- 互斥性:同一时刻只能有一个进程获得锁
- 正确解锁:锁的占有者只能解除自己的锁
代码实现(jedis)
redis配置
host=127.0.0.1
port=6379
password=123456
redis配置类
package com.zyl.redis.config;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
@Configuration
@PropertySource(value = {"classpath:redis-conf.properties"})
public class RedisConfig
{
@Value("${host}")
private Stri