rdb

天天在用Redis,那你对Redis的AOF持久化到底了解多少呢?

无人久伴 提交于 2020-08-07 19:09:31
为什么需要持久化,以及Redis持久化的RDB方式在这篇文章讲的已经很透彻了,足以吊打面试官了。而且此篇内容需要RDB文章的内容支持,所以建议先看下:看完这篇还不懂Redis的RDB持久化,你们来打我! 一、什么是AOF 它也是Redis持久化的重要手段之一,aof->Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事。 二、优缺点 1、优点 持久化的速度快,因为每次都只是追加,rdb每次都全量持久化 数据相对更可靠,丢失少,因可以配置每秒持久化、每个命令执行完就持久化 2、缺点 灾难性恢复的时候过慢,因为aof每次都只追加原命令,导致aof文件过大,但是后面会rewrite,但是相对于rdb也是慢的。 会对主进程对外提供请求的效率造成影响,接收请求、处理请求、写aof文件这三步是串行原子执行的。而非异步多线程执行的。Redis单线程! 三、AOF原理 1、基础原理 就是每次都在aof文件后面追加命令。他与主进程收到请求、处理请求是串行化的,而非异步并行的。图示如下 在这里插入图片描述 所以aof的频率高的话绝逼会对Redis带来性能影响,因为每次都是刷盘操作。跟mysql一样了。Redis每次都是先将命令放到缓冲区,然后根据具体策略(每秒/每条指令/缓冲区满)进行刷盘操作

使用Redis Data Reveal(rdr)查看Redis中key占用内存空间

﹥>﹥吖頭↗ 提交于 2020-08-07 15:14:32
项目响应速度要求比较高,全部使用Redis缓存这也导致缓存。需要分析各种键占用内存情况进行优化。 redisclient虽然可以很方便的对redis进行操作,但不能查看对应key占用的内存情况,也无法对占用内存的key进行统计分析。我简单的了解一下市面上的可以查看redis中的key的占用的开源中间件,最后决定用Redis Data Reveal(RDR)查看系统中key的占用情况(RDR是雪球公司参考了 redis-rdb-tool 开源项目开发的一个可视化中间件,据说性能略高于redis-rdb-tool) 1.github上下载对应安装包, xueqiu/rdr下载地址 2.下载好的rdr软件及rdb数据文件 若按默认配置,dump.rdb存放位置是不固定的,而是存放在启动redis时的当前目录 3.输入运行命令 .\rdr-windows.exe show -p 924 dump.rdb .\rdr-windows.exe show -p 端口号 持久化数据文件.rdb 4.访问url,查看报表输出 本地浏览器输入127.0.0.1:端口号即可查看redis数据文件做的报表分析结果 来源: oschina 链接: https://my.oschina.net/u/4360121/blog/4331388

Redis内存

半腔热情 提交于 2020-08-07 14:56:13
Redis内存消耗:自身内存 + 对象内存 + 缓冲内存 + 内存碎片 自身内存:Redis进程自身内存占用量很小,大约在3.8M左右。 对象内存:sizeof(keys) + sizeof(values),键和值的内存都需要关注 缓冲内存:主要包括客户端缓冲、复制积压缓冲区、AOF缓冲区 客户端缓冲:指所有接入到Redis服务器TCP连接的输入输出缓冲,超过1G会自动断开 复制积压缓冲区:用于实现部分复制功能补救措施的缓冲区 AOF缓冲区:Redis重写期间保存最近的写入命令,消耗内存取决于AOF重写时间及写入命令量 内存碎片:Redis默认使用jemalloc分配器、可选glibc、tcmalloc,为了更好的管理和复用内存,一般采用内存块进行分配,通常采用数据对齐或安全重启处理内存碎片超标情况 子进程内存消耗:子进程fork后与父进程享有同一物理内存,AOF/RDB期间父进程处理写请求时会复制出请求的页副本进行写操作,子进程依然读取父进程快照 Redis fork期间产生的子进程需要消耗的内存由持久化期间写入命令量决定 设置sysctl vm.overcommit_memory = 1允许内存分配所有的物理内存 排查当前系统是否支持THP,防止copy-on-write期间内存过度消耗 来源: oschina 链接: https://my.oschina.net/u

Redis简介

自闭症网瘾萝莉.ら 提交于 2020-08-06 08:04:07
什么是Redis? 概述: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。 免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库! Redis能干嘛? 内存存储,持久化,内存中是断电既失,所以持久化很重要(rdb,aof) 效率高,可以用于高速缓存 发布订阅系统 地图信息分析 计时器,计数器(浏览量) Redis特性 多样的数据类型 持久化 集群 事务 .... Redis相关 官网: https://redis.io/ 中文网: http://www.redis.cn/ 下载地址: linux链接 来源: oschina 链接: https://my.oschina.net/u/4345306/blog/4279629

Redis入门实战(1)-简介

久未见 提交于 2020-08-05 08:15:11
Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写、高性能的key-value数据库,是当前使用最广泛的NoSQL之一。 1、简介 Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询,bitmaps,hyperloglogs和地理空间(geospatial) 索引半径查询。 Redis内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。 2、模式 2.1、单机模式 该模式只安装一个节点,一般用于测试学习。 2.2、主从模式 主节点处理写请求,从节点处理都请求;可以达到读写分离、backup等目的。 2.3、哨兵模式 为了保证redis的高可用,哨兵模式在组从模式的基础上引入哨兵(Sentinel)来管理Redis的主从节点:

【PHP+nginx+php-fpm】的运行机制和原理

牧云@^-^@ 提交于 2020-08-05 03:52:05
1、PHP+nginx+php-fpm的运行机制和原理 Nginx 是非阻塞IO & IO复用模型,通过操作系统提供的类似 epoll 的功能,可以在一个线程里处理多个客户端的请求。(非阻塞,无需等待返回) Nginx 的进程就是线程,即每个进程里只有一个线程,但这一个线程可以服务多个客户端。 PHP-FPM 是阻塞的单线程模型,pm.max_children 指定的是最大的进程数量,pm.max_requests 指定的是每个进程处理多少个请求后重启(因为 PHP 偶尔会有内存泄漏,所以需要重启). PHP-FPM 的每个进程也只有一个线程,但是一个进程同时只能服务一个客户端。(阻塞,需等待PHP返回结果) 大多数的 Linux 程序都倾向于使用进程而不是线程,因为 Linux 下相对来说创建进程的开销比较小,而 Linux 的线程功能又不是很强大。 总结: 1、nginx和php-fpm都是多进程,一个进程只有一个线程; 2、nginx一个线程是非阻塞/io多路复用/epoll模型,将请求分发后无需等待,仅监听回调结果 3、php-fpm一个线程是阻塞模型,必须等待该客户端请求php服务端返回数据,下一个nginx发过来的请求才能被受理 4、PHP本身是单进程单线程的,它只是脚本语言。 5、关于redis:redis是单进程单线程模型,它也是非阻塞、I/o多路复用

4.docker学习笔记之入门,redis主从持久化

北城余情 提交于 2020-08-05 00:05:15
持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘。 当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。Redis持久化分为RDB持久化和AOF持久化,前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘。 RDB RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据。 ,触发 RDB 持久化过程分为手动触发和自动触发。 手动触发分别对应 save 和 bgsave 命令: save 命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。 bgsave 命令:Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。 显然 bgsave 命令是针对 save 阻塞问题做的优化。因此 Redis 内部所有的涉及 RDB 的操作都采用 bgsave 的方式 除了执行命令手动触发之外,Redis

深入学习Redis(2):持久化

淺唱寂寞╮ 提交于 2020-08-04 20:15:37
前言 在上一篇文章中,介绍了 Redis的内存模型 ,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题;然后详细介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案;在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时介绍持久化实现的一些原理细节及需要注意的问题。最后,介绍在实际使用中,持久化方案的选择,以及经常遇到的问题等。 系列文章 深入学习Redis(1):Redis内存模型 深入学习Redis(2):持久化 深入学习Redis(3):主从复制 深入学习Redis(4):哨兵 深入学习Redis(5):集群 目录 一、Redis高可用概述 二、Redis持久化概述 三、RDB持久化 1. 触发条件 2. 执行流程 3. RDB文件 4. 启动时加载 5. RDB常用配置总结 四、AOF持久化 1. 开启 AOF 2. 执行流程 3. 启动时加载 4. AOF常用配置总结 五、方案选择与常见问题 1. RDB和 AOF的优缺点 2. 持久化策略选择 3. fork阻塞: CPU的阻塞 4.AOF追加阻塞:硬盘的阻塞 5. info命令与持久化 六、总结 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。

Redis事务的实现原理

早过忘川 提交于 2020-08-04 11:22:58
Redis通过 MULTI 、 EXEC 、 WATCH 、 DISCARD 等命令来实现事务功能。主要有以下三个阶段: 事务开始 MULTI 命令的执行,标识着一个事务的开始。 MULTI 命令会将客户端状态的 flags 属性中打开 REDIS_MULTI 标识来完成的。 命令入队 当一个客户端切换到事务状态之后(java 框架项目www.1b23.com),服务器会根据这个客户端发送来的命令来执行不同的操作。如果客户端发送的命令为 MULTI 、 EXEC 、 WATCH 、 DISCARD 中的一个,立即执行这个命令,否则将命令放入一个事务队列里面,然后向客户端返回 QUEUED 回复 Redis客户端拥有自己的事务状态 typedef struct client { // ...... // 事务状态(MULTI或者EXEC) multiState mstate; // ...... } client; 事务状态包含一个事务队列 typedef struct multiState { // 事务队列,FIFO multiCmd *commands; // 已入队命令计数 int count; // ...... } multiState; 事务队列中multiCmd类型保存了一个已入队命令的相关信息 typedef struct multiCmd { // 参数 robj

bgsave 的原理?

夙愿已清 提交于 2020-08-04 09:48:39
① 执行 bgsave 命令,Redis 父进程判断当前是否存在正在执行的子进程,如 RDB/AOF 子进程,如果存在 bgsave 命令直接返回。 ② 父进程执行 fork 操作创建子进程,fork 操作过程中父进程会阻塞。 ③ 父进程 fork 完成后,bgsave 命令返回并不再阻塞父进程,可以继续响应其他命令。 ④ 子进程创建 RDB 文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。 ⑤ 进程发送信号给父进程表示完成,父进程更新统计信息。 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/4462050