史上最全Redis面试题(含答案):哨兵+复制+事务+集群+持久化等

Redis主要有哪些功能?mysql

哨兵(Sentinel)和复制(Replication)web

Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就须要哨兵和复制。面试

Sentinel能够管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能,Replication则是负责让一个Redis服务器能够配备多个备份的服务器。redis

Redis也是利用这两个功能来保证Redis的高可用的算法

事务sql

不少状况下咱们须要一次执行不止一个命令,并且须要其同时成功或者失败。redis对事务的支持也是源自于这部分需求,即支持一次性按顺序执行多个命令的能力,并保证其原子性。数据库

LUA脚本缓存

在事务的基础上,若是咱们须要在服务端一次性的执行更复杂的操做(包含一些逻辑判断),则lua就能够排上用场了安全

持久化性能优化

redis的持久化指的是redis会把内存的中的数据写入到硬盘中,在redis从新启动的时候加载这些数据,从而最大限度的下降缓存丢失带来的影响。

集群(Cluster)

单台服务器资源的老是有上限的,CPU资源和IO资源咱们能够经过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上,这也有点相似mysql数据库的主从同步。

在Redis官方的分布式方案出来以前,有twemproxy和codis两种方案,这两个方案整体上来讲都是依赖proxy来进行分布式的。

 

Redis支持哪几种数据类型?

支持多种类型的数据结构

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

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

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

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

5.hash:key-value对的一种集合。

 

Redis是单进程单线程的?

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

 

Redis为何是单线程的?

多线程处理会涉及到锁,并且多线程处理会涉及到线程切换而消耗CPU。由于CPU不是Redis的瓶颈,Redis的瓶颈最有多是机器内存或者网络带宽。单线程没法发挥多核CPU性能,不过能够经过在单机开多个Redis实例来解决。

 

其它开源软件采用的模型

Nginx:多进程单线程模型

Memcached:单进程多线程模型

 

使用Redis的优点?

1.速度快,由于数据存在内存中,相似于HashMap,HashMap的优点就是查找和操做的时间复杂度都是O(1)

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

3.支持事务,操做都是原子性,所谓的原子性就是对数据的更改要么所有执行,要么所有不执行

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

 

Redis单点吞吐量

单点TPS达到8万/秒,QPS达到10万/秒,补充下TPS和QPS的概念

1.QPS: 应用系统每秒钟最大能接受的用户访问量

每秒钟处理完请求的次数,注意这里是处理完,具体是指发出请求到服务器处理完成功返回结果。能够理解在server中有个counter,每处理一个请求加1,1秒后counter=QPS。

2.TPS: 每秒钟最大能处理的请求数

每秒钟处理完的事务次数,一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较合理。

 

Redis相比memcached有哪些优点?

1.memcached全部的值均是简单的字符串,Redis做为其替代者,支持更为丰富的数据类型

2.Redis的速度比memcached快不少

3.Redis能够持久化其数据

4.Redis支持数据的备份,即master-slave模式的数据备份。

文章写了一半了,以为不错的小伙伴能够给我点点关注,另外想要了解更多Java面试知识点的,也能够关注我一下,我后续也会整理更多关于这一块的知识点分享出来,另外顺便给你们推荐一个Java的交流学习社区:586446657,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工做和遇到技术瓶颈的码友,在这个群里会有你须要的内容。

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

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

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

2.volatile-ttr:从已设置过时的数据集中挑选将要过时的数据淘汰

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

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

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

6.noenviction:禁止淘汰数据

redis淘汰数据时还会同步到aof

 

Redis集群方案应该怎么作?都有哪些方案?

1.twemproxy

2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变状况下,旧节点数据可恢复到新hash节点。

3.Redis cluster3.0自带的集,特色在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。

 

Redis读写分离模型

经过增长Slave DB的数量,读的性能能够线性增加。为了不Master DB的单点故障,集群通常都会采用两台Master DB作双机热备,因此整个集群的读和写的可用性都很是高。

读写分离架构的缺陷在于,不论是Master仍是Slave,每一个节点都必须保存完整的数据,若是在数据量很大的状况下,集群的扩展能力仍是受限于单个节点的存储能力,并且对于Write-intensive类型的应用,读写分离架构并不适合。

 

Redis数据分片模型

为了解决读写分离模型的缺陷,能够将数据分片模型应用进来。

能够将每一个节点当作都是独立的master,而后经过业务实现数据分片。

结合上面两种模型,能够将每一个master设计成由一个master和多个slave组成的模型。

 

Redis提供了哪几种持久化方式?

RDB持久化方式可以在指定的时间间隔能对你的数据进行快照存储

AOF持久化方式记录每次对服务器写的操做,当服务器重启的时候会从新执行这些命令来恢复原始的数据,AOF命令以Redis协议追加保存每次写的操做到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.

若是你只但愿你的数据在服务器运行的时候存在,你也能够不使用任何持久化方式.

你也能够同时开启两种持久化方式, 在这种状况下, 当Redis重启的时候会优先载入AOF文件来恢复原始的数据,由于在一般状况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.

最重要的事情是了解RDB和AOF持久化方式的不一样,让咱们以RDB持久化方式开始。

 

如何选择合适的持久化方式?

1. Redis主要提供了两种持久化机制:RDB和AOF;

2.RDB

默认开启,会按照配置的指定时间将内存中的数据快照到磁盘中,建立一个dump.rdb文件,Redis启动时再恢复到内存中。

Redis会单首创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,而后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,而后子进程退出,内存释放。

须要注意的是,每次快照持久化都会将主进程的数据库数据复制一遍,致使内存开销加倍,若此时内存不足,则会阻塞服务器运行,直到复制结束释放内存;都会将内存数据完整写入磁盘一次,因此若是数据量大的话,并且写操做频繁,必然会引发大量的磁盘I/O操做,严重影响性能,而且最后一次持久化后的数据可能会丢失;

3.AOF

以日志的形式记录每一个写操做(读操做不记录),只需追加文件但不能够改写文件,Redis启动时会根据日志从头至尾所有执行一遍以完成数据的恢复工做。包括flushDB也会执行。

主要有两种方式触发:有写操做就写、每秒定时写(也会丢数据)。

由于AOF采用追加的方式,因此文件会愈来愈大,针对这个问题,新增了重写机制,就是当日志文件大到必定程度的时候,会fork出一条新进程来遍历进程内存中的数据,每条记录对应一条set语句,写到临时文件中,而后再替换到旧的日志文件(相似rdb的操做方式)。默认触发是当aof文件大小是上次重写后大小的一倍且文件大于64M时触发。

当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。通常状况下,只要使用默认开启的RDB便可,由于相对于AOF,RDB便于进行数据库备份,而且恢复数据集的速度也要快不少。

开启持久化缓存机制,对性能会有必定的影响,特别是当设置的内存满了的时候,更是降低到几百reqs/s。因此若是只是用来作缓存的话,能够关掉持久化。

Redis常见性能问题和解决方案?

(1) Master最好不要作任何持久化工做,如RDB内存快照和AOF日志文件

(2) 若是数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和链接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽可能避免在压力很大的主库上增长从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…

这样的结构方便解决单点故障问题,实现Slave对Master的替换。若是Master挂了,能够马上启用Slave1作Master,其余不变。

Redis支持的Java客户端都有哪些?官方推荐用哪一个?

Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

Redis哈希槽的概念?

Redis集群没有使用一致性hash,而是引入了哈希槽的概念,当须要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪一个桶中。

Redis集群最大节点个数是多少?

Redis集群预分好16384个桶(哈希槽)

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

为了使在部分节点失败或者大部分节点没法通讯的状况下集群仍然可用,因此集群使用了主从复制模型,每一个节点都会有N-1个复制品.

Redis集群会有写操做丢失吗?为何?

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

Redis集群之间是如何复制的?

异步复制

Redis如何作内存优化?

尽量使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存很是小,因此你应该尽量的将你的数据模型抽象到一个散列表里面。好比你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的全部信息存储到一张散列表里面.

Redis回收进程如何工做的?

一个客户端运行了新的命令,添加了新的数据。

Redi检查内存使用状况,若是大于maxmemory的限制, 则根据设定好的策略进行回收。

Redis回收使用的是什么算法?

LRU算法

Redis有哪些适合的场景?

1)Session共享(单点登陆)

2)页面缓存

3)队列

4)排行榜/计数器

5)发布/订阅

相关文章
相关标签/搜索