首页 > 数据库 >redis持久化

redis持久化

时间:2023-08-29 12:45:44浏览次数:31  
标签:aof 持久 AOF redis 日志 重写

目录

一持久化

1.1 什么是持久化

redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上

1.2 持久化的实现方式

# 数据库(mysql,redis,mongodb,rabbitmq,infludb,clickhose,kafak)--->持久化方法通常是以下两种
    快照:某时某刻数据的一个完成备份,
     -mysql的Dump
     -redis的RDB
    写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
      -mysql的 Binlog
      -Redis的 AOF
# redis支持 :3中方案
	-rdb方案:在某一刻完成备份
    -aof方案:每个操作都会有日志,恢复的时候,把日志重放即可
    -混合持久化:rdb+aof方案
    	-aof重写
        -隔一段时候,会把之前的日志做成rdb文件放在日志文件中,后续的继续使用aof方案记录日志
        -达到快速恢复的目的
        
http://www.taodudu.cc/news/show-5528045.html?action=onClick

二 rdb方案

2.1 使用

# 触发机制-主要三种方式
# save(同步)--->阻塞-->如果数据量很多--->影响redis的查询操作
save

# bgsave(异步,Backgroud saving started)


# 自动(通过配置)
配置   seconds   changes
save   900        1
save   300        10
save   60         10000

如果60s中改变了1w条数据,自动生成rdb
如果300s中改变了10条数据,自动生成rdb
如果900s中改变了1条数据,自动生成rdb

2.2 RDB问题

  • 耗时,耗性能:
  • 不可控,可能会丢失数据

三 AOF

3.1 AOF介绍

客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复

3.2 # AOF的三种策略

日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上
always:redis–>写命令刷新的缓冲区—>每条命令fsync到硬盘—>AOF文件
everysec(默认值):redis——>写命令刷新的缓冲区—>每秒把缓冲区fsync到硬盘–>AOF文件
no:redis——>写命令刷新的缓冲区—>操作系统决定,缓冲区fsync到硬盘–>AOF文件
命令 always everysec no
优点 不丢失数据 每秒一次fsync,丢失1秒数据 不用管
缺点 IO开销大,一般的sata盘只有几百TPS 丢1秒数据 不可控

3.3 AOF 重写

随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题
- 本质就是把过期的,无用的,重复的,可以优化的命令,来优化
- 这样可以减少磁盘占用量,加速恢复速度

实现方式

bgrewriteaof:

客户端向服务端发送bgrewriteaof命令,服务端会起一个fork进程,完成AOF重写

AOF重写配置:

配置名 含义
auto-aof-rewrite-min-size AOF文件重写需要尺寸
auto-aof-rewrite-percentage AOF文件增长率
统计名 含义
aof_current_size AOF当前尺寸(单位:字节)
aof_base_size AOF上次启动和重写的尺寸(单位:字节)

自动触发时机(两个条件同时满足):

aof_current_size>auto-aof-rewrite-min-size:当前尺寸大于重写需要尺寸

(aof_current_size-aof_base_size)/aof_base_size>auto-aof-rewrite-percentage:(增长率)当前尺寸减去上次重写的尺寸,除以上次重写的尺寸如果大于配置中的增长率

重写流程

aof配置

appendonly yes  # 是否开启aof持久化
appendfilename "appendonly.aof"  # 指定 AOF 文件名
# Redis支持三种不同的刷写模式:
# appendfsync always # 每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。
appendfsync everysec # 每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。
# appendfsync no     # 完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。
dir /root/lqz/redis/data  # 配置持久化文件存放位置


appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec 
dir /root/lqz/redis/data

7.3 混合持久化

# 必须先开启AOF,再加入一条配置
aof-use-rdb-preamble yes

标签:aof,持久,AOF,redis,日志,重写
From: https://www.cnblogs.com/zjyao/p/17664448.html

相关文章

  • Redis简介
    文章目录一、Redis是什么?二、Redis优缺点?三、Redis应用场景四、Redis安装和使用五、Redis为什么这么快?1、为什么采用单线程2、Redis的I/O多路复用一、Redis是什么?Redis(RemoteDictionaryServer:远程字典服务)是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于......
  • redis高级用法:慢查询、pipline与事务、发布订阅、bitmap位图、HyperLogLog、GEO地理位
    目录一高级用法之慢查询1.1生命周期1.2两个配置1.2.1slowlog-max-len1.2.2slowlog-max-len1.3设置慢查询1.5作用二pipline与事务2.1什么是pipeline(管道)2.2python客户端实现pipline2.3与原生操作对比2.4使用建议2.5原生redis操作操作事务三发布订阅3.1角色3.2模......
  • redis数据类型和使用命令
    目录一通用命令1.1通用命令1.2数据结构和内部编码1.3单线程架构,二字符串类型2.1字符串键值结构2.2常用命令三hash类型3.1哈希值结构3.2常用命令3.3hashvsstring四列表类型4.1列表特点常用命令五集合类型5.1特点5.2常用命令六有序集合类型6.1特点6.2常用命令......
  • Redis介绍跟安装配置
    目录一redis介绍1.1redis是什么1.2redis的特点二centos上安装redis三redis启动方式3.1最简启动3.2动态参数启动(了解)3.3配置文件启动一redis介绍1.1redis是什么开源:早起版本2w3千行基于键值对的存储系统:字典形式多种数据结构:字符串,hash,列表,集合,有序集合高性能,功......
  • redis客户端操作
    目录一redis客户端操作二redis使用场景一redis客户端操作#客户端链接 redis-cli-h地址-p端口#非交互式的 res=subprocess.getoutput('systemctlstartmysqld')res=subprocess.getoutput('systemctlstopmysqld')res=subprocess.getoutput('redis-clige......
  • redis分布式锁,setnx+lua脚本的java实现 | 京东物流技术团队
    1前言在现在工作中,为保障服务的高可用,应对单点故障、负载量过大等单机部署带来的问题,生产环境常用多机部署。为解决多机房部署导致的数据不一致问题,我们常会选择用分布式锁。目前其他比较常见的实现方案我列举在下面:基于缓存实现分布式锁(本文主要使用redis实现)基于数据库实现分布......
  • Redis常用命令
    目录起因配置bind端口连接开启连接关闭连接命令key相关字符串相关hash相关List相关Set相关SortedSet相关GEO相关服务器命令引用起因从标题来看,似乎这篇博文没有看下去的必要了,谁用redis还敲命令行,不都是GUI嘛。确实,GUI现在特别的好用,直观、高效还美观。但是,在生产环境下GUI可......
  • Redis基础
    1.Redis5种数据类型string(字符串)hash(哈希散列)list(列表)set(集合)zset(sortedset:有序集合)2.对应的基本操作2.1Stringvalue:最大为512Msetnamezhangsangetname2.2hash最多属性字段为2的32次方-1个hmsetuserid:1namezhangsanage1hmgetalluserid:1hmgetu......
  • 基于Redis的队列
    1.队列//发布@ApiOperation(value="put普通队列")@PostMapping("/queuePut")publicObjectput(@RequestBodyCommonMapRespDTOrespDTO){for(inti=0;i<20;i++){//队列RQueue<Object>queue=redissonClient.g......
  • Redis 入门篇
    1.初始Redis1.1认识NoSQL‍NoSql可以翻译做NotOnlySql(不仅仅是SQL),或者是NoSql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库​,因此也称之为非关系型数据库。‍1.1.1结构化与非结构化‍​​1.1.2关系型与非关系型的差异存储方式......