Redis常见面试题汇总

目录

1.说一下Redis和Memcached的区别和共同点

2.redis跳表以及为什么要用跳表?(简单版回答,后期进行补充)

3.redis给缓存数据设置过期时间有啥用?

4.redis是如何判断数据是否过期的?

5.过期的数据的删除策略了解么?

6.redis内存淘汰机制了解么?

7.redis的持久化机制?

8.AOF和RDB同时开启,redis听谁的?AOF文件损坏用什么命令进行恢复?

9.AOF啥时候触发重写?

10.Redis事务?

11.redis主从复制?主从复制特点?缺点?原理?

12.redis哨兵模式?

13.redis缓存穿透?

14.redis缓存击穿?

15.redis缓存雪崩?

16.分布式锁?分布式锁实现的四个条件?

17.redis集群?

18.redis传统五大基本类型的应用场景?


1.说一下Redis和Memcached的区别和共同点

答:共同点:都是基于内存的数据库,都有过期策略,性能都非常高。区别是memcached只支持简单的k v数据类型,而redis支持更丰富的数据类型。redis还支持持久化,memcached不支持。redis还有灾难恢复机制。redis支持发布订阅模型、Lua脚本、事务等功能,而Memcached不支持。Memcached过期数据的删除策略只用了惰性删除,而redis有惰性删除和定期删除。

2.redis跳表以及为什么要用跳表?(简单版回答,后期进行补充)

答:redis跳表是redis数据类型zset有序集合的底层实现,它是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问的目的。跳跃表的每一层都是一条有序的链表,最底层的链表包含所有元素,跳跃表层级越多,访问速度越快。每个层级最末端节点指向都是为null,表示该层达到末尾,可以往下一级跳。

3.redis给缓存数据设置过期时间有啥用?

答:因为内存是有限的,如果缓存数据一直存在的话,容易发生OOM,有助于缓解内存的消耗,像一些业务场景,判断验证码是否过期,如果用传统数据库来做的话还得自己判断是否过期,而用redis就方便了很多。

4.redis是如何判断数据是否过期的?

答:redis通过一个过期字典来保存数据过期的时间。过期字典的键指向redis数据库的某个key,值是一个long long类型的整数,这个整数保存了键的过期时间。

5.过期的数据的删除策略了解么?

答:惰性删除和定期删除。惰性删除是只会在取出key的时候才对数据进行过期检查,这样对cpu最友好,但是可能造成太多过期key没有被删除。定期删除是每隔一段时间抽取一批key执行删除过期key操作。

6.redis内存淘汰机制了解么?

答:了解,4.0以前有6种数据淘汰策略。volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。volatile-random:从已设置过期时间的数据集中任意挑选数据淘汰。allkeys-lru:当内存不足以容纳新写入数据时,移除最近最少使用的key,这个是最常用的。allkeys-random:从数据集中任意选择数据淘汰 no-evication:当内存不足以容纳新写入数据时,新写入操作会报错。4.0后又增加了volatile-lfu:从已设置过期时间的数据集中,挑选最不经常使用的数据淘汰。allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key。

7.redis的持久化机制?

答:rdb和aof。rdb是快照持久化,是redis默认的持久化机制,在指定时间段内将内存的数据快照写入磁盘,恢复时将快照文件dump.rdb写入内存。rdb的触发条件默认是一分钟10000个key发生变化、5分钟10个key发生变化、15分钟1个key发生变化,redis就会自动触发BGSAVE命令创建快照。(bgsave会在后台异步进行快照操作,不会阻塞其他操作。save会阻塞其他操作。) aof持久化默认没有开启,可以通过appendonly参数开启,aof有三种不同的持久化策略,它们分别是always每次有数据修改发生时都会写入AOF文件,everysec每秒同步一次,还有就是no把同步时机交给操作系统。 aof就是将redis执行过的所有写指令记录下来,追加到AOF缓冲区,AOF缓冲区根据持久化策略(always、everysec、no)将操作同步到磁盘的AOF文件中。redis重启的话就会根据日志文件的内容将写指令从前到后执行一遍。

8.AOF和RDB同时开启,redis听谁的?AOF文件损坏用什么命令进行恢复?

答:系统默认读取AOF的数据。通过/usr/local/bin/redis-check-aof --fix appendonly.aof进行恢复。

9.AOF啥时候触发重写?

答:bgrewriteof命令触发重写,默认AOF文件是上次重写后大小的一倍且文件大于64M时触发。

10.Redis事务?

 答:redis可以通过multi、exec、discard等命令实现事务功能。组队中某个命令出现了错误,则执行时整个队列都会被取消,如果执行阶段某个命令出现了错误,则只有报错的命令不会执行。比如set a a1后再incr a,组队阶段不报错,但是执行的话就incr那句会报错,其他会正常执行。

11.redis主从复制?主从复制特点?缺点?原理?

 答:读写分离、Master以写为主,Slave以读为主。info replication 查看当前主机身份。一主二仆、薪火相传、反客为主(手动)。一主二仆:从机只能读,不能写,主机宕机后,另外两个从机不会上位,从机宕机后,会变成master,需要重新声明从机,与主机建立连接。薪火相传:B机器既是A的从机又是C的从机 反客为主:slaveof no one 

特点:首次全量复制,之后增量复制,也就是复制原理就是当从服务器连上主服务器之后,从服务器向主服务器发送数据同步消息,主服务器收到消息后,先把数据进行持久化,把持久化后的rdb文件发送给从服务器,从服务器进行读取。每次主服务器进行写操作之后,和从服务器进行数据同步。从服务器只在第一次主动请求同步,后面都是由主服务器发起的同步,将更新指令一次传给slave,完成同步。

缺点:由于只master写,同步更新到slave上会有延迟,slave增多或者数据量大

12.redis哨兵模式?

答:反客为主的自动版,主回来自动降级为slave,主机挂了,投票一个从机上位。在自己的redis目录下,和redis.conf文件同级,建立一个sentinel.conf文件,sentinel.conf里面内容:sentinel monitor 主机名 主机 端口号 至少有多少个哨兵同意迁移的数量(就是有几个从机同意你才能切换)。redis-sentinel启动(默认端口26379  )。哪个从机会被选举为主机呢?根据优先级别:slave-priority,值越小优先级越高。redis6.0变成了replica-priority。如果slave-priority值相同,那么比较谁偏移量大,就是看哪个从机同步的主机的数据较多,比如一个9个,一个10个,10个的那个就成为主机。如果偏移量也相等的话,那么选择runid最小的从服务器,每个redis实例启动后都会随机生成一个40位的runid。新的主服务器会向原主服务器的从服务器发送slaveof 新主服务的命令,复制新master。当已下线的服务重新上线时,sentinel会向其发送slaveof命令,让其成为新主的从。

13.redis缓存穿透?

 答:缓存穿透就是大量请求的key根本不在缓存中,也不在数据库中,导致大量请求压到数据库,致使数据库宕机。解决方法:1、对空值缓存,如果一个查询返回的数据为空则把空值进行缓存。2、设置白名单:使用bitmaps定义一个可访问名单,名单id作为bitmaps的偏移量,每次访问和bitmaps里面的id进行比较,如果访问id不在bitmaps里面,就进行拦截。3、采用布隆过滤器。4、进行实时监控,当redis命中率开始急速降低、可以排查访问对象,设置黑名单限制服务。

14.redis缓存击穿?

 答:某一个热点key存在但在redis中过期,导致大量数据压到数据库,致使数据库宕机。解决方法:1、预先设置热门数据,把热门数据的过期时间调长。2、实时调整,现场监控哪些数据热门,调整key的过期时长。

15.redis缓存雪崩?

 答:多个key大量过期失效,导致所有请求压到数据库,造成数据库宕机。解决方法:1、使用锁或队列保证不会有大量的线程对数据库一次性进行读写。2、将缓存失效时间分散开,在原有失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存过期时间重复率就会降低,就很难引发集体失效的事件。

16.分布式锁?分布式锁实现的四个条件?

 答:setnx key value,只有key不存在,才能进行相关操作。1、互斥性。在任意时刻,只有一个客户端能持有锁。2、即使有一个客户端在持有锁期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。3、加锁和解锁必须是同一个客户端。4、加锁和解锁必须具有原子性。

17.redis集群?

  答:redis集群实现了对redis的水平扩容,启动N个redis节点,每个节点存储总数据的1/N。cluster-enabled yes 打开集群模式

18.redis传统五大基本类型的应用场景?

答:传统五大基本类型有string、set、hash、zset、list。string的应用场景像微信文章的阅读量,你每访问一次rest地址就incr key一下,阅读量就加一。hash是hset key field value。可以用在购物车的场景。key相当于商品的品类,而field代表该品类下的某件商品。hlen key去统计购物车中放了几个商品,增加商品用hincrby key field 1就行。hgetall key相当于全选。list的应用场景为订阅微信文章公众号,比如订阅了的公众号推送了两个文章,就会lpush article:用户id 1 2放进list中,然后查看所有的文章就使用lrange命令,lrange article:用户id 0 10查看订阅的全部文章,每页显示10个。 set的话比如微信抽奖小程序,sadd key 用户ID,scard key获取多少用户参与了抽奖。srandommember key 人数 随机抽取几个幸运儿。zset就是zadd key score member,比如抖音热搜排行前十,zrevrange key 0 9即可。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值