<!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <!-- 多台相同应用(负载均),Session共享 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.17.5</version> </dependency>
spring: redis: host: 106.12.174.220 port: 6379 password: 123456 #没有密码就保留空 timeout: 5000 jedis: pool: max-active: 1000 # 池在给定时间可以分配的最大连接数。使用负值表示无限制。 max-idle: 50 #池中“空闲”连接的最大数量。使用负值表示空闲连接的数量不受限制 min-idle: 10 # 目标是池中要维护的最小空闲连接数。此设置只有在它和逐出运行之间的时间均为正值时才有效。 max-wait: -1 # 在池耗尽时引发异常之前,连接分配应阻止的最长时间。使用负值无限期阻塞。 redisson: tokenName: Authorization # 用于分布式锁的唯一标识,一般使用token如果没有找到,就找sessionId session: store-type: redis #设置session保存为默认redis的方式 ,可以解决分布式session不一致问题
SessionConfig
import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @Configuration //设置session的默认在redis中的存活时间 @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200) //Session过期时间,2小时,默认1800秒(半小时) -1 永不过期 public class SessionConfig {}
SessionInitializer
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; //初始化Session配置 public class SessionInitializer extends AbstractHttpSessionApplicationInitializer { public SessionInitializer() { super(SessionConfig.class); } }
Redisson 구성
import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.redisson.config.SingleServerConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private String port; @Value("${spring.redis.password}") private String password; @Bean public RedissonClient getRedisson() { Config config = new Config(); SingleServerConfig singleServerConfig = config.useSingleServer(); singleServerConfig.setAddress("redis://" + host + ":" + port).setPassword(password); return Redisson.create(config); } }
Config config = new Config(); config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);
은 마스터 노드가 유실되고 하위 노드가 자동으로 마스터 노드를 보완하는 것으로 이해될 수 있습니다
Config config = new Config(); config.useSentinelServers().addSentinelAddress( "redis://172.29.3.245:26378","redis://172.29.3.245:26379", "redis://172.29.3.245:26380") .setMasterName("mymaster") .setPassword("a123456");
할 수 있습니다. redis의 읽기와 쓰기는 분리된 것으로 이해하지만 마스터 노드가 중단되면 센티넬 모드
Config config = new Config(); config.useMasterSlaveServers() //可以用"rediss://"来启用SSL连接 .setMasterAddress("redis://192.168.81.145:6379")//主节点 //从节点 .addSlaveAddress("redis://192.168.81.146:6379") .addSlaveAddress("redis://192.168.81.148:6379") .setPassword("123456");
Config config = new Config(); config.useClusterServers() .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒 .addNodeAddress("redis://127.0.0.1:7000") .addNodeAddress("redis://127.0.0.1:7001") .addNodeAddress("redis://127.0.0.1:7002") .setPassword("123456");
Red 잠금 모드의 노드는 모두 마스터 노드이거나 모두 독립형 Redis여야 합니다
해결 방법: Sentinel/master-slave/cluster, 이러한 모드에서 발생하는 문제
비동기 데이터 손실
분할뇌 문제.
때때로 프로그램은 매우 영리합니다. 예를 들어 노드가 끊어지면 여러 클라이언트가 동시에 잠금을 획득합니다. 이 작은 오류 가능성을 받아들일 수 있다면 이전 복제 솔루션을 사용하는 데 문제가 없을 것입니다. 그렇지 않은 경우 아래 설명된 솔루션을 구현하는 것이 좋습니다.
5개의 Redis 노드가 있다고 가정합니다. 이 노드들 사이에는 마스터-슬레이브 관계도 없고 클러스터 관계도 없습니다. 클라이언트는 동일한 키와 임의 값을 사용하여 5개 노드에 대한 잠금을 요청합니다. 잠금 요청 시간 제한은 자동 잠금 해제 시간보다 작아야 합니다. 3개(절반 이상)의 Redis에서 잠금이 요청되면 실제로 잠금이 획득됩니다. 잠금을 획득하지 못한 경우 잠긴 Redis 중 일부가 해제됩니다. 아아아아
위 내용은 Java Redis Redisson 구성 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!