前言

前天面试了一家公司,平时看一本redis书的也使用redis,对里面的东西也基本了解,结果回答的时候居然回答了只是使用了(因为认为是redis是运维的东西,做的东西多,所以忘了,好吧这是借口),因为害怕被继续问,所以说。。。。

基础的还是要快速回答出来的,前车之鉴啊。当然下面的面试题中会加入自己的一些见解。持续更新。。。。后面会加入代码全部演练一遍。

正文

redis 速度快

(一)纯内存操作

(二)单线程操作,避免了频繁的上下文切换

(三)采用了非阻塞I/O多路复用机制

二 : 这里进行一些介绍,就是说线程的切换其实是这样子的,比如说A 线程切换到B线程,那么其实是要保护好A的状态,这个状态用于后续切换到A的时候,可以进行继续操作。

三: 非阻塞 I/0多路复用机制 https://www.cnblogs.com/hello-/articles/9599380.html

redis 持久化机制

redis 是一个支持持久化的内存数据库,通过持久化吧内存的数据同步到硬盘来保证数据持久化。

当redis 重启后,通过把硬盘文件重新加载到内存中,就能达到恢复数据的目的。

实现:fork一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后子进程写入到临时文件中,持久化的过程结束,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。

RDB是redis 默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即snapshot 快照存储,对应产生的文件为 dump.rdb,通过配置文件的save 参数来定义快照的周期。

AOF:redis 会将每一个收到的写命令通过write函数追加到文件最后,类十余mysql binlog。当redis 重启会重新执行文件中保存的写命令在内存中重建整个数据库内容。

当这两种同时开启时,数据恢复redis 会优先选择AOF 恢复。

如何解决rdb中的数据丢失问题,AOF和RDB同时开启,AOF 效率低,但是只有RDB 出现问题得时候,才启动AOF。

redis 缓存雪崩

什么是缓存雪崩呢?

其实是一个很常见的一个概念,比如说数据量很大,但是设置的时间都是在同一个点,那么会产生一个问题,那就是这些数据可能在同一个时间过期,那么这个时候所有的查询都去查询数据库了。

那么这个时候最好是时间错开从而达到目的。

1.给缓存的失效时间,加上一个随机值,避免集体失效。

2.使用互斥锁,吞吐量明显下降。

3.使用双缓存,比如说缓存A、B。缓存A的失效时间为5分钟,缓存B不设置失效时间。

步骤如下:

1.A 有数据就从A 中读取。

2.A没有数据,直接从B读取数据,直接返回,并且开启一个异步线程,去更新A中的数据。

3.更新线程中同时去更新A和缓存B。

redis 缓存穿透

缓存穿透是指用户查询的数据,数据库中不存在,那么缓存中也没有,那么这个时候会一直查询数据库,所以叫做穿透。

解决方法:

1.布隆过滤器

将所有可能存在的数据哈希到一个足够大的bitmap中,一个不存在的数据会被bitmap拦截,从而避免了对底层存储系统的查询压力。

2.如果查询到的数据为空,依然对这个结果进行缓存,但是他的过期时间小,这样就不会出现缓存击穿的情况。

了解布隆过滤器。

个人见解:这其实有一种很老套的攻击手法,以前的时候很多人就通过每次查询的是一些数据库里面不存在的信息,那么每次都会去查询数据库。

缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样可以避免用户在请求的时候先查询数据库。

解决思路:

1、直接写个缓存刷新页面,上线时手工操作下;

2、数据量不大,可以在项目启动的时候自动进行加载;

3、定时刷新缓存;

缓存降级

缓存降级是指当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。

redis 缓存失效策略

(1)定时去清理过期的缓存;

(2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。

两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。

redis 线程模型

文件事件处理器分别包括套接字、IO多路复用程序、文件事件分派器、一级事件处理器。

使用多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的时间处理器。

当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

I/O 多路复用程序负责监听多个套接字, 并向文件事件分派器传送那些产生了事件的套接字。

redis 五种模型

相对用户而已:

1.string

value 可以是string 也可以是数字,一般做一些复杂的计算功能的缓存。

2.hash

value 存放的是结构化的对象,比较方便的就是操作其中的某个字段。

比如说单点登录的时候,这种数据结构存储用户信息,cookieId 作为key,设置30分钟缓存来作为过期时间。

3.list

可以作为简单的消息队列功能,先进先出原则很好作为队列。还可以通过lrang,做基于redis的分页功能,性能极佳,用户体验好。

4.set

set 可以作为一个去重的集合。

同时,可以进行交集、并集、补集等操作,比如说计算共同爱好。

5.sorted set

sorted set 比set 多了一个score,可以按照score进行排序,排行榜等。

redis 面试题整理的更多相关文章

  1. 转:2018最全Redis面试题整理

    Java面试----2018最全Redis面试题整理 1.什么是Redis? 答:Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-va ...

  2. [转]最全Redis面试题整理

    此为转载文章,仅做记录使用,方便日后查看,原文链接:http://www.bieryun.com/3405.html 1.什么是Redis? 答:Redis全称为:Remote Dictionary ...

  3. 50道Redis面试题及答案整理,史上最全!

    在网上看到有关Redis的50道面试题,但是没有给出答案,之前我也在寻找这份Redis面试题的答案,今天特地把答案分享出来. 花了大量时间整理了这套Redis面试题及答案,希望对大家有帮助哈~ 弄明白 ...

  4. JAVA面试题整理(7)-Redis

    Redis面试题汇总 1.Redis用过哪些类型数据,以及Redis底层怎么实现 分析:是不是觉得这个问题很基础,其实我也这么觉得.然而根据面试经验发现,至少百分八十的人答不上这个问题.建议,在项目中 ...

  5. 46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)

    Redis高性能缓存数据库 1.什么是 Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像m ...

  6. 金九银十,史上最强 Java 面试题整理。

    以下会重新整理所有 Java 系列面试题答案.及各大互联网公司的面试经验,会从以下几个方面汇总,本文会长期更新. Java 面试篇 史上最全 Java 面试题,带全部答案 史上最全 69 道 Spri ...

  7. Python面试题整理-更新中

    几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...

  8. 史上最全Redis面试题及答案。

    花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案- 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检 ...

  9. 18家大厂Java面试题整理了350道(分布式+微服务+高并发)

    一.性能调优系列 1.Tomcat性能调优 JVM参数调优: -Xms 表示JVM初始化堆的大小, -Xmx表示JVM堆的最大值.这两个值的大小一般根据需要进行设置. 当应用程序需要的内存超出堆的最大 ...

  10. 史上最全Redis面试题(2020最新版)

    一个执着于技术的公众号 导读:2020 年最新版 Redis面试题,两万字干货,为方便读者阅读,已整理为PDF文档,后台回复『redis』即可领取.希望对大家有帮助! 概述 1. 什么是Redis? ...

随机推荐

  1. Vue3学习(二十三)- 保存文档内容正常显示

    写在前面 情人节已经接近尾声了,虽然跟我没什么关系,但是我还是很渴望,能遇到一个良人相伴一生. 现在时间: 内心异常平静,相对吵闹我更喜欢安静的晚上,没人打扰,enjoy自己独处的时间! 保存内容显示 ...

  2. 我为什么使用Linux做开发

    系统选择 目前市面上主流的桌面操作系统在大多数人眼里只有Windows和MacOS,那为什么我没选择它们两呢? 首先,不选MacOS的原因,就是太贵.当然这是我的原因不是苹果的原因,我最早使用Linu ...

  3. nginx 重写(rewrite) 重定向(return error_page) 详解

    使用 rewrite 指令用于重写URL Nginx的rewrite指令用于重写URL,它有几个参数,这些参数定义了如何匹配和重写请求的URL.以下是rewrite指令的常见参数及其说明: Regex ...

  4. Centos安装常见软件

    一.vscode sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e &qu ...

  5. 基于DSP的光纤麦克风声音采集系统硬件设计方案总结

    前记  光纤声传感器是一种利用光纤作为传光介质或探测单元的一类声传感器,相比传统电声传感器其具有灵敏度高.频带响应宽.抗电磁干扰等优越特性,可广泛应用于国防安全.工业无损检测.医疗诊断及消费电子等领域 ...

  6. Docker部署nginx配置SSL多目录

    对自己第一次搭建nginx做个简要的笔记 第一步:创建宿主机挂载点目录 mkdir -p /home/nginx/{conf,conf.d,html,log,ssl} 第二步:安装简易版nginx,复 ...

  7. JSP、Servlet中的相对路径和绝对路径

    http://www.webjx.com  更新日期:2005-03-31 11:11  出处:网页教学网  作者: JSP和Servlet中的绝对路径和相对路径问题困扰了我好几天,经过努力之后将其部 ...

  8. Android 使用系统JAR包

    项目开发过程中,经常有需要到系统jar包,导入系统jar包后,发现无法正常编译通过,针对此问题,下文简述下如何导入framework.jar ,并正常使用 1.导入framework.jar ,使用c ...

  9. PAT 甲级【1007 Maximum Subsequence Sum】

    本题是考察动态规划与java的快速输入: max[i]表示第i个结尾的最大的连续子串和.b begin[i]表示第[begin[i],i]为最大和的开始位置 超时代码: import java.io. ...

  10. 从零搭建react+ts组件库(二)less模块化与svg引入配置

    在上一篇<从零搭建react+ts组件库(一)项目搭建与封装antd组件>介绍了使用webpack来搭建一个基于antd的组件库的基本框架,但是作为一个组件库,实际上还有很多的都还未引入, ...