Redis常见问题及企业面试笔记

Redis常见的问题总结

1、入坑学习基础命令

入门视频可以建议看狂神的b站视频,下面是视频中配套的PDF文档,笔记挺详细的,合适新手或者面试时的工具概念书。地址在**这里**

下面是一些常见的面试题,学习就是为了更够更好的工作,而面试题能考察你是否真正的掌握。

2、说一下对redis 的理解?

问这个问题就好像没问一样,但又好像说了什么?所以在答理解题的时候,需要言简意赅,直接突出重点,说话自信点。

Redis(Remote Dictionary Server) 远程字典服务, 是一个用C编写的,开源的,支持网络,基于内存,可持久化的日志型,键值对数据库,并且能提供多种语言API。是用的最多开源中间件之一。

3、Redis 的适合什么场景,不适合什么场景?

适合场景:

​ 缓存 : 毋庸置疑,能减轻MySQL的压力。

​ 排行榜:利用有序集合zset实现。

​ 计数器、限速器:利用redis 中的自增操作实现计数;限速器能限制某个用户访问API的频率,防止压力。

​ 好友关系(点赞、共同好友):利用集合的一些命令,交集,并集,差集等,实现共同好友,共同爱好等。

​ 简单的消息队列: 订阅发布模式: 利用自身的订阅发布模式,也可以用list实现一个队列机制。

​ Session服务器:用redis存储session(存储在服务器中)后,用户就不用频繁登录网站了。

不适合场景

​ 数据访问量太低不适合 : 如果使用浪费资源

​ 数据量太大不适合: 如果使用成本太大

4、Redis的常见功能?

  • 数据缓存功能
  • 分布式锁功能
  • 数据持久化
  • 支持事务
  • 支持消息队列(list 实现)

5、Redis 的数据结构

基本的五种数据结构 : string, hash,list,set,zset(有序集合)

扩展的三种数据结构:Geospatial(地理位置),Hyperloglog(基数),bitmap(布隆过滤器)。

6、Redis为什么这么快

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速
  • 数据结构简单,对数据操作也简单
  • 采用单线程,避免了上下文切换和竞争条件,不存在多进程和多线程切换导致消耗CPU,不用考虑各种锁问题,也不存在加锁释放锁的操作,所以不存在死锁而导致消耗CPU性能
  • 使用多路IO复用模型,非阻塞IO。

7、Redis是单线程的,为什么能保证效率?

这里一直强调Redis是单线程的,只是我们在处理网络请求的时候只有一个线程来处理,一个正式的Redis Server 运行的时候肯定不是只有一个线程的。

跟上面的答案一样的,只不过是换了个问法。

7.1 Redis在进行持久化过程是用的子进程还是子线程?为什么

RDB的方式进行持久化,为什么是新开一个子进程,而不是新开一个线程?

由于Redis对性能的考虑

  • Redis持久化会阻塞主进程,这样主进程就无法相应客户端请求
  • 我们知道Redis对客户端相应请求的工作模式是单进程和单线程的,如果在主进程内启动一个线程,这样就会造成对数据的竞争条件,为了避免使用锁降低性能。

基于上面的原因,就是为什么Redis通过子进程来执行RDB。

Redis通过AOF持久化也是通过fork子进程实现,里面启用rewrite功能。

8、什么是缓存穿透(查不到),解决办法?

缓存穿透是指查询一个一定不存在数据,由于缓存中没有,持久层数据库中也没有,查不到数据则不能写入缓存,这个请求数量大的情况下,就会发生缓存穿透。

  • 解决办法

1、设置空对象,如果在持久层查询不到的数据,可以返回一个空对象,把空对象放在缓存中,但是这个多起时间设置短一点(因为如果空对象过多的话,也会导致对系统性能的影响)

2、用布隆过滤器

将所有的数据(可能存在的)通过哈希放到一个bitmap中,如果这时候查询一个一定不存在的数据,就会被bitmap拦截住。从而避免了对持久层数据库的压力。

9、什么是缓存雪崩(大量热点key),解决办法?

先看缓存击穿的概念

缓存雪崩就是由一大批的key一起失效,大量的请求全部击穿Redis,直接访问数据库造成数据库崩溃。

解决办法

不让大量的Redis热点数据在同一时间失效,可以将redis失效时间加上一个随机值,还有加上一个缓存标记。

真实数据的失效时间是这个缓存标记的两倍,当缓存标记失效后,马上更新缓存标记和真实数据的失效时间,这样就可以保证真实数据的失效时间永远不能到。

10、什么是缓存击穿(查得到,但量大,一个热点key),解决办法?

是指一个key是热点数据,扛住了大并发,但是当这个key过期后,持续的大并发就会将缓存击穿,直接访问数据库。

解决办法

1、设置热点数据不过期,没有过期时间。

2、加上互斥锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有分布式锁的权限,因此不会对系统造成压力。

11、Redis 的持久化方式哪些?

RDB 和 AOF 方式

  • RDB(默认)

是以数据快照形式的进行保存数据的,按照一定时间周期来将内存的数据保存到硬盘中的二进制文件。通过更改配置文件save参数定义快照周期。

  • AOF

是保存每一个命令,通过追加的方式将所有的命令写到文件中,类似mysql中binlog。Redis重启会通过执行文件中的内容重建数据库的内容。

RDB和AOF的区别

  • RDB的性能比AOF的好
  • AOF文件比RDB更新频率高,如果开启aof,优先使用AOF还原数据
  • AOF比RDB安全性好
  • 如果两者都配置了,优先加在AOF

12、如何保证数据和缓存一致性问题?

  1. 从理论上来说,只要设置合理的过期时间,我们就能保证缓存和数据库的数据最终是一致的。因为只要缓存的数据过期了,就会被删除,之后读的时候就需要在数据库中查询再保存在缓存中。除此之外还需要做一些其他操作来保证数据一致性问题。
  2. 新增、删除、更改数据库的同时尽量去更新redis,这样可以使用事务机制来宝镇而过数据的一致性。

13、Redis如何实现分布式锁?

分布式锁一般有三种实现方式

  • 数据库乐观锁
  • 基于Redis的分布式锁
  • 基于zookeeper的分布式锁

下面介绍Redis是如何实现分布式锁(原理):(具体步骤还是网上搜code)

  1. Redis是单线程模式,采用队列模式将并发变成串行访问,且多客户端对Redis的连接并不存在竞争关系。
  2. Redis中是使用setnx(set if not exists)实现分布式锁,表示只允许被一个程序占有,使用完后del锁

14、Redis 的淘汰策略哪些?

随便记记就行了,LRU(最近最少使用策略), 随机数据淘汰等等

15、Redis常见的性能问题和解决办法?

  • Maste最好不要做任何的持久化工作,如RDB内存快照和AOF日志文件,如果数据比较重要,通过Slave开启AOF备份数据,策略设置为每秒同步一次。
  • 为了主从复制的速度和链接的稳定性,Master和Slave最好在同一个局域网内
  • 主从复制不要用图状结构,用单项连链表更稳定。即主从关系为:Master<–Slave1<–Slave2<–Slave3 ,如果Master挂了,可以立马启用Slave1做Master,其他不变

16、Redis事务的了解?

概念:

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

总结下:redis事务就是一次性,顺序性,排他性的执行一个队列中的一系列命令。

Redis中事务没有隔离级别的概念

批量操作在发送exec命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。

Redis不保证原子性

Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

Redis事务的三个阶段:

  • 开始事务
  • 命令入队
  • 执行事务

Redis的事务的相关命令:

watch key1 key2 … 监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断 ( 类似乐观锁 )

multi:标记一个事务块的开始( queued )

exec: 执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 )

discard:取消事务,放弃事务块中的所有命令

unwatch:取消watch对所有key的监控

总结:

watch 指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值