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的六种内存淘汰机制?

名称描述
volatile-lru已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-lfu从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
volatile-ttl从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random从已设置过期时间的数据集中挑选任意数据淘汰
allkeys-lru当内存不足写入新数据时淘汰最近最少使用的Key
allkeys-random当内存不足写入新数据时随机选择key淘汰
allkeys-lfu当内存不足写入新数据时移除最不经常使用的Key
no-eviction当内存不足写入新数据时,写入操作会报错,同时不删除数据

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

在Redis中有AOF和RDB两种持久化机制,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,使用redis作为高性能分布式锁足够了,多节点只能保证高性能不能保证正确性,使用redlock可以保证正确性,但是不能保证高性能,所以多节点时redis不适合作为分布式锁。zk分布式锁更加均衡

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值