首页 > 数据库 >redis持久化操作【随记】

redis持久化操作【随记】

时间:2024-06-22 17:01:59浏览次数:22  
标签:aof 持久 文件 redis rdb save 随记

持久化

Redis它是将数据保存到内存当中,内存里的数据最大特点: 断电易失.保存在内存的数据就没有了.如果如果这些数据还有用,业务使用啥的,不能就让它这么没有了.

redis当中提供持久化机制, 说白了,将内存的数据 —-> 写入到磁盘. –> 持久化.

1 rdb方式

redis database, 持久化机制.

相当在内存做了一快照.

################################ SNAPSHOTTING  ################################
 364 
 365 # Save the DB to disk.
 366 #
 367 # save <seconds> <changes>
 368 #
 369 # Redis will save the DB if both the given number of seconds and the given
 370 # number of write operations against the DB occurred.
 371 #
 372 # Snapshotting can be completely disabled with a single empty string argument
 373 # as in following example:
 374 #
 375 # save ""
 376 #
 377 # Unless specified otherwise, by default Redis will save the DB:
 378 #   * After 3600 seconds (an hour) if at least 1 key changed
 379 #   * After 300 seconds (5 minutes) if at least 100 keys changed
 380 #   * After 60 seconds if at least 10000 keys changed
 381 #
 382 # You can set these explicitly by uncommenting the three following lines.
 383 #
 384  save 3600 1
 385  save 300 100
 386  save 60 10000

配置一下文件名称: dbfilename 6379.rdb –> 建议修改成6379, 因为之后会启动多台服务器

配置一下持久化的文件目录: dir ./ –> 可以修改成你自己喜欢的目录

1.2 触发rdb持久化的条件有哪些?

  1. 满足咱们配置的持久化条件

    ==当满足触发rdb的条件的时候,默认会使用: bgsave的姿势进行持久化.==

     384  save 3600 1
     385  save 300 100
     386  save 60 10000
  2. 执行bgsave也会触发持久化

    不会阻塞当前的线程, 当前的其它客户端咱们redis依然能处理.

  1. 正常关机

通过shutdown, 执行正常关闭Redis服务, 也会触发Redis操作.这里使用的是: save的方式.

  1. 执行save也会发生持久化

执行的时候,是阻塞式,也就是说我在落盘的时候,会阻塞当前的redis线程.其它的客户在我持久化过程当中,是不能使用reids的.

如果我执行: save之后, 持久化时间花30秒,在这30秒之内,reids是无法处理其它客户端请求的. –> 阻塞式.

  1. 执行flushdb也会触发

总结一下:

  • bgsave

    • copy on write

    • fork(), 创建子进程

    • 这两东西都是内核提供提供的机制.

  • 配置的save当满足条件了,执行的也是bgsave持久化方式.

redis正常启动的时候,会从默认的 rdb目录加载6379.rdb文件, 将数据恢复到内存当中.

恢复的速度,非常的快,因为rdb是二进制存储的.

rdb持久化操作的缺点:

  • 无法保证数据安全

    • 没有办示确保内存数据会一定落盘到磁盘.它可能会丢失一个时间段之内的所有数据.

  • 它不支持拉链存储

    • 最终存储数据只有一个6379.rdb文件,之前被覆盖,之后的行为会覆盖掉当前的数据.

    • 如果想要某个时间段的,只有手动备份.

2 aof

append only file.采用记录日志的姿势来存储数据.日志写在文件当中,这样丢失少一些,同样,存储的是文本, 恢复速度慢.

需要我们进行配置的:

  • appendonly no –> appendonly yes, 表示开启aof

  • appendfilename "6379.aof", 保存到磁盘上的文件名称.

aof持久化策略配置:

  • 将内存的数据写入到aof文件的时机.

    • no, 表示由操作系统决定啥时候写入.

    • always, 表示如果有key发生更改,就写入.

    • everysec, 表示一秒钟写入一次.

1269 # no: don't fsync, just let the OS flush the data when it wants. Faster.
1270 # always: fsync after every write to the append only log. Slow, Safest.
1271 # everysec: fsync only one time every second. Compromise.
​
1286 # appendfsync always
1287 appendfsync everysec
1288 # appendfsync no

默认的aof文件的保存位置,是在配置文件当中的dir目录配置的.

我们这里配置的是: dir '/usr/local/yyds2305/redis-6.2.13/redis-rdb-aof/' 目录.

*2
$6
SELECT
$1
0
*3
$3
SET
$3
age
$2
26
​
# aof文件内容,是上边的样子.

2.1 重写机制

bgrewriteaof, 会合并记录的日志6379.aof文件当中,合并重复的命令,合并相互抵消的命令.

  • 对这个日志何种进行减少.

  • aof恢复记录的方式, 是将日志文件,一条接一条执行一遍. 如果日志条数太多了,则恢复速度肯定会被拖慢.

1328 auto-aof-rewrite-percentage 100 # 1倍的大小,再次触发bgrewriteaof
1329 auto-aof-rewrite-min-size 64mb # aof文件的默认大小,到达了64MB, 触发bgrewriteaof. 重写机制

对于aof持久化的总结:

  1. 基于文本文件的持久化机制.「命令都存储了文件当中.」

  2. 重写机制

    1. 4.x之后redis才有的.

    2. bgrewriteaof, 它会将6379.aof文件当中的重复命令,可以相互抵消的命令合并.

      1. 6379.aof文件的体积会减小

      2. 使用6379.aof文件恢复数据的时候,命令数减少了,这样的恢复速度也快一些.「依然要比恢复rdb文件慢.」

      3. 重写触发条件: 配置项

        auto-aof-rewrite-percentage 100
        auto-aof-rewrite-min-size 64mb
  1. 配置项

  2. 从内存 —> 内核缓冲区 –> 磁盘文件

    1. 它并不是每一秒都将文件写到磁盘上.这样的话,磁盘I/O太高.

    2. 从内核缓冲区 –> 磁盘文件

2.2 rdb + aof 混合体

rdb: 基于二进制的,恢复速度快,但是丢失数据比较多.

aof: 基于文件存储,恢复速度慢, 但是丢失数据比较少.

能不能, 让两者结合下,既要rdb快,也要aof丢失数据量,还要文件何种减少.

开启混合体的配置项:

  • 开启aof

  • 开启rdb

  • 开启混全开关

# When loading, Redis recognizes that the AOF file starts with the "REDIS"
# string and loads the prefixed RDB file, then continues loading the AOF
# tail.
aof-use-rdb-preamble no --> yes, 这个就表示开启混合模式. 默认就是开启的.

基本流程:

  • 同时开启rdb + aof , 在配置文件当中进行配置.

  • 开启配置项: aof-use-rdb-preamble yes


生成的文件

  • 会同时生成rdb和aof文件.

  • rdb二进制的文件, aof文本文件.

  • 如果执行了: bgrewriteaof, 可以这么理解: 将rdb文件的内容覆盖掉aof文件.此时rdb文件和aof文件,文件大小一样,保存的内容也是一样的,同时此时的aof文件也保存的是二进制的内容.

  • 在这之后,如果再次发了写操作,此时,命令会以日志的文件追加到aof文件,此时aof文件是一个rdb内容 + aof 的混合体.


从硬盘恢复数据:

  • 如果开启了混合模式,则恢复的时候,只恢复aof文件.

如果命令当中执行了: flushdb/flushall,此时咱们可以打开aof文件,将这个命令行删除掉, 然后重启redis服务.

数据不会丢失.也不会被删除.

如果执行完bgrewriteaof之后,此时aof文件,会变成二进制文件.此时就没有办法了.

 

标签:aof,持久,文件,redis,rdb,save,随记
From: https://blog.csdn.net/weixin_64296810/article/details/139855141

相关文章

  • 可持久化Trie
    更好的体验带注释的代码开始理解可持久化,这里因为是acwing打卡,可以放图片了有可能会用图片,尽量打字可持久化trie,就是一个trie树但是可以通过不同的开头(root),变成每个历史状态这里就用到上面的图片了,每次更新trie树,这条新加入的链一定要......
  • 深入解析Redis:从基础到高可用性
    引言在现代应用程序中,数据的高性能、高可用性和一致性至关重要。Redis作为一种开源的内存数据结构存储,不仅提供了极快的读写速度,还支持多种数据结构和高可用性机制。本文将深入探讨Redis的基础知识、关键特性、常见应用场景以及其高可用性机制——主从复制和哨兵。Redis简介......
  • 基于Redis和openresty实现高并发缓存架构
    目录概述缓存架构设计实践代码路由业务封装redis效果概述  本文是对项目中QPS高并发相关问题的一种解决方案,利用Nginx与Redis的高并发、超低延迟响应,结合Canal进行实现。openrestry官网  当程序需要提供较高的并发访问时,往往需要在程序中引入缓存......
  • 三生随记——诡异的牙线
    在小镇的角落,坐落着一间古老的牙医诊所。这所诊所早已荒废多年,窗户上爬满了藤蔓,门板上的油漆斑驳脱落,仿佛诉说着无尽的沉寂与孤独。然而,在午夜时分,偶尔会有低沉的呻吟声从紧闭的诊所里传出,让路过的人毛骨悚然。镇上流传着一个关于这所诊所的恐怖传说:诊所里住着一个被诅咒......
  • 一对一聊天源码,你是否了解ERedis的扩容机制?
    一对一聊天源码,你是否了解ERedis的扩容机制?Redis的扩容时机Redis会在如下两种情况触发扩容。1、如果没有fork子进程在执行RDB或者AOF的持久化,一旦满足ht[0].used>=ht[0].size,此时触发扩容;2、如果有fork子进程在执行RDB或者AOF的持久化时,则需要满足ht[0].used>5*ht......
  • Redis项目实战——黑马点评(优惠卷秒杀部分)
    优惠券秒杀4.1全局唯一ID思路每个店铺都可以发布优惠券:当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题:id的规律性太明显受单表数据量的限制场景分析:如果我们的id具有太明显的规则,用户或者说商业对手很容易猜测出......
  • SpringBoot+AOP+Redis自定义注解实现防重复提交
    1.哪些因素会引起重复提交?开发项目过程中可能会出现下面这些情况:前端下单按钮重复点击导致订单创建多次网速等原因造成页面卡顿,用户重复刷新提交请求黑客或恶意用户使用Postman等http工具重复恶意提交表单2.重复提交会带来哪些问题?重复提交带来的问题:会导致数据......
  • Redis 分布式锁
    Redis分布式锁分布式锁的演变本地锁(单机用)利用redis进行分布式锁使用set防止死锁加过期时间使用setnx防止A请求未执行完锁过期删除B请求加锁后A完成后误删该锁使用Hash结构,规定每个请求只能删除自己的锁保证并发安全,申请锁和加过期时间需要原子性,用lua脚本......
  • redisson WRONGPASS invalid username-password pair or user is disable
    1、技术架构:若依微服务框架<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version></dependency><dependency>......
  • redis自学(47)服务端优化
    持久化配置Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:①用来做缓存的redis实例尽量不要开启持久化功能②建议关闭RDB持久化功能,使用AOF持久化(RDB的数据安全性一直是有问题的,两次RDB的时间比较长,又不能频繁的RDB,因为耗时久而且需......