Redis 学习之 Redis 概述及原理、基本操作及持久化
一、Redis 介绍
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线等附加功能。
什么是 Redis?:Redis使用场景,手操项目架构实战
腾讯认证 T9 后端开发岗位,linux 服务器开发高级架构师学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师
c/c++linux 服务器开发高级架构师学习路线大纲:学习路线导图,学习视频点击上方免费学习链接。
二、Redis 使用场景
存储缓存、投票、会话 session、排行榜、计数器、发布订阅、消息队列等,其中最主要的使用场景就是存储缓存和会话 Session。
当用作存储缓存的时候,如下图所示:
第一次访问的时候 Redis 数据库没有数据,因此先从 MySQL 中查询,然后再存到 Redis 内存数据库;第二次访问的时候直接就可以从 Redis 数据库中得到数据。
当 Redis 用作缓存会话 Session 时。如下图所示:
所有应用都是对 Redis 进行访问,这样分布式的应用程序共享一份会话 Session。
三、快速安装
Redis3.0 以前》不支持集群》基于客户端实现
Redis3.0 以后》集群(Redis Cluster)》基于服务端实现 Redis 的安装很简单,如下所示:
关于安装的详细步骤可以参考(Mac 版本,Linux 上的安装步骤一致):Mac 下安装 Redis 及 Redis Desktop Manager
其余多种模式的部署请参考:Redis 学习之 4 种模式实践及机制解析(单机、主从、哨兵、集群)
Redis 安装目录下常见文件如下:
四、通讯原理概述
Redis 的速度是很快的,基于以下原因:
Redis 是单进程单线程运行,因此不存在线程切换造成的资源浪费(但是也是缺点,如果命令执行缓慢就会造成阻塞);
Redis 数据是是安装在硬盘上,但是运行数据是在内存中,访问速度远大于硬盘,避免大量 IO。
Redis 服务器是基于高效的 IO 多路复用,效率高。
Redis 服务器是一个事件驱动程序, 服务器处理的事件分为时间事件和文件事件两类。
文件事件:Redis 主进程中,主要处理客户端的连接请求与相应。
时间事件:fork 出的子进程中,处理如 AOF 持久化任务等。
由于 Redis 的文件事件是单进程,单线程模型,但是确保持着优秀的吞吐量,IO 多路复用起到了主要作用。简单解释多路复用就是一个线程监听多个套接字,谁先有读写事件就处理谁,减少线程切换开销和 IO 阻塞,以提高 CPU 利用率。
Redis 访问过程如下:
I/O 多路复用展示:
上面提过,Redis 是基于 I/O 多路复用,然后用 C 实现的。当接收到请求后,也说过 Redis 服务器是个事件驱动程序,然后 Redis 的文件事件分派器就会一直轮询,C 源码就是方法 aeMain()方法内部一直轮询,然后调用 aeProcessEvents(),这个方法就是去调用事件处理器,适配具体的 handler(连接应答处理器、命令请求处理器),在适配 handler 过程中会调用 acApiPoll()方法进行系统的适配(Windows、Linux 等),然后 Linux 中调用的是 ae_epoll.c 文件,也就是这样的过程基于事件实现 IO 多路复用,效率是很高的。
C/C++Linux 服务器开发高级架构师学习视频 点击 linux服务器学习资料 获取,内容知识点包括 Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux 内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK 等等。
腾讯认证 T9 后端开发岗位,linux 服务器开发高级架构师系统学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师
五、Redis 日常操作
Redis 有五种数据类型,为:字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)。关于五种数据类型以及作用请参考:Redis 学习之 5 种数据类型操作、实现原理及应用场景
五种数据常见操作如下:
1、字符串
字符串类型:实际上可以是字符串(包括 XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过 512MB。
2、Hash 类型
哈希 hash 是一个 string 类型的 field 和 value 的映射表,hash 特适合用于存储对象,如:
3、List 集合
用来存储多个有序的字符串,一个列表最多可存 2 的 32 次方减 1 个元素。
4、Set 集合
常用于用户标签,社交,查询有共同兴趣爱好的人,智能推荐。保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存 2 的 32 次方减 1 个元素,除了支持增删改查,还支持集合交集、并集、差集;
5、有序集合 ZSET
常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员
6、Redis 全局命令
7、redis 数据库管理
六、Redis 持久化
持久化作用:redis 是一个支持持久化的内存数据库,也就是说 redis 需要经常将内存中的数据同步到磁盘来保证持久化,持久化可以避免因进程退出而造成数据丢失。Redis 持久化有两种方式:RDB 快照和 AOF 方式。
1、RDB
RDB 持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发手动触发有 save 和 bgsave 两命令:
save 命令:阻塞当前 Redis,直到 RDB 持久化过程完成为止,若内存实例比较大会造成长时间阻塞,线上环境不建议用它
bgsave 命令:redis 进程执行 fork 操作创建子线程,由子线程完成持久化,阻塞时间很短(微秒级),是 save 的优化,在执行 redis-cli shutdown 关闭 redis 服务时,如果没有开启 AOF 持久化,自动执行 bgsave;
1.1、Save 命令
由于 save 命令是同步命令,会占用 Redis 的主进程。若 Redis 数据非常多时,save 命令执行速度会非常慢,阻塞所有客户端的请求。
因此很少在生产环境直接使用 SAVE 命令,可以使用 BGSAVE 命令代替。如果在 BGSAVE 命令的保存数据的子进程发生错误的时,用 SAVE 命令保存最新的数据是最后的手段。如图所示:
1.2、Bgsave 命令
bgsave 命令执行一个异步操作,以 RDB 文件的方式保存所有数据的快照。如:
如图所示:
1.3、save 与 bgsave 对比
操作:
1.4、RDB 优缺点
RDB 优点:
压缩后的二进制文,适用于备份、全量复制,用于灾难恢复加载 RDB 恢复数据远快于 AOF 方式
与 AOF 相比,在恢复大的数据集的时候,RDB 方式会更快一些。
使用 bgsave 保存,交由子进程进行快照保存,父进程不需要再做其他 IO 操作,所以 RDB 持久化方式可以最大化 redis 的性能。
RDB 缺点:
无法做到实时持久化,每次都要创建子进程,频繁操作成本过高
保存后的二进制文件,存在老版本不兼容新版本 rdb 文件的问题
2、AOF
快照功能(RDB)并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。 从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。 打开 AOF 后, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
三种策略 always、everysec、no 对比
always: 不丢失数据 IO 开销大,一般 SATA 磁盘只有几百 TPS 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
everysec 每秒进行与 fsync:最多丢失 1 秒数据 可能丢失 1 秒数据 每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
no 不用管 不可控 从不 fsync :将数据交给操作系统来处理,由操作系统来决定什么时候同步数据。更快,也更不安全的选择。
AOF 的优点:
使用 AOF 会让你的 Redis 更加耐久: 你可以使用不同的 fsync 策略:无 fsync,每秒 fsync,每次写的时候 fsync。使用默认的每秒 fsync 策略,Redis 的性能依然很好(fsync 是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失 1 秒的数据。
AOF 文件是一个只进行追加的日志文件,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用 redis-check-aof 工具修复这些问题。
Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。
AOF 的缺点:
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)
评论