持久化

持久化就是把内存中的数据写到磁盘中,防止服务宕机导致内存数据丢失。

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:监控,(乐观锁)
  1. Redis 不支持回滚
  2. 如果在一个事务中 命令出现错误(编译异常),所有的命令都不会被执行
  3. 如果在一个事务中 运行错误(语法性错误),那么正确的命令会被执行

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;
    }
}

文章学习自:


Z2Min_
7 声望0 粉丝

下一篇 »
vue 命令