Redis面试必知必会

Redis 支持哪几种数据类型?

string:最基本的数据类型,二进制安全的字符串,最大512M

list:按照添加顺序保持顺序的 字符串列表

set:无序的字符串集合,不存在重复的元素

sorted set:已排序的字符串集合

hash:key/value对的一种集合

Redis是单进程的还是单线程的?

Redis是单进程单线程的,Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

Redis为什么是单线程的?

多线程处理会设计到锁,而且多线程处理会设计到线程切换而消耗CPU。因为CPU不会Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。单线程无法发挥多核CPU性能,不过可以通过在单机开启Redis实例来解决。

Redis的优势

速度快。因为数据存储于内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

支持丰富的数据类型,支持string,list,set,sorted set,hash

支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

Redis和memcached有哪些优势

memcached所有的值均是简单的字符串,Reids作为其替代者,支持更为丰富的数据类型

Redis的速度比memcached快很多

Redis可以持久化其数据

Redis支持数据的备份,即master/slave模式的数据备份

Redis有哪几种数据淘汰策略

在Redis中,允许用户设置最大使用内存大小server.maxmemory,当Redis内存数据集大小上升到一定大小的时候,就会执行数据淘汰策略

volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰

volatile-ttl:从已设置过期的数据集中挑选将要过期的数据淘汰

volatile-random:从已设置过期的数据集中任意挑选数据淘汰

allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

allkeys-random:从数据集中任意挑选数据淘汰

noenviction:禁止淘汰数据

Redis支持哪几种持久化方式

RDB持久化

原理是将Redis在内存中的数据记录定时dump到磁盘上的RDB文件

指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF(append only file)持久化

原理是将Redis的操作日志以追加的方式写入文件。

以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。当服务器重启的时候会重新执行这些命令来恢复原始的数据。AOF命令以Reids协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

Redis两种持久化方式优缺点?

RDB持久化

优点:RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比,RDB最重要的优点之一是对性能的影响相对较小

缺点:RDB文件的致命缺点在与其数据快照的持久化方式决定了必然做不到实时持久化,而在数据越来越重要的今天,数据的大量丢失很多时候是无法接受的,因此AOF持久化称为主流。此外,RDB文件需要满足特定格式,兼容性差。

AOF持久化

与RDB持久化相对应,AOF的优点在于支持秒级持久化、兼容性好,缺点是文件大,恢复速度慢,对性能影响大

如何选择Redis持久化方式策略?

在介绍持久化策略之前,首先要明白无论是RDB还是AOF,持久化的开启都是要付出性能方面的代价的。对比RDB持久化,一方面是bdsave在进行fork操作时Redis主进程会阻塞,另一方面,子进程向硬盘写数据也会带来IO压力;对于AOF持久化,向硬盘写数据的频率大大提高(everysec策略下为秒级),IO压力更大,设置可能造成AOF追加阻塞文件。此外,AOF文件的重写与RDB的basave类似,会有fork时的阻塞和子进程的IO压力问题。相对来说,由于AOF向硬盘中写数据的频率更高,因此对Redis主进程性能的影响会更大。

在实际生产环境中,根据数据量、应用对数据的安全要求、预算限制等不同情况,会有各种各样的持久化策略;如完全不使用任何持久化,使用RDB或AOF一种,或同事开启RDB和AOF持久化等。此外,持久化的选择必须与Redis的主从策略一起考虑,因为主从复制与持久化同样具有数据备份的功能,而且主机master和从机slave可以独立的选择持久化方案。

Redis集群的主从复制模型是怎样的?

为了是在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群是用了主从复制模型,每个节点都会有N-1个复制品

Redis集群会有写操作丢失吗?为什么?

Redis并不能保证数据强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作

Redis集群之间是如何复制的

异步复制

Redis如何做内存优化

尽可能使用散列表(hashes),散列表(是说列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面,比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户所有信息存储到一张散列表中

Redis回收进程如何工作?

一个Client运行了新的命令,添加了新的数据,Redis会检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收

Redis常用的使用场景

Session共享(单点登录)

页面缓存

队列

排行榜/计算器

发布/订阅

需要答案详解的可以QQ群810589193获取!

阿里蚂蚁金服专场面试系列题

01   技术一面

线程池有哪些参数?分别有什么用?如果任务数超过的核心线程数,会发生什么?阻塞队列大小是多少?

数据库连接池介绍下,底层实现说下

hashset底层实现,hashmap的put操作过程

说说HaspMap底层原理?再说说它跟HaspTable和ConcurrentHashMap他们之间的相同点和不同点?

说说B+树和B树的区别,优缺点等?

算法题,对一个链表进行归并排序,链表可能有环

怎么实现一个线程安全的计数器?

原子类AtomicInteger实现原理是什么?和你设计的计数器优劣比较?CAS怎么实现原子操作的?

Java中的锁有什么?synchronized与Lock的区别?公平锁和非公平底层怎么实现的?AQS原理详细介绍一下?

你在项目中一般怎么调优JVM的呢?

说一下GC吧,什么时候进行Full GC呢?

你了解哪些收集器?CMS和G1。详细谈谈G1的优点

02     技术二面

了解哪些排序算法,讲讲复杂度

手撕归并排序

Redis有哪些数据结构?底层的编码有哪些?有序链表采用了哪些不同的编码?

redis的hash数据结构最多能存储多少个元素

自己如何实现RPC?

mysql默认存储引擎?MyISAM、InnoDB、MEMORY的区别

什么是幻读,如何解决

事务隔离级别有什么?通过什么来实现的?分别解决了什么问题?

乐观锁与悲观锁的使用场景

03    技术三面

介绍对你技术能力帮助最大的项目,重点讲架构设计思路

分布式全局唯一ID怎样来实现?

dubbo的生产者如何发布服务,注册服务,消费者如何调用服务?

dubbo负载均衡的策略有哪些?一致性哈希详细聊一下?

分布式session如何实现的

微服务你的理解?以及常用的微服务方案dubbo、spring cloud的比较?

Kafka怎么保证数据可靠性?

数据库主从同步数据一致性如何解决?技术方案的优劣势比较?

分布式锁的实现方式你知道有哪些?主流的解决方案是什么?

04    HR四面

常规问题为主

聊人生的经历

聊印象深刻的人生的经历

说下技术方面或者生活方面你做得比较好的一个点和不足的一个点吧?

职业规划

-end-

通过了解大厂的技术面试题目与面试经验,查漏补缺,有目标去扩充自己的技术栈,深度掌握1-2门技术基础上去延伸广度,距离目标就不会太远了。

以上是Java面试中常问的问题,可可以加群:810589193,点击链接加入群聊【Java架构学习交流群】:https://jq.qq.com/?_wv=1027&k=5deQUBl免费领取答案!!!

有需要的朋友可以找我免费领取!希望新的一年里能给你提供工作上的帮助和知识的进阶。

你可能感兴趣的:(Redis面试必知必会)