redis主从复制和读写分离

in 笔记 with 0 comment

主从复制介绍

image1

搭建主从复制的两种方式

image2

命令行方式

3
要注意先把主redis服务的ip绑定放开,然后在从redis里面输入slave <ip> <port>

配置文件方式

4

在从redis.conf里面加上slaveof <ip> <port>(在新版本主从复制配置文件的方式改为replicaof <ip> <port>),还有slave-read-only yes(默认)

检查主从复制是否配置成功

5

主从复制流程

6

7

8

主从复制的应用场景

9

主从复制的注意事项

10
11

redis读写分离

应用场景:当redis写操作量比较大,可以将读写分别转移到master和slave上,master复制写,slave负责读。需要依赖业务代码来实现。

代码实现

使用redis客户端操作工具的是spring-data-redis提供的Lettuce。

@Service
public class ReplicationExampleService {
    @Autowired
    private StringRedisTemplate template;

    public void setByCache(String userId, String userInfo) {
        template.opsForValue().set(userId, userInfo);
    }

    public String getByCache(String userId) {
        return template.opsForValue().get(userId);
    }
}
@Configuration
@Profile("replication-rw") // 主从 - 读写分离模式
class ReplicationRWRedisAppConfig {
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        System.out.println("使用读写分离版本");
        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .readFrom(ReadFrom.SLAVE_PREFERRED)
                .build();
        // 这里连主服务器
        RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("192.168.100.242", 6379);
        return new LettuceConnectionFactory(serverConfig, clientConfig);
    }
}

测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@ActiveProfiles("replication-rw") // 激活主从集群-读写分离的配置
public class ReplicationRWTests {
    @Autowired
    ReplicationExampleService replicationExampleService;

    @Test
    public void setTest() {
        replicationExampleService.setByCache("tony", "xxxx");
        String result = replicationExampleService.getByCache("tony");
        System.out.println("从缓存中读取到数据:" + result);
    }
}