文章目录

  • 前言
  • 1.Redis的高并发和快速原因?你为什么选择redis?Redis跟其他缓存相比,优势在哪里?
  • 2.redis为什么是单线程的?
  • 3.Redis的单线程的优劣性?
  • 4.Redis中的数据类型有哪些?
  • 5.跳表的原理是什么?
  • 6.Redis相关命令
  • 7.持久化方式有哪些?有什么区别?
  • 8.你了解Redis事务机制吗?
  • 9.什么是悲观锁?什么是乐观锁?
  • 10.主从复制的原理:
  • 11.主从复制的三种方式
  • 12.什么是哨兵机制?哨兵机制的工作原理是什么?
  • 13.知道什么是热key吗?热key问题怎么解决?
  • 14.什么是缓存击穿、缓存穿透、缓存雪崩?
  • 15.Redis的过期策略有哪些?
  • 16.那么定期+惰性都没有删除过期的key怎么办?

前言

具行业大佬打听得知,redis一直是各公司面试必问的,今天斗胆从大佬 电脑中窃取到redis面试题目,舍命分享给大家,望大家珍惜,不用谢我,因为我叫雷锋。


答应我背下来好吗????

1.Redis的高并发和快速原因?你为什么选择redis?Redis跟其他缓存相比,优势在哪里?

  • redis是基于内存的,内存的读写速度非常快;
  • redis是单线程的,省去了很多上下文切换线程的时间;
  • redis使用I/O多路复用技术,可以处理并发的连接。(客户端的连接不占用线程资源,只有当命令成功发送的时候,才会进入单线程,然后依次执行)

解释:多路:多个socket、多个客户端、多个黑窗口
复用:多用一个线程

图解如下:

2.redis为什么是单线程的?

  • 官方答案:因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

3.Redis的单线程的优劣性?

  • 单线程的优势:代码清晰,处理逻辑简单
  • 单线程的劣势:无法发挥多核CPU的性能,不过可以通过在单机开多个Redis实例来完善。

4.Redis中的数据类型有哪些?

  • String:字符串类型,一个key对应一个值,可以存储任何内容,图片、视频都行,但是大小限制在512M以内。
  • List:列表,单键多值,值可以重复。
  • Set:集合,单间多值,值不可以重复。
  • Hash:散列,key后面跟着field属性,从而确定一个值。
  • zSet:有序集合,单键多值,有序不重复集合,可以自动排序。

5.跳表的原理是什么?

  • 跳表是一个随机化的数据结构,实质是一种可以进行二分查找的有序链表。跳表是在原有的有序链表上增加了多级索引,通过索引可以进行快速查找。跳表不仅可以提高搜索的性能,而且能提高插入和删除的性能。Redis中的zSet集合底层就是运用了这种数据结构。

6.Redis相关命令

Redis key

  • 1.exists key判断某个key是否存在
  • 2.expire key 10 10秒钟:为给定的key设置过期时间

String

  • 1.setnx key value :只有在key不存在的时候设置key的值
    常用来做分布式锁
  • 2.incrby / decrby <步长>将 key 中储存的数字值增减。自定义步长

补充:Incr和decr是原子操作,java的i++是原子操作吗?不是

List

  • 1.lpop/rpop 从左边/右边吐出一个值。值在键在,值光键亡。
  • 2.lrange 根据范围取值
  • 3.lpush/rpush存值

Set

  • 1.sadd …
    将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
  • 2.smembers 根据范围取值
  • 3.set类型数据的扩展操作
    sinter 返回两个集合的交集元素。
    sunion 返回两个集合的并集元素。
    sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)

Hash

  • 1.hset 给集合中的 键赋值
  • 2.hget 从集合取出 value
  • 3.hexists 查看哈希表 key 中,给定域 field 是否存在。

Zset

  • 1.zrangebyscore key minmax [withscores] [limit offset count]返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
  • 2…zrevrangebyscore key maxmin [withscores] [limit offset count] 同上,改为从大到小排列。
  • 3.zincrby 为元素的score加上增量
  • 4.zcount 统计该集合,分数区间内的元素个数

7.持久化方式有哪些?有什么区别?

redis持久化方式分为RDB和AOF两种。

RDB:

  • RDB持久化可以手动执行也可以根据配置定期执行,它的作用是将某个时间点上内存中的数据保存到RDB文件中,RDB文件是一个压缩的二进制文件,通过它可以还原数据。由于RDB文件是保存在硬盘上的,所以即使redis崩溃或者退出,只要RDB文件存在,就可以用它来恢复数据。

可以通过save或者bgsave来生成RDB文件

1.save命令会阻塞redis进程,直到RDB文件生成完毕,在进程阻塞期间,redis不能处理任何命令请求,这显然是不合适的。
2.bgsave则会创建一个子进程,然后由子进程去复制生成RDB文件,父进程还可以继续处理命令请求,不会阻塞进程。

AOF:

  • AOF和RDB不同,AOF保存的是命令,将写的命令保存起来。
  • AOF通过追加、写入、同步三个步骤来实现持久化机制。
    1.当AOF持久化处于激活状态,服务器执行完写命令之后,写命令将会被追加到aof缓冲区的末尾。
    2.在服务器结束一个事件之前,将会调用flushAppendOnlyFile函数决定是否将aof缓冲区的内容保存到AOF文件中,可以通过配置appendfsync来决定。
    配置如下:
always 实时同步
everysec 每秒同步
no 同步时间由操作系统决定

默认选择是everysec,即每秒同步。

8.你了解Redis事务机制吗?

redis通过multi、exec、watch等命令来实现事务机制,事务执行过程是将多个命令按照顺序一次性执行,并且在执行期间,事务不会被打断,也不会去执行客户端的其他请求,直到所有命令执行完毕。事物的执行过程如下:

  • 1.事务以multi开始
  • 2.如果客户端正处于事务状态,则会把执行命令放入队列,并且返回给客户端queued,反之则直接执行这个命令。
  • 3.当redis接收到客户端的exec命令时,watch命令将会监视整个事务中的key是否有被修改,如果有则返回空,表示失败,否则redis会遍历整个事务队列,执行队列中的所有命令,最后返回结果给客户端。

9.什么是悲观锁?什么是乐观锁?

  • 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都会认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会等待,知道拿到锁。传统的关系型数据库就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前就先上锁。
  • 乐观锁(Optimistic Lock)顾名思义,就是很乐观,每次去拿数据的时候都会认为别人不会修改数据,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。redis就是利用这种check-and-set机制实现事务的。

10.主从复制的原理:

  • 当从服务器连接上主服务器之后,从服务器就会向主服务器发送一个sync命令进行数据同步操作
  • 当主服务器接收到从服务器发送过来的同步命令,先将主服务器数据进行持久化,生成rdb文件,然后把rdb文件发送给从服务器,从服务器拿到rdb文件进行读取,完成复制。
  • 每次主服务器进行写操作之后,都会和从服务器进行数据同步。
  • 全量复制:从机第一次连接主机,主机所有的数据将会同步给从机。
  • 增量复制:主机继续将新的数据依次传给从机
  • 但是只要是重新连接主机(即从机发出slaveof命令),全量复制都会自动执行

如图所示:

11.主从复制的三种方式

  • 方式一:一主多从(一台主机可以连接N台从机)
  • 方式二:薪火相传(从机可作为其他机器的主机)
  • 方式三:反客为主(主机宕机,从机可通过执行slaveof no one变成主机)

12.什么是哨兵机制?哨兵机制的工作原理是什么?

  • 主从架构中,主机宕机,从机无法自动上位,需要手动上位,而哨兵机制就是自动上位。
  • 原理:基于主从方案的缺点还是很明显的,假设主机宕机,那就不能写入数据,那么从机就失去了作用,整个架构就不可用了,除非你手动切换,主要原因就是没有自动故障转移机制。而哨兵具备自动故障转移、集群监控、消息通知等功能。
  • 哨兵可以同时监视多个主从服务器,并且在被监视的主机下线时,自动将摸个从机提升为主机,然后由新的主机继续接收命令。
  • 哨兵会每隔1秒向所有实例(包括主从服务器和其他哨兵)发送ping命令,并且根据回复判断是否已经下线,这种方式叫主观下线。当判断为主观下线时,就会向其他监视的哨兵询问,如果超过半数的投票认为已经是下线状态,则会标记为客观下线,同时触发故障转移。

原理如图所示:

13.知道什么是热key吗?热key问题怎么解决?

  • 所谓热key问题就是,突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致服务器宕机。

  • 针对热key的解决方案:
    1.提前把热key打散到不同的服务器,降低压力
    2.加入二级缓存,提前把热key加载到二级缓存中,如果redis宕机,走二级缓存查询

14.什么是缓存击穿、缓存穿透、缓存雪崩?

  • (1)缓存穿透:
    缓存穿透是指查询内存和数据库都不存在的数据,每次请求都会打到数据库上,从而压垮数据库。

解决方案:

  • 1 缓存null:根据id=30000去数据可查找user,user=null,也将user=null放到redis中
  • 2 使用布隆过滤器:是一种数据结构,判断值肯定不存在或者可能存在
    准备一个足够长的数组,将值存入数据库的时候,同时将key存入布隆过滤器
    查找key的时候,先去布隆过滤器中获取这个key的三个hash值,在根据hash值去布隆过滤器中获取值,三个值中有一个0,代表数据肯定不存在,如果三个值都是1,代表可能存在,再去数据库查找数据,

(2)缓存击穿:redis中不存在这个key,数据库中存在,key在redis中过期了,当大量请 求过来的时候,请求会直接打到数据库上,引起数据库崩溃

  • 解决方案:a.加锁:操作数据库的时候加锁
    B. 当某一个请求去数据库查询的时候,同时在redis中将值设为null,待他 从数据库查到数据返回后,设置具体的值

(3)缓存雪崩:redis中不存在这些key,数据库中存在,这些key在某一时间集中过期了, 当大量请求过来的时候,请求会直接打到数据库上,引起数据库崩溃

  • 解决方案:a.加锁
    C. 多级缓存
    D. 设置key 的不同的过期时间,比如固定的过期时间上在随机1-10分钟

15.Redis的过期策略有哪些?

redis主要有2种过期删除策略
惰性删除

  • 惰性删除指的是当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除。显然,他有一个缺点就是如果这些过期的key没有被访问,那么他就一直无法被删除,而且一直占用内存。
    惰性删除原理如下:

定期删除

  • 定期删除指的是redis每隔一段时间对数据库做一次检查,删除里面的过期key。由于不可能对所有key去做轮询来删除,所以redis会每次随机取一些key去做检查和删除。

16.那么定期+惰性都没有删除过期的key怎么办?

  • 假设redis每次定期随机查询key的时候没有删掉,这些key也没有做查询的话,就会导致这些key一直保存在redis里面无法被删除,这时候就会走到redis的内存淘汰机制。
    1.volatile-lru:从已设置过期时间的key中,移出最近最少使用的key进行淘汰
    2.volatile-ttl:从已设置过期时间的key中,移出将要过期的key
    3.volatile-random:从已设置过期时间的key中随机选择key淘汰
    4.allkeys-lru:从key中选择最近最少使用的进行淘汰
    5.allkeys-random:从key中随机选择key进行淘汰
    6.noeviction:当内存达到阈值的时候,新写入操作报错

redis面试必备的十大面试题相关推荐

  1. 算法面试必备-----数据仓库常见面试题

    算法面试必备-----数据仓库常见面试题 算法面试必备-----数据仓库常见面试题 问题:什么叫数据仓库? 问题:数据仓库建模 为什么需要数据仓库建模? 数据仓库建模方法? 1.ER模型 2.维度建模 ...

  2. 算法面试必备-----数据分析常见面试题

    算法面试必备-----数据分析常见面试题 算法面试必备-----数据分析常见面试题 1.统计学问题 问题:贝叶斯公式复述并解释应用场景 问题:朴素贝叶斯的理解 问题:参数估计 问题:极大似然估计 问题 ...

  3. 程序员挑战高薪,你必须会的十大面试题《一》

    程序员挑战高薪,你必须会的十大面试题<一> IT蓝豹 1:Android中五种数据存储方式分别是什么?他们的特点? (1)SharedPreference,存放较少的五种类型的数据,只能在 ...

  4. html5游戏面试题,关于HTML5的十大面试题

    1.html5的文档类型和字符集分别是什么? 答:/ 2.在html5中如何嵌入一段视频? 答: Your browser doesn't support audio embedding featur ...

  5. 程序员面试题 php_程序员面试必备PHP基础面试题 – 第十五天

    一.写出面相对象的三大特性以及定义? 封装 继承 多态 封装:对象以外的部分不能随意存取对象内部数据 继承:通过子类继承父类进行功能扩展 多态:对具有继承关系的不同类对象,可以对相同名称的成员函数调用 ...

  6. 【面试必备】java面试题视频讲解

    二.我们先来看看这份笔记到底有什么 1.先把kubernetes跑起来(先跑起来+创建kubernetes集群+部署应用+访问应用+Scale应用+滚动更新) 2.重要概念 3.部署kubernete ...

  7. 【面试必备】Swiftnbsp;面试题及其答案

    原文:Swift Interview Questions and Answers 原作者:Antonio Bello 原作者介绍: Antonio 拥有丰富的编程经验.他开始编程的时候,内存单位还是 ...

  8. 面试必备,Linux面试题和答案!

    作为测试开发,对于Linux相关知识,不管是面试还是工作,多多少少你还是得会点. 再说了,现在行情极差,要求又高,linux也是面试重头戏,所以,今天给你分享Linux相关面试题和答案. 题目 1.绝 ...

  9. php 类分开写,程序员面试必备PHP基础面试题 – 第十七天

    一.写一段文件上传代码,要求只能上传图片格式,大小限制5M Action.php: $name=$_FILES['pic']['name']; $type=$_FILES['pic']['type'] ...

最新文章

  1. “云智一体”的全场景智能视频技术是什么?
  2. R语言ggplot2可视化百分比显示实战:纵轴显示为百分比、在柱状图上显示百分比、按照因子变量绘制分组子图(纵轴显示为百分比)、可视化图中显示数据百分比
  3. 【前端框架之Bootstrap 02】布局与导航
  4. python 安装第三方库,超时报错--Read timed out.
  5. 基于numpy科学计算库实现线性回归linear regression
  6. Java入门到超神(全网整理的复习资料)
  7. Excel数据透视表经典教程九《数据透视表计算》
  8. 博图如何上载wincc程序_博图导入触摸屏程序 如何通过博图下载触摸屏程序
  9. 微信小程序前端登录模块设计
  10. IOS 使用自签名证书开发HTTPS文件传输
  11. 华硕服务器如何重装系统,华硕win10重装系统步骤
  12. ethereum扫描区块,获取区块内的交易记录
  13. 百度网盘秒传链接怎么用及实现原理
  14. Invalid regular expression: invalid group specifier name safari白屏 chrome正常
  15. numpy求矩阵的逆和伪逆
  16. qmake -v,出现错误:qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake‘: No such file or direc
  17. 微信头脑王者服务器,微信头脑王者提示query server failed问题解决方法
  18. UI交互设计好学吗?如何成为优秀设计师
  19. 生命的法则——植渝轩语录
  20. 离散数学笔记和物联网工程导论笔记

热门文章

  1. Python: PS 图像特效 — 抽象画风
  2. Fegin的基本调用
  3. 在Ubuntu下配置舒服的Python开发环境
  4. 买iPhone13选某多多百亿补贴还是官网免息?我用Python帮你算好了!
  5. 增强学习在无人驾驶中的应用
  6. ssm+jsp计算机毕业设计云日记设计与实现3v652(程序+lw+源码+远程部署)
  7. 索尼A6300好不好用?
  8. 天锋w2019_三星W2019亲兄弟来袭!天锋W2019雷同的外观,更高端的性能
  9. 如何用电脑调试移动端苹果刘海屏手机
  10. vue-cli脚手架中如何查看具体的webpack配置