什么是主从模式?
主从模式我理解为读写分离, 就是把原来的 Redis 库复制一份到另一个服务器的 Redis , 原来的 Redis 只提供写入功能, 称为主(master), 复制出来的 Redis 只提供读功能, 成为(slave).
可以是一主一从, 也可以是一主多从. 通过这种读写分离的方式来实现降低 Redis 的访问压力, 这就是主从模式的一个大致概念.
配置
准备2个服务器 192.168.120.1作为master 192.168.120.2作为slave
master不变 slave服务器redis.conf 文件的末尾添加一行 所属的 master 即可.
slaveof 192.168.120.1 6379 #为master 的redis 的ip 和端口
然后重启搭建好了 此时可以在192.168.120.1上set 192.168.120.2上get
springboot处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| spring: redis: host: 192.168.120.1 port: 6379 password: 123123 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 sentinel: master: mymaster nodes: - host: 192.168.120.2 port: 6379 - host: 192.168.120.3 port: 6379
|
- 在执行读操作时, 需要使用名为 slaveRedisTemplate 的 RedisTemplate 对象, 该 RedisTemplate 对象的配置应该与默认的 RedisTemplate 对象(用于写操作)有所不同
- 在连接 Redis 实例时需要指定读取数据的从节点. 这里使用了 connectionFactory 来创建 RedisTemplate 对象, 并将名称设置为 slaveRedisTemplate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| @Configuration public class RedisConfig {
@Autowired private RedisConnectionFactory connectionFactory;
@Bean(name = "slaveRedisTemplate") public RedisTemplate<Object, Object> slaveRedisTemplate() { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); template.afterPropertiesSet(); return template; }
}
@Service public class RedisService {
@Autowired private RedisTemplate<Object, Object> redisTemplate;
@Autowired @Qualifier("slaveRedisTemplate") private RedisTemplate<Object, Object> slaveRedisTemplate;
public void set(String key, String value) { redisTemplate.opsForValue().set(key, value); }
public String get(String key) { return (String) slaveRedisTemplate.opsForValue().get(key); } }
|
@Autowired
和 @Qualifier("slaveRedisTemplate")
用于注入名为 slaveRedisTemplate
的 RedisTemplate 对象, 并通过该对象来执行读操作.
在执行写操作时, 则需要使用默认的 RedisTemplate 对象(即 redisTemplate
).
需要注意的是, 在实际应用中, 对于一些需要保证强制一致性的写操作, 仍然需要通过主节点进行操作.