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实例信息如下:
节点 | IP | PORT |
---|---|---|
s1 | 192.168.150.101 | 27001 |
s2 | 192.168.150.101 | 27002 |
s3 | 192.168.150.101 | 27003 |
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);
}