【Java进阶营】java面试题---Redis①

  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 数据的可靠性的?在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

对 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 文件来恢复数据。

  1. 如何保证 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 同时使用了惰性过期和定期过期两种策略。

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

猜你喜欢

转载自blog.csdn.net/m0_60721514/article/details/124556245