Redis 持久化,为什么,必须要持久化,不就一个cache吗?

鉴于很多企业对于 REDIS  MONGODB 的不重视,所以才有了这样的文字,REDIS 很多企业都在用,但用的好不好,估计也只有自己知道,没有密码,监听地址乱写,或者没有持久化,或持久化了也不知道持久化了,这样的情况不少。

今天的说说持久化的问题,Redis 有两种持久化的文件 RDB 和 AOF 文件,而这两种文件到底起到什么作用,估计没有DBA 的单位正在使用REDIS 的这个问题可能不是很清楚,这里就说说REDIS 的 AOF  ,RDB 文件。

1  RDB 文件,RDB 文件主要是为了进行REDIS 备份和恢复而进行的,某些应用场景REDIS 存储的数据并不是可以进行丢弃的,例如缓存,有些数据的变动是要刷入到数据库中并不是单纯为了提高性能而进行的静态读取,而如果REDIS CRASH 后,这些数据并没有和传统数据库进行交互和落盘。那数据就丢失了,这样的情况是不能被允许的,所以当整个系统崩溃,或者需要将当时的一部分数据在另外的REDIS进行恢复,则RDB 文件就是最好的恢复方式方法。RDB 文件本身是一个紧凑单一的文件,很容易被传递,另外RDB的文件保存机制也使得保存数据文件消耗的系统资源比较低。

  • Redis 调用forks. 同时拥有父进程和子进程。

  • 子进程将数据集写入到一个临时 RDB 文件中。

  • 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

2  AOF 文件,AOF 文件与RDB 文件相比不同的是AOF 文件并不是一个snapshot 的概念, 他是一个 append 的概念,文件的信息会直接添加到文件的末尾,当然这的方式比上面的RDB文件的好处就是,通过调整数据的刷新方式,是可以做到数据不丢失的,但不利的地方,即使随着保证数据不丢失的等级升高,对REDIS 本身的性能影响就会越突出。并且AOF 文件是在系统重启动,或者CRASH 后,在启动REDIS后对系统数据进行恢复的一种方式。

所以针对上面的量的RDB文件和AOF 文件的不同,两种文件的使用的方式和针对REDIS 所承担的任务不同,就会有一个性能和安全性的衡量。

1 如果你的REDIS 仅仅是从事只读的,并且分担读压力的缓冲层,则可以不使用任何的持久化,因为即使你的REDIS CRASH 了,顶多就是在一次启动REDIS 后开始读取,传统数据库,或通过其他方式将将数据填满,所以可以不涉及持久化

2  如果你的REDIS 是从事写缓冲的工作,例如经常更新数据,所以在REDIS中进行了数据的更新,在多次的运算和更新后,将最后的结果刷入到传统的数据库中,这的确是一个解决高并发,更新值,降低传统数据库负担的方式,例如你一分钟更新上百次或上千次的值的情况下,这样的情况下,你是需要将 RDB 文件和 AOF 文件都开启的,并且随着你的应用逻辑和 你容忍数据可能丢失度的降低,你的RDB 文件和 AOF 文件的保存方式等级都会提高,例如 RDB 文件

你是否需要提高下面的RDB 文件的刷新率  ,根据刷新的频率,调整

例如如果写入的在5秒就有10000次,则不需要调整,如果60秒内写入9999次,则需要调整一下  save 60 10000  变为 save  60 5000  

这样RDB 的flush file的频率就会提高,满足你的需求。另外在你CTRL + C 终止REDIS 的情况下(Redis  并未在有),会强制先将数据刷入到 RDB 文件,否则除非你 KILL 否则是无法关闭 REDIS的。

AOF 文件,默认是关闭的,需要打开,并且默认是每秒来进行与磁盘的交互

所以在双重的RDB 和AOF 文件的加持下,在这样的业务场景下,数据安全是有保证的,如果还想严格的不丢失数据,则需要将上图的设置调整为 appendfsync always 打开,则任何的操作都会记录在 appendonly.aof 文件中。

随着REDIS 写入的数据的增加,需要文件的分割,rewrite是aof的一个机制,用来压缩aof文件,通过fork一个子进程,重新写一个新的aof文件,该次重写不是读取旧的aof文件进行复制,而是将读取内存中的redis数据库,重写一份aof文件,有点类似于rdb的快照方式;

触发机制为:

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

当文件大小,达到旧的aof文件大小的2倍的情况下,并且文件达到64MB的情况下,重写机制就会启动。

在重启动时如何处理有错的aof

aof-load-truncated yes

文件重写策略

aof-rewrite-incremental-fsync yes

所以REDIS 的持久化可以根据REDIS在系统中所承担的作用来设置,如果是只读作为读缓冲,则可以不需要进行持久化的操作,可以将RDB AOF 文件关闭,已达到最好的效果,当然你的程序也需要考虑在 REDIS CRASH 后的数据重新刷入,否则会引起缓存雪崩,导致你的实体数据库 MYSQL  ORACLE ,POSTGRESQL SQL SERVER 等数据库无法承受短期的高频的数据读取,而不再有响应。

要不就需要设置 RDB, AOF 文件,在某些应用场景下,防止丢失数据,或者引起缓冲击穿后的雪崩问题。

建议如果没有特殊的要求,需要打开 RDB AOF 持久化,这样REDIS 好, 传统数据库好,你好我好,大家好。


<think>嗯,用户想了解如何通过RedisTemplate实现Redis的数据持久化。首先,我需要回忆一下Redis持久化机制。Redis主要有两种持久化方式:RDB和AOF,还有混合持久化。RDB是生成快照,AOF记录每个写操作。混合持久化结合两者,重启时用RDB和AOF来恢复数据。 接下来,用户提到使用RedisTemplate,所以需要结合Spring Boot的配置。记得在Spring Boot中,通常通过配置文件application.yml来设置Redis的连接信息,比如host、port、password,还有持久化相关的配置,比如aof-use-rdb-preamble是否开启混合持久化过,RedisTemplate本身是客户端工具,持久化配置主要在Redis服务器端设置,但客户端需要正确配置连接池等参数以确保数据正确写入。 然后,用户需要具体的配置示例。我应该先展示pom依赖,引入spring-boot-starter-data-redis。然后是application.yml中的配置,包括Redis服务器地址、连接池参数,可能还要设置lettuce.pool相关参数。此外,如果需要启用AOF,应该在Redis服务器的配置文件redis.conf中设置appendonly yes,但用户可能想知道如何在Spring Boot中关联这些配置。需要说明的是,应用层的配置主要是连接服务器,而持久化策略需要在Redis服务端配置。 接下来是RedisTemplate的使用。需要配置RedisTemplate的序列化方式,默认的JDK序列化可读性差,通常建议使用StringRedisSerializer,或者JSON序列化器。添加一个配置类,比如RedisCacheConfig,通过@Bean定义RedisTemplate,并设置key和value的序列化方式。 然后,使用Spring Cache集成Redis,通过注解如@Cacheable、@CachePut、@CacheEvict来管理缓存。这部分虽然属于缓存管理,但也和持久化有关,因为数据写入Redis后,持久化策略会影响数据的恢复。需要给出一个示例,比如UserService中使用这些注解,并展示测试类。 用户可能还会关心数据一致性问题,比如缓存雪崩、穿透、击穿,以及如何保持Redis和MySQL的数据一致性。但问题主要是持久化,所以需要集中在配置和持久化方法上。过,引用中提到的混合持久化Redis 4.0+)可以在重启时更快恢复数据,这点需要提到,并说明在配置文件中如何启用。 需要确保回答中提到的配置步骤正确,比如在application.yml中设置正确的属性,配置类的编写,以及代码示例的正确性。同时,引用相关的参考文献,比如引用[2]和[4]关于持久化方式及混合持久化的内容,以及引用[3]中提到的HyperLogLog,但可能相关,所以主要引用[2]和[4]。 最后,生成相关问题,比如如何选择RDB和AOF,如何保证数据一致性,Redis持久化的问题及解决方案等。这样用户如果有进一步的问题,可以继续参考。</think>### 通过 RedisTemplate 实现 Redis 数据持久化的方法及配置示例 #### 1. Redis 持久化机制概述 Redis 数据持久化主要通过以下两种方式实现: - **RDB (快照持久化)**:定期生成数据快照(默认文件 `dump.rdb`),适合大规模数据恢复,但可能丢失最后一次快照后的数据[^2][^4]。 - **AOF (追加文件持久化)**:记录每个写操作命令,重启时重放命令恢复数据,数据完整性更高,但文件体积较大。 - **混合持久化Redis 4.0+)**:结合 RDB 和 AOF,重启时先加载 RDB 快照,再重放增量 AOF 日志,平衡速度与安全性。 #### 2. Spring Boot 中配置 RedisTemplate ##### 2.1 添加依赖与基础配置 **pom.xml 依赖**: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` **application.yml 配置**: ```yaml spring: redis: host: localhost port: 6379 password: 123456 database: 0 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 # 若需启用 AOF,需在 Redis 服务端配置 appendonly yes ``` ##### 2.2 配置 RedisTemplate 序列化 添加配置类 `RedisCacheConfig.java`,定义序列化方式: ```java @Configuration public class RedisCacheConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // Key 使用字符串序列化 template.setKeySerializer(new StringRedisSerializer()); // Value 使用 JSON 序列化 template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` #### 3. 使用 RedisTemplate 操作数据 通过注入 `RedisTemplate` 实现数据读写: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveData(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object getData(String key) { return redisTemplate.opsForValue().get(key); } ``` #### 4. 结合 Spring Cache 实现缓存持久化 使用注解管理缓存生命周期,数据操作会自动同步到 Redis: ```java @Service public class UserServiceImpl implements UserService { @Cacheable(value = "user", key = "#id") // 优先从缓存读取 public User getUserById(Long id) { return userRepository.findById(id); } @CachePut(value = "user", key = "#user.id") // 更新缓存 public User updateUser(User user) { return userRepository.save(user); } @CacheEvict(value = "user", key = "#id") // 删除缓存 public void deleteUser(Long id) { userRepository.deleteById(id); } } ``` #### 5. Redis 服务端持久化配置 在 Redis 配置文件 `redis.conf` 中启用混合持久化: ```conf appendonly yes # 启用 AOF aof-use-rdb-preamble yes # 启用混合持久化 ``` --- ### 关键注意事项 1. **持久化策略选择**: - 高数据安全性:优先使用 AOF 或混合持久化[^2]。 - 高性能恢复:选择 RDB。 2. **数据一致性**: - 通过 `@CacheEvict` 和事务机制保证缓存与数据库的一致性。 3. **性能优化**: - 调整 AOF 重写频率(`auto-aof-rewrite-percentage`)和 RDB 快照间隔(`save` 配置)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值