什么是Redis?
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 的数据类型都是基于基本数据结构的,比如支持它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型 ,同时对程序员透明,无需进行额外的抽象,使用方便。
Redis 运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。
所以使用Redis读写数据都是非常快的。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
Redis的常用数据类型有哪些?
支持多种类型的数据结构,主要区别是value存储的数据格式不同:
- string:最基本的数据类型,二进制安全的字符串,最大512M。
- list:按照添加顺序保持顺序的字符串列表。
- set:无序的字符串集合,不存在重复的元素。
- sorted set:已排序的字符串集合。
- hash:key-value对格式
Redis与Memcache的区别?
Redis | Memcache | |
---|---|---|
数据操作方面 | 支持list、set、sorted set、hash 等数据结构 | 只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能 |
内存管理方面 | 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用 | Memecache把数据全部存在内存之中 |
线程方面 | Redis使用单线程的多路 IO 复用模型 | Memcached是多线程,非阻塞IO复用的网络模型 |
集群管理方面 | Redis 目前是原生支持 cluster 模式的 | Memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据 |
Redis的持久化方案由哪些?
Redis持久化方案支持RDB和AOF,下面分别介绍下:
RDB持久化:
RDB持久化可以使用save或bgsave,为了不阻塞主进程业务,一般都使用bgsave,流程分为以下几个步骤:
- Redis 进程会 fork 出一个子进程(与父进程内存数据一致)。
- 父进程继续处理客户端请求命令
- 由子进程将内存中的所有数据写入到一个临时的 RDB 文件中。
- 完成写入操作之后,旧的 RDB 文件会被新的 RDB 文件替换掉。
RDB持久化优点和缺点:
优点 | 缺点 |
---|---|
RDB持久化文件小,Redis数据恢复时速度快 | 如果业务场景很看重数据的持久性 (durability),那么不应该采用 RDB 持久化。如果 Redis 每 5 分钟执行一次 RDB 持久化,要是 Redis 意外奔溃了,那么最多会丢失 5 分钟的数据 |
子进程不影响父进程,父进程可以持续处理客户端命令 | RDB文件压缩会减小文件体积,但会对CPU有额外的消耗 |
子进程fork时采用copy-on-write方式,大多数情况下,没有太多的内存消耗,效率比较好。 | 如果Redis此时写操作较多,可能导致额外的内存占用,甚至内存溢出 |
AOF持久化:
Redis 执行 AOF持久化时,会将接收到的写命令追加到 AOF 文件的末尾,因此 Redis 只要对 AOF 文件中的命令进行回放,就可以将数据库还原到原先的状态。
Redis 不断将接收到的写命令追加到 AOF 文件中,导致 AOF 文件越来越大。过大的 AOF 文件会消耗磁盘空间,并且导致 Redis 重启时更加缓慢。
为了解决这个问题,在适当情况下,Redis 会对 AOF 文件进行重写,去除文件中冗余的命令,以减小 AOF 文件的体积。在重写 AOF 文件期间, Redis 会启动一个子进程,由子进程负责对 AOF 文件进行重写。
可以通过下面两个配置项,控制 Redis 重写 AOF 文件的频率:
- auto-aof-rewrite-min-size 64mb
- auto-aof-rewrite-percentage 100
这两个配置的作用:当 AOF 文件的体积大于 64MB,并且 AOF 文件的体积比上一次重写之后的体积大了至少一倍,那么 Redis 就会执行 AOF 重写。
AOF持久化优点和缺点:
优点 | 缺点 |
---|---|
持久化频率高 | 文件体积大 |
数据可靠性高,没有额外的内存或CPU消耗 | 文件大导致服务恢复时读取文件时间较长,效率略低 |
Redis的集群方式有哪些?
Redis集群可以分为主从集群和分片集群两类。
主从集群一般一主多从,主库用来写数据,从库用来读数据。结合哨兵,可以再主库宕机时从新选主,目的是保证Redis的高可用。
分片集群是数据分片,我们会让多个Redis节点组成集群,并将16383个插槽分到不同的节点上。存储数据时利用对key做hash运算,得到插槽值后存储到对应的节点即可。因为存储数据面向的是插槽而非节点本身,因此可以做到集群动态伸缩。目的是让Redis能存储更多数据。
集群分类 | 特点 | 目的 |
---|---|---|
主从集群 | 一主多从,主库用来写数据,从库用来读数据 (哨兵模式) | 保证Redis的高可用 |
分片集群 | 就是对数据分片,多个Redis节点组成集群,并将16383个插槽分到不同的节点上。存储数据时利用对key做hash运算,得到插槽值后存储到对应的节点即可 | 让Redis能存储更多数据 |