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

1 Spring整合Redis

 

1.1 基本使用

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
spring:
  redis:
    host: 192.168.59.128
    port: 6379
@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        // redisTemplate 操作不同的数据类型,api和指令是一样的
        // opsForValue 操作字符串 类似String
        // opsForlist 操作List类似List
        // opsForSet
        // opsForHash
        // opsForZSet
        // opsForGeo
        // opsForHyperlogLog
        //除基本的操作,常用的方法都可以直接通过redisTemplate操作,比如事务以及基本的CRUD


        //获取redis连接对象
//        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//        connection.flushAll();
//        connection.flushDb();
        redisTemplate.opsForValue().set("name","zhangsan");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }
}

 

1.2 自定义RedisTemplate

1.2.1 传递对象的两种方式

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

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import java.io.Serializable;

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private String name;
    private int age;
}
@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void TestSerializable() {
        User user = new User("zhangsan", 30);
        redisTemplate.opsForValue().set("user", user);
        User userResult = (User)redisTemplate.opsForValue().get("user");
        System.out.println(userResult);
    }
}


2.手动转json

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
}
@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void TestTransportByJson() {
        User user = new User("zhangsan", 30);
        String jsonUser = JSON.toJSONString(user);
        redisTemplate.opsForValue().set("user", jsonUser);
        String jsonResult = (String) redisTemplate.opsForValue().get("user");
        User userResult = JSON.parseObject(jsonResult, User.class);
        System.out.println(userResult);
    }

}

1.2.2 配置序列化方式

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        //配置序列化方式
        //1.jackson
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        //2.String
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        redisTemplate.setKeySerializer(stringRedisSerializer);//key采用String的序列化方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value采用jackson的系列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);//hash的key采用String的序列化方式
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//hash的value采用jackson的系列化方式
        redisTemplate.afterPropertiesSet();//把所有的配置加进去

        return redisTemplate;
    }
}

1.3 添加缓存

1.3.1 什么是缓存

 

1.3.2 添加Redis缓存业务逻辑

1.3.3 缓存更新策略

 

 

1.3.4 解决缓存穿透业务逻辑

 

1.3.5 缓存雪崩


1.3.6 缓存击穿

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相关信息:

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.150.101:27001
        - 192.168.150.101:27002
        - 192.168.150.101:27003

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

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

5.搭建分片集群

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值