1. Redis 是什么?
- 非关系型的内存数据库,因为数据存储在内存中,因此速度非常快。
2. Redis 支持哪些数据类型?
- string:键值对存储,类似 Java 中的 HashMap,一个 key 对应一个 value,value 最大为 512M;
- list:一个双向链表,支持从两端去操作数据;
- set:无序不重复的集合,类似 Java 的 HashSet,可以方便地求两个集合的交集差集并集等;
- zset:与 set 相比,多了一个表示优先级的 score,可以用来做排行榜;
- hash:映射表,一个 key 对应一组键值对,适合用来存储对象;
3. Redis 有哪些应用场景?
- 做缓存,存储热点数据;
- 做分布式锁;
- 做消息队列;
4. 说说 Redis 的线程模型
- Redis 基于 Reactor 模式开发了网络事件处理器,被称为文件事件处理器;
- Reactor 模式就是由一个非阻塞的线程来接收所有请求,然后再分派不同的 handler中去执行具体逻辑;
- Redis 的文件事件处理器由多个套接字、IO多路复用程序、文件事件分派器和事件处理器构成;
- Redis 的文件事件处理器首先使用 IO 多路复用程序监听多个套接字,并根据套接字执行的任务来为套接字关联事件处理器;当被监听的套接字要执行 accept、read、write 等操作时,文件事件分派器就会调用之前关联好的事件处理器来执行相关操作。
5. Redis 到底是多线程的还是单线程的?
- 整个 Redis 并不是单线程的,但是执行命令的模块是单线程的,所以我们说 Redis 是单线程的;另外,Redis 6.0 开始,对于网络事件的读写也引入了多线程,不过执行命令的模块还是单线程的。
6. 对于 Redis 管道技术有了解吗?
- 管道技术是一种客户端技术,通过客户端执行 redis 命令的时候,正常流程是客户端请求服务端,服务端执行完了给客户端响应,客户端收到响应后继续请求服务端发送下一个执行的命令。就是每执行一条命令就需要经过 “请求 --- 响应” 这么一个来回。要执行的命令一多,这样的来回在网络中的消耗也就变多了,管道技术的原理简单地说就是把所有的命令先发送过去,然后等服务端执行完统一响应,这样就减少了网络消耗。
7. 什么是 Redis 的事务?
- Redis 事务和关系型数据库的事务不一样,它是一组命令的集合,可以保证一组命令按照顺序执行,其他客户端提交过来的命令不能插入到事务管理的命令集合中。它不保证原子性,单条命令的执行是原子性的,但是不能保证一组命令的执行的原子性,即事务管理的某个命令执行失败了,其他命令还是会执行,也不支持回滚。事务相关命令有:watch,监视一个或多个 key,如果 key 被别的客户端修改,则事务被打断;multi,开启事务;exec,执行事务;discard,丢弃事务;unwatch,取消对 key 的监视。
8. 你是如何保证 Redis 数据的可靠性的? 对 Redis 进行持久化。持久化的方式有两种,RDB 和 AOF。
- RDB 就是每隔一段时间以快照的方式将内存中的数据保存到磁盘的 dump.rdb 文件中,默认开启。触发 RDB 的方式有两种,手动触发和自动触发。手动触发就是手动执行
SAVE
或者BGSAVE
命令,SAVE
会阻塞服务器进程,而BGSAVE
会在后台完成执行。自动触发策略可以在 Redis 的配置文件中进行配置,比如save 1000 1
,就是在 1000 秒内,至少有 1 条数据发生了变化,那就会触发BGSAVE
,就数据写到磁盘中,这种策略可以配置多条。RDB 的缺点很明显,就是可能会导致一段时间内的数据丢失,优点就是恢复数据比较快。 - AOF 就是会记录写操作的命令,追加到 appendonly.aof 文件中,Redis 还会对 appendonly.aof 文件进行重写,去掉重复命令,减小其体积。重写也可以手动触发和自动触发,手动触发就是执行
BGREWRITEAOF
命令即可重写 AOF 文件,自动触发可以在配置文件中配置策略,比如auto-aof-rewrite-percentage 100
表示文件增量大于 100% 时进行重写,auto-aof-rewrite-min-size 64mb
表示 AOF 文件体积大于 64m 时就进行重写。可以在配置文件中配置 AOF 的写入命令的策略,appendfsync Everysec
表示每秒记录一次,默认就是该策略,还可以配置appendfsync Always
,记录每次写操作,appendfsync No
,由操作系统决定何时记录写操作。AOF 的优点是可以不造成数据的丢失,缺点是 IO 操作比较多。
一般会同时开启 RDB 和 AOF,同时开启的情况下,会优先根据 AOF 文件来恢复数据。
9. 如何保证 Redis 中的数据都是热点数据? 当 Redis 中的数据集上升到一定程度后,会根据内存淘汰策略淘汰数据。内存淘汰策略有如下几种:
- noeviction:内存不足时写操作报异常;
- allkeys lru:在所有 key 中选择最近最少使用的进行删除;
- allkeys random:在所有 key 中随机选择一个进行删除;
- volatile lru:在过期 key 中选择最近最少使用的进行删除;
- volatile random:在过期 key 中随机选择一个删除;
- volatile ttf:优先删除更早过期的 key。
10. 对于过期的 key,Redis 是如何处理的? Redis 有三种过期键删除策略:
- 定时过期:到了过期时间就删除,对内存友好,但是对 CPU 不太友好;
- 惰性过期:当用到了 key 的时候去判断是否过期了,过期了就删除,对 CPU 友好,但是对内存不太友好;
- 定期过期:定期检查 key 是否过期,过期就进行删除;
Redis 同时使用了惰性过期和定期过期两种策略。