目录Redisson 主从一致性Java 实现 mutilLockRedissonConfig.javaTestRedisson.javaRedisson 主从一致性 我们先来说一下
Redis Master
(主节点)中处理所有发向 Redis 的写操作(增删改),Redis Slave
(从节点)只负责处理读操作,主节点会不断将自己的数据同步给从节点,确保主从之间的数据一致性,但是数据同步会存在一定的延时,主从一致性问题就是因为延时而导致的set lock thread1 nx ex 10
来获取锁,主节点就会保存这个锁的标识 thread1,然后主节点会向从节点进行同步,但在同步尚未完成时时主节点发生故障,Redis 哨兵发现主节点宕机后,客户端连接会断开,然后从从节点中选出一个作为新的主节点,但是由于之前主从同步未完成,即 thread1 这个锁已经丢失,所以此时 Java 应用再来访问新的主节点时就会发现锁失效了,此时其他线程来获取锁时也能获取成功,这时就可能出现并发安全问题,以上就是主从一致性导致的锁失效问题mutilLock
package com.hmdp.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
// 配置
Config config = new Config();
// 地址 & 密码
config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
// 创建 RedissonClient 对象
return Redisson.create(config);
}
@Bean
public RedissonClient redissonClient2() {
// 配置
Config config = new Config();
// 地址 & 密码
config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
// 创建 RedissonClient 对象
return Redisson.create(config);
}
@Bean
public RedissonClient redissonClient3() {
// 配置
Config config = new Config();
// 地址 & 密码
config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
// 创建 RedissonClient 对象
return Redisson.create(config);
}
}
package com.hmdp;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Slf4j
@SpringBootTest
public class TestRedisson {
@Resource
private RedissonClient redissonClient;
@Resource
private RedissonClient redissonClient2;
@Resource
private RedissonClient redissonClient3;
private RLock lock;
@BeforeEach
void setUp() {
RLock lock1 = redissonClient.getLock("order");
RLock lock2 = redissonClient2.getLock("order");
RLock lock3 = redissonClient3.getLock("order");
// 创建连锁 multiLock
lock = redissonClient.getMultiLock(lock1, lock2, lock3);
}
@Test
void method1() throws InterruptedException {
// 尝试获取锁
boolean isLock = lock.tryLock(1L, TimeUnit.SECONDS);
if (!isLock) {
log.error("获取锁失败 .... 1");
return;
}
try {
log.info("获取锁成功 .... 1");
method2();
log.info("开始执行业务 .... 1");
} finally {
log.warn("准备释放锁 .... 1");
lock.unlock();
}
}
void method2() {
// 尝试获取锁
boolean isLock = lock.tryLock();
if (!isLock) {
log.error("获取锁失败 .... 2");
return;
}
try {
log.info("获取锁成功 .... 2");
log.info("开始执行业务 .... 2");
} finally {
log.warn("准备释放锁 .... 2");
lock.unlock();
}
}
}
跟踪源码,我们发现只有所有的锁都获取成功了才会返回 true
以上就是Redisson 主从一致性问题详解的详细内容,更多关于Redisson 主从一致的资料请关注编程网其它相关文章!
--结束END--
本文标题: Redisson主从一致性问题详解
本文链接: https://www.lsjlt.com/news/166101.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0