前言

前天面试了一家公司,平时看一本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. Java super关键字使用 +案列

    1 package com.bytezero.supertest; 2 /* 3 * 4 * super关键字使用 5 * 1.super:理解为 父类的 6 * 2.super可以使用调用:属性,方 ...

  2. springMvc精简整理

    精简共分步 新建一个web工程  导入核心就二包,因为springmvc 包自己有依赖 <?xml version="1.0" encoding="UTF-8&qu ...

  3. 基于STM32F407MAC与DP83848实现以太网通讯三(STM32F407MAC配置以及数据收发)

    本章实现了基于STM32F407MAC的数据收发功能,通过开发板的RJ45接口连接网线到电脑,电脑使用Wiershark工具抓包验证,工程源码.资料和软件见文末. 参考文档: DP83848IV英文 ...

  4. Error running 'Tomcat 8.5.27': Unable to open debugger port (127.0.0.1:2887): java.net.SocketException "Interrupted function call: accept failed"-火绒安全搞的鬼

    火绒安全-导致的tomcat8启动异常 一.问题由来 最近有个朋友在学习使用IDEA配置tomcat 8.5.99的时候,使用一切都正常,直到学习到使用Servlet实现文件 下载功能的时候,出现问题 ...

  5. 解决 Steam for Linux 部分 Valve 游戏中文显示问题/军团要塞2的字体显示问题

    解决 Steam for Linux 部分 Valve 游戏中文显示问题 发表于 Apr 7th 2019 | 分类于 Keep Digging Steam for Linux 上有许多好玩的免费游戏 ...

  6. 记录--优雅解决uniapp微信小程序右上角胶囊菜单覆盖问题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 大家好,今天聊一下在做uniapp多端适配项目,需要用到自定义导航时,如何解决状态栏塌陷及导航栏安全区域多端适配问题,下文只针对H5 ...

  7. 记录--Canvas实现打飞字游戏

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 打开游戏界面,看到一个画面简洁.却又富有挑战性的游戏.屏幕上,有一个白色的矩形框,里面不断下落着各种单词,而我需要迅速地输入这些单词.如果 ...

  8. 记录--react native 封装人脸 检测、美颜组件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本组件目前只能用在React Native 的iOS端 本组件来之实际中的开发需求:可以检测并且标记人脸,实现基本的美颜,可进行拍照.换行 ...

  9. 神经网络——基于sklearn的参数介绍及应用

    一.MLPClassifier&MLPRegressor参数和方法 参数说明(分类和回归参数一致): hidden_layer_sizes :例如hidden_layer_sizes=(50, ...

  10. [Java]静态代理、动态代理(基于JDK1.8)

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18002823 出自[进步*于辰的博客] 参考笔记一,P ...