• Redis——SpringBoot整合、持久化、集群(主从、哨兵、分片)


    1 Spring整合Redis

    1.1 基本使用

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-data-redis</artifactId>
    4. </dependency>
    1. @Configuration
    2. public class RedisConfig {
    3. }

    1.2 自定义RedisTemplate

    1.2.1 传递对象的两种方式

    1.pojo序列化——jdk默认的序列化

    1. import lombok.AllArgsConstructor;
    2. import lombok.Data;
    3. import lombok.NoArgsConstructor;
    4. import org.springframework.stereotype.Component;
    5. import java.io.Serializable;
    6. @Component
    7. @Data
    8. @AllArgsConstructor
    9. @NoArgsConstructor
    10. public class User implements Serializable {
    11. private String name;
    12. private int age;
    13. }
    1. @SpringBootTest
    2. class DemoApplicationTests {
    3. @Autowired
    4. private RedisTemplate redisTemplate;
    5. @Test
    6. void TestSerializable() {
    7. User user = new User("zhangsan", 30);
    8. redisTemplate.opsForValue().set("user", user);
    9. User userResult = (User)redisTemplate.opsForValue().get("user");
    10. System.out.println(userResult);
    11. }
    12. }


    2.手动转json

    1. @Component
    2. @Data
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. public class User {
    6. private String name;
    7. private int age;
    8. }
    1. @SpringBootTest
    2. class DemoApplicationTests {
    3. @Autowired
    4. private RedisTemplate redisTemplate;
    5. @Test
    6. void TestTransportByJson() {
    7. User user = new User("zhangsan", 30);
    8. String jsonUser = JSON.toJSONString(user);
    9. redisTemplate.opsForValue().set("user", jsonUser);
    10. String jsonResult = (String) redisTemplate.opsForValue().get("user");
    11. User userResult = JSON.parseObject(jsonResult, User.class);
    12. System.out.println(userResult);
    13. }
    14. }

    1.2.2 配置序列化方式

    1. @Configuration
    2. public class RedisConfig {
    3. @Bean
    4. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    5. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    6. redisTemplate.setConnectionFactory(factory);
    7. //配置序列化方式
    8. //1.jackson
    9. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
    10. ObjectMapper objectMapper = new ObjectMapper();
    11. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    12. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    13. jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    14. //2.String
    15. StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    16. redisTemplate.setKeySerializer(stringRedisSerializer);//key采用String的序列化方式
    17. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value采用jackson的系列化方式
    18. redisTemplate.setHashKeySerializer(stringRedisSerializer);//hash的key采用String的序列化方式
    19. redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//hash的value采用jackson的系列化方式
    20. redisTemplate.afterPropertiesSet();//把所有的配置加进去
    21. return redisTemplate;
    22. }
    23. }

    2.持久化

    2.1 RDB

    RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

    2.1.1 执行时机

    RDB持久化在四种情况下会执行:
    (1)执行save命令
    (2)执行bgsave命令
    (3)Redis停机时
    (4)触发RDB条件时

     2.1.2 原理


    2.2 AOF

    2.2.1 原理

    AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

     

    2.2.2 配置

    2.3 RDB与AOF对比

    3.主从集群

    3.1 搭建

    3.2 同步原理

    3.2.1 全量同步

     

    3.2.2 增量同步 

     

    4.哨兵

    4.1 哨兵的作用和原理

     

     

    4.2 哨兵集群的搭建

    三个sentinel实例信息如下:

    节点IPPORT
    s1192.168.150.10127001
    s2192.168.150.10127002
    s3192.168.150.10127003

    4.2.1 准备实例和配置

    (1)要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。我们创建三个文件夹,名字分别叫s1、s2、s3

    # 进入/tmp目录 cd /tmp

    # 创建目录 mkdir s1 s2 s3

    (2)然后我们在s1目录创建一个sentinel.conf文件,添加下面的内容:

    port 27001

    sentinel announce-ip 192.168.150.101

    sentinel monitor mymaster 192.168.150.101 7001 2

    sentinel down-after-milliseconds mymaster 5000

    sentinel failover-timeout mymaster 60000

    dir "/tmp/s1"

    (3)然后将s1/sentinel.conf文件拷贝到s2、s3两个目录中,修改s2、s3两个文件夹内的配置文件,将端口分别修改为27002、27003:

    sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf

    sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf

    4.2.2 启动

    为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令:

    # 第1个 redis-sentinel s1/sentinel.conf

    # 第2个 redis-sentinel s2/sentinel.conf

    # 第3个 redis-sentinel s3/sentinel.conf

    4.3 RedisTemplate

    1. 在配置文件application.yml中指定redis的sentinel相关信息:

    1. spring:
    2. redis:
    3. sentinel:
    4. master: mymaster
    5. nodes:
    6. - 192.168.150.101:27001
    7. - 192.168.150.101:27002
    8. - 192.168.150.101:27003

    2.在项目的启动类中,添加一个新的bean:

    1. @Bean
    2. public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    3. return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
    4. }

    5.搭建分片集群

  • 相关阅读:
    初步利用Ansible实现批量服务器自动化管理
    springboot+poi-tl根据模板导出word(含动态表格和图片),并将导出的文档压缩zip导出
    Azure DevOps (二) 实现Git仓库和钉钉的联动
    Java遍历目录下的所有文件
    Java刷题大全(笔试题)【大厂必备】(基础)
    Linux C 的多文件编译
    elasticsearch设置密码
    【计算机网络】 基于TCP的简单通讯(服务端)
    windows操作系统部署Moodle3.9修改大文件上传限制
    写爬虫被字体反爬了怎么办?
  • 原文地址:https://blog.csdn.net/m0_63544124/article/details/125576619