redis数据持久化有哪几种(年终Redis总结数据结构)(1)

一. redis 简介

Redis 是一个速度非常快的非关系型数据库(non-relational database)/ NoSQL 数据库。

Redis 不使用表,也不会预定义或者强制去要求用户对 Redis 存储不同的数据进行关联。

Redis 为什么速度非常快?

二. Redis 数据结构

Redis 存储键(key)和 5 种不同类型的值(value)之间的映射。这 5 中类型分别为:

STRING(字符串)、LIST(列表)、HASH(散列)、SET(集合)和 ZSET(有序集合)。

redis数据持久化有哪几种(年终Redis总结数据结构)(2)

1. STRING(字符串)

字符串示例,键为 hello,值为 world:

①. 字符串命令:

redis数据持久化有哪几种(年终Redis总结数据结构)(3)

②. 使用

127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world" 127.0.0.1:6379> del hello (integer) 1 127.0.0.1:6379> get hello (nil)

127.0.0.1:6379> set num 1 OK 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> get num "2"

2. LIST(列表)

list-key 是一个包含 3 个元素的列表键,列表中的元素是可以重复的:

①. 列表命令

redis数据持久化有哪几种(年终Redis总结数据结构)(4)

②. 使用

127.0.0.1:6379> rpush list-key item (integer) 1 127.0.0.1:6379> rpush list-key item2 (integer) 2 127.0.0.1:6379> rpush list-key item (integer) 3 # 返回的列表长度

127.0.0.1:6379> lrange list-key 0 -1 1) "item" 2) "item2" 3) "item" # 使用 0 为范围的开始索引,-1 为范围索引的结束索引,可以去除列表包含的所有元素 127.0.0.1:6379> lindex list-key 1 "item2"

127.0.0.1:6379> lpop list-key "item" 127.0.0.1:6379> lrange list-key 0 -1 1) "item2" 2) "item"

3. HASH(散列)

hash-key 是一个包含两个键值对的散列键:

①. 散列命令

redis数据持久化有哪几种(年终Redis总结数据结构)(5)

②. 使用

127.0.0.1:6379> hset hash-key sub-key1 value1 (integer) 1 127.0.0.1:6379> hset hash-key sub-key2 value2 (integer) 1 127.0.0.1:6379> hset hash-key sub-key1 value2 (integer) 0 127.0.0.1:6379> hgetall hash-key 1) "sub-key1" 2) "value2" 3) "sub-key2" 4) "value2"

127.0.0.1:6379> hdel hash-key sub-key2 (integer) 1 127.0.0.1:6379> hdel hash-key sub-key2 (integer) 0 127.0.0.1:6379> hget hash-key sub-key1 "value2" 127.0.0.1:6379> hgetall hash-key 1) "sub-key1" 2) "value2"

4. SET(集合)

set-key 是一个包含 3 个元素的集合键:

①. 集合命令

redis数据持久化有哪几种(年终Redis总结数据结构)(6)

②. 使用

127.0.0.1:6379> sadd set-key item (integer) 1 127.0.0.1:6379> sadd set-key item2 (integer) 1 127.0.0.1:6379> sadd set-key item3 (integer) 1 127.0.0.1:6379> sadd set-key item (integer) 0 127.0.0.1:6379> smembers set-key 1) "item" 2) "item3" 3) "item2"

127.0.0.1:6379> sismember set-key item4 (integer) 0 127.0.0.1:6379> sismember set-key item (integer) 1

127.0.0.1:6379> srem set-key item (integer) 1 127.0.0.1:6379> srem set-key item (integer) 0 127.0.0.1:6379> smembers set-key 1) "item3" 2) "item2"

5. ZSET(有序集合)

zset-key 是已一个包含 2 个元素的有序集合键:

①. 有序集合命令:

redis数据持久化有哪几种(年终Redis总结数据结构)(7)

②. 使用

127.0.0.1:6379> zadd zset-key 728 member1 (integer) 1 127.0.0.1:6379> zadd zset-key 982 member2 (integer) 1 127.0.0.1:6379> zadd zset-key 982 member2 (integer) 0 127.0.0.1:6379> zrange zset-key 0 -1 withscores 1) "member1" 2) "728" 3) "member2" 4) "982"

127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores 1) "member1" 2) "728"

127.0.0.1:6379> zrem zset-key member1 (integer) 1 127.0.0.1:6379> zrem zset-key member1 (integer) 0 127.0.0.1:6379> zrange zset-key 0 -1 withscores 1) "member2" 2) "982"

三. Redis 与 Memcached

两者都是非关系型内存键值数据库,主要有以下不同:

1. 数据类型

2. 数据持久化

3. 分布式

  1. Redis Cluster 实现了分布式的支持
  2. Memcached 不支持分布式,只能通过在客户端使用一致性哈希来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。

4. 内存管理机制

5. 线程模型

四. Redis持久化

Redis 是内存型数据库,为了保证数据断电后不丢失,需要将内存中的数据持久化到磁盘上;另一方面,保存中间结果,不必重新计算。

持久化有 2 种:

Redis 提供的持久化配置选项:

# 快照持久化 save 60 1000 stop-writes-on-bgsave-error yes rdbcompression no # AOF 持久化 appendonly yes appendfsync always # 同步选项 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 共享选项,决定了快照文件和 AOF 文件的保存位置 dir ./

1. 快照持久化

快照持久化是通过创建快照来获得 Redis 存储在内存中数据在某个时间点上的副本。在创建快照后,用户可对快照备份,可将快照留在原地以便重启 Redis 时使用。

①. 快照持久化配置

save 60 10000 # 在60秒(1分钟)之后,如果至少有10000个键发生变化,Redis 就会自动触发 BGSAVE 命令创建快照。 stop-writes-on-bgsave-error yes # 表示备份进程出错的时候,主进程就停止接收新的写入操作,是为了保护持久化数据的一致性。 rdbcompression no # RDB 的压缩设置为 no,因为压缩会占用更多的 CPU 资源。

②. 创建快照的方法

save 60 10000 # 从 redis 最近一次创建快照之后算起,满足 “60 s 内 10000 次写入”,Redis 会自动触发 BGSAVE 命令

③. 存在的问题

2. AOF 持久化

AOF 持久化将被执行的写命令写到 AOF 文件末尾,记录数据发生的变化。Redis 值要从头到尾重新执行一次 AOF

文件包含的所有写命令,就可恢复 AOF 文件所记录的数据。

默认情况下,Redis 没有开启 AOF(append only file)方式的持久化,可以通过 appendonly 参数开启:

appendonly yes

①. 快照持久化配置

appendonly yes appendfsync always # 同步选项 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb

②. 同步选项

使用 AOF 持久化需要设置同步选项,从而确保写命令什么时候会同步到磁盘文件上。

redis数据持久化有哪几种(年终Redis总结数据结构)(8)

3. 重写 / 压缩 AOF 文件

AOF 持久化存在的问题:

为了解决 AOF 文件不断增大的问题,我们采用重写 / 压缩 AOF 文件的方式:

用户 Redis 发送 BGREWRITEAOF 命令,通过移除 AOF 文件中冗余命令来重写 AOF 文件来减小 AOF 文件的体积。

(新的 AOF 文件和原有的 AOF 文件所保存的数据状态是一致的,但是体积更小)。

BGREWRITEAOF 原理:

redis数据持久化有哪几种(年终Redis总结数据结构)(9)

Redis 维护 AOF 重写缓冲区和 AOF 缓冲区。子进程创建新的 AOF 文件期间,记录服务器执行的所有写命令会同时写入 2 个缓冲区中,使得新旧两个 AOF 文件中所保存的数据状态一致。

4. 对比

redis数据持久化有哪几种(年终Redis总结数据结构)(10)

5. 优化

Redis 4.0 以后将快照和 AOF 混合持久化(默认关闭,使用 aof-user-rdb-preamble开启),AOF 重写时将快照写入 AOF 文件开头。

这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据,当然缺点也是有的, AOF 里面的 RDB 部分是压缩格式不再是 AOF 格式,可读性较差。

五. Redis事务

1. 命令

2. 简述

Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务功能。

事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制。服务器在执行事务期间,不会改去执行其它客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。

事务中的多个命令被一次性发送给服务器,而不是一条一条发送,这种方式被称为pipeline。

注意:

六. 深入理解Redis

redis数据持久化有哪几种(年终Redis总结数据结构)(11)


  1. 为何选择Redis?
  2. 高级键管理与数据结构
  3. 内存管理的建议与技巧
  4. Redis编程第一.部分: Redis 核心、客户端和编程语言
  5. Redis编程第二部分: Lua 脚本、管理与DevOps
  6. 可伸缩性: Redis 集群和Sentinel
  7. Redis与互补的NoSQL技术
  8. Docker容器与云端部署
  9. 任务管理与消息队列
  10. 信息流的测量与管理

redis数据持久化有哪几种(年终Redis总结数据结构)(12)

七. Redis面试题

1. 什么是Redis?简述它的优缺点?

Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘 上进行保存。

因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的 Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限 制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。

比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高 性能的tag系统等等。

另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的 memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能 读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

2. Redis与memcached相比有哪些优势?

3. Redis支持哪几种数据类型?

String、List、Set、Sorted Set、hashes

4. Redis主要消耗什么物理资源?

内存。

5. Redis有哪几种数据淘汰策略?

6. Redis官方为什么不提供Windows版本?

因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问 题。

7. 一个字符串类型的值能存储最大容量是多少?

512M

8. 为什么Redis需要把所有数据放到内存中?

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。 所以redis具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘I/O速度为严重影响redis的 性能。 在内存越来越便宜的今天,redis将会越来越受欢迎, 如果设置了最大使用的内存,则数据已有记录数达 到内存限值后不能继续插入新值。

9. Redis集群方案应该怎么做?都有哪些方案?

10. Redis集群方案什么情况下会导致整个集群不可用?

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少 5501-11000这个范围的槽而不可用。

11. Redis有哪些适合的场景?

Java程序员福利:我把2019近一年经历过的Java岗位面试,和一些刷过的面试题都做成了PDF,PDF都是可以免费分享给大家的,关注私信我:【101】,免费领取!

redis数据持久化有哪几种(年终Redis总结数据结构)(13)

,