持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
redis单机版本分布式锁
public class MyRedisLock {
private static int lockSuccess = 1;
/**
* @param lockKey 在redis中创建的key
* @param notLockTime 尝试获取锁的超时时间
* @param timeOut 设置有效期,防止死锁 (预估锁的超时时间,在提交事务时,检查锁是否超时,如果已经超时,则业务代码手动回滚)
* @return 返回lock成功值
*/
public String getLock(String lockKey, int notLockTime, int timeOut){
//获取redis连接
Jedis jedis = RedisUtils.getJedis();
try {
//计算尝试获取锁的超时时间
Long endTime = System.currentTimeMillis()+notLockTime;
//系统时间小于endTime,获取锁没有超时,否则退出循环
while (System.currentTimeMillis() < endTime) {
String lockValue = UUID.randomUUID().toString();
//当多个jvm同时创建一个相同的redis的key,谁能创建成功谁就获取到锁
if(jedis.setnx(lockKey,lockValue) == lockSuccess){
//加上有效期
jedis.expire(lockKey,timeOut/1000);
//退出循环
return lockValue;
}
//否则继续循环
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(jedis != null){
jedis.close();
}
}
return null;
}
/**
* 释放锁(jvm自己获取的锁,自己释放锁)
* @return
*/
public boolean unLock(String lockKey, String lockValue){
//获取redis连接
Jedis jedis = RedisUtils.getJedis();
try {
//判断是否删的自己的锁
if(lockValue.equals(jedis.get(lockKey))){
return jedis.del(lockKey) > 0 ? true : false;
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(jedis != null){
jedis.close();
}
}
return false;
}
}
redis主从复制
在分布式领域中不可能实现强一致性。(主redis同步到从redis中,需要一个时间过程,网络原因)
作用:
单个redis如果某种原因宕机的话,可能导致整个redis服务不可用,可以使用redis主从复制实现一主多从,主节点负责读和写。从节点负责读数据。
主从复制:
1、实现redis集群
2、数据的备份
3、读写分离
相关配置Redis.conf
slaveof 192.168.212.155 6379
masterauth 123456
info replication
主从复制需要注意的问题:
主节点会将数据采用增量或全量的过程,同步到从服务器
主从复制原理过程:
1、在从服务redis的redis.conf中配置slaveof指向主redis服务ip地址和端口号,(192.168.1.110:6379和密码)
2、从redis服务器和主redis服务器建立socket长连接
3、采用全量和增量形式将数据同步给redis服务器
全量:从redis服务器第一次启动时(发送二进制执行文件dump) rdb
增量:主redis每次有新的set请求时候 aof日志文件
主从复制存在那些缺陷?
主节点宕机后,导致整个redis服务不能做写的操作。(需要哨兵机制,选举出新的master节点)