Redis(Java面试题)

一、什么是Redis?

Redis是一种高性能key-value非关系型数据库,他是基于C语言写的,底层采用NIO多路复用机制,使用一个线程去维护多个不同的socket连接,他只有Linux版本的,没有Windows版本的,Windows版本的Redis是网上大神改写的,因为在Windows中NIO多路复用机制底层使用的是selector选择器,通过for循环去遍历连接,容易造成空轮训,效率比较低,而Linux中是采用epoll事件驱动回调机制主动去调用活跃的socket连接,避免了空轮训,效率比较高。我知道的主要有四个应用场景,第一个的做分布式锁,第二个是做缓存,第三个是使用Token解决分布式session问题,第四个是做延迟操作,比如用来解决支付订单超时问题,因为key可以设置有效时间,并且key过期会有事件监听的,在下订单的30分钟过后通过监听方法去查询订单支付状态,如果订单未支付,就修改订单状态为已超时。Redis有两种持久化机制三种集群方式三大安全问题,支持五种数据类型六种淘汰机制

二、关系型数据库和非关系型数据库的区别?

关系型数据库:数据是存放到硬盘的,每次读取数据都是io操作,效率比较低
非关系型数据库:数据是放到内存里的,也有一些持久化操作的机制

三、常见的NoSQL数据库有哪些?(待定)

四、NoSQL有哪几种类型?分别在什么情况下使用?(待定)

五、Redis的应用场景有哪些?

我知道的主要有四个应用场景,第一个的做分布式锁,第二个是做缓存,第三个是使用Token解决分布式session问题,第四个是做延迟操作,比如用来解决支付订单超时问题,因为key可以设置有效时间,并且key过期会有事件监听的,在下订单的30分钟过后通过监听方法去查询订单支付状态,如果订单未支付,就修改订单状态为已超时。

六、Redis的支持哪五种数据类型?

string、hash、list、set、zset

七、Redis的六种内存淘汰机制?

直接报错一种
全部的key中,移除最近未使用的或者随机移除一个key两种
在设置了超时时间的key中,移除最近未使用或者随机移除或者最早过期的key三种,总共六种

八、Redis的两种持久化机制?

在Redis中有AOFRDB两种持久化机制,AOF是增量同步的,他有三种模式,一种是一有数据就进行同步,IO次数比较多,效率比较低,但是数据不会丢失,一种是使用缓冲区,IO次数比较少,效率比较高,但是数据会出现少量丢失,一种是不持久化,效率高,但是数据容易丢失。RDB是全量同步的,指定时间通过RDB文件进行全量同步,一旦宕机,数据容易丢失,RDB文件分为临时RDB文件和最终RDB文件,每次同步都会生成一个临时RDB文件并且覆盖上一个RDB文件,一旦Redis宕机,临时RDB文件就成为了最终RDB文件,通过最终RDB文件进行数据恢复。

九、Redis中的事务有了解过吗?和MySQL事务有什么区别?

Redis事务不具有隔离性,MySQL的事务具有隔离性,事务之间互不影响。并且只有取消事务,没有回滚事务,因为Redis中不会去上锁,回滚事务是一个取消行锁和取消事务的操作。

十、分布式锁的应用场景有哪些?

全局ID生成,全局的任务调度

十一、实现分布式锁四种方式?

ZK、Redis、数据库行锁、Reission

十二、Redis如何实现分布式锁?

Redis的key有三个特点,key唯一临时key事件通知,同时通过setnx命令去创建key,返回1代表创建成功,获取分布式锁,返回0则失败,等待获取锁,key超时或者业务逻辑处理完就释放锁,释放锁的时候通过事件通知其他节点争抢锁。

十三、Redis和ZK实现分布式锁有什么区别?谁更好?

十四、Redis集群的三种方式?

主从复制哨兵机制分片集群,传统的主从复制是一主多从,主节点负责读写操作,从节点负责写操作,主节点和从节点之间建立长连接,第一次建立连接的时候通过发送RDB文件全量同步数据,之后通过AOF模式增量同步数据。但是这样存在一个问题,就是一旦主节点宕机了,就必须手动去把备机改成宕机,且一主多从数据冗余过多,所以有了哨兵机制,每个哨兵都订阅到Redis的通道中,哨兵之间通过通道实现集群,每个哨兵对应一个备机,哨兵通过监听主节点来感知整个Redis集群结构,定时发送心跳,一旦有哨兵长时间没有接受到主节点的心跳,就会向其他哨兵发送通知,有过半的哨兵ping不到Redis的话,就会通过哨兵重新选举主节点。哨兵机制解决了手动修改主节点的缺点,但是一主多从存在的数据冗余缺点还在。后面又推出了Redis分片集群方式,采用多主多从,多个主节点平均分配16384个哈希槽,不仅可以解决冗余数据的问题,还非常的灵活,可以动态的扩容和缩容。

十五、Redis中存在哪三大安全问题?

缓存穿透、缓存击穿、缓存雪崩,缓存穿透是指访问Redis中不存在的key,直接访问数据库,给数据库造成巨大压力,可以采用api限流或者布隆过滤器解决。缓存击穿是指一个热点key突然过期了,突然全部访问到数据库,给数据库造成压力,可以设置key无限有效期或者用分布式锁解决,只让一个key去访问数据库并设置到缓存中,这样其他key只访问缓存。还有一个缓存雪崩问题,和缓存击穿类似的,只是缓存雪崩是所有的key突然都失效了或者Redis重启且没有持久化,可以采用分摊部署key的方式解决,就是分片集群。

你可能感兴趣的:(面试题总结)