持久化
持久化就是把内存中的数据写到磁盘中,防止服务宕机导致内存数据丢失。
Redis 提供了两种持久化的机制:RDB(默认)、AOF机制。
RDB
RDB是Redis默认的持久化方式。按照一定的时间
将内存的数据以快照的形式
保存到磁盘中,对应产生的数据文件为 dump.rdb
. 通过配置文件中的save
参数来定义快照的周期。
它恢复时是将快照文件直接读到内存里。
Redis 会单独 fork 一个子进程来进行持久化,会先将数据写到一个临时文件中,到持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。
如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更高效。RDB的缺点是最后一次持久化后的数据可能丢失。
AOF
AOF(Append Only File持久化),则是将Redis 每次执行的写命令
记录到单独的日志文件中,当重启Redis时 会重新从持久化的日志文件中恢复数据。
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
AOF保存的是 appendonly.aof
文件。
当两种方式同时开启时,数据恢复 Redis 会优先选择 AOF 恢复。
事务
Redis事务的本质是:一组命令的集合。一个事务中的所有命令都会被序列化
,在事务的执行过程中会按照顺序执行。
Redis事务没有隔离级别的概念。
所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会被执行 EXEC
.
Redis 单条命令具有原子性,但是事务不保证原子性。
Redis事务的三个阶段
- 开启事务
MULTI
- 命令入队
- 执行事务
EXEC
Redis事务的相关命令:
- MULTI:开启事务
- EXEC:执行事务
- DISCARD:取消事务
- WATCH:监控,(乐观锁)
- Redis 不支持回滚
- 如果在一个事务中 命令出现错误(编译异常),所有的命令都不会被执行
- 如果在一个事务中 运行错误(语法性错误),那么正确的命令会被执行
Jedis
Jedis 是Redis官方推荐的 java链接开发工具,使用Java操作Redis的中间件。
SpringBoot整合Redis
在SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce
。
- jedis:采用直连,多个线程操作,是不安全的,如果想要避免不安全,使用 jedis pool 连接。
- lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况。
自定义 RedisTemplete
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory
factory) {
// 我们为了自己开发方便,一般直接使用 <String, Object>
RedisTemplate<String, Object> template = new RedisTemplate<String,
Object>();
template.setConnectionFactory(factory);
// Json序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// String 的序列化
StringRedisSerializer stringRedisSerializer = new
StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
文章学习自:
- Redis面试题(2020最新版)
- b站 狂神视频
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。