redis 面试题整理
前言
前天面试了一家公司,平时看一本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 面试题整理的更多相关文章
- 转:2018最全Redis面试题整理
Java面试----2018最全Redis面试题整理 1.什么是Redis? 答:Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-va ...
- [转]最全Redis面试题整理
此为转载文章,仅做记录使用,方便日后查看,原文链接:http://www.bieryun.com/3405.html 1.什么是Redis? 答:Redis全称为:Remote Dictionary ...
- 50道Redis面试题及答案整理,史上最全!
在网上看到有关Redis的50道面试题,但是没有给出答案,之前我也在寻找这份Redis面试题的答案,今天特地把答案分享出来. 花了大量时间整理了这套Redis面试题及答案,希望对大家有帮助哈~ 弄明白 ...
- JAVA面试题整理(7)-Redis
Redis面试题汇总 1.Redis用过哪些类型数据,以及Redis底层怎么实现 分析:是不是觉得这个问题很基础,其实我也这么觉得.然而根据面试经验发现,至少百分八十的人答不上这个问题.建议,在项目中 ...
- 46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)
Redis高性能缓存数据库 1.什么是 Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像m ...
- 金九银十,史上最强 Java 面试题整理。
以下会重新整理所有 Java 系列面试题答案.及各大互联网公司的面试经验,会从以下几个方面汇总,本文会长期更新. Java 面试篇 史上最全 Java 面试题,带全部答案 史上最全 69 道 Spri ...
- Python面试题整理-更新中
几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...
- 史上最全Redis面试题及答案。
花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案- 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检 ...
- 18家大厂Java面试题整理了350道(分布式+微服务+高并发)
一.性能调优系列 1.Tomcat性能调优 JVM参数调优: -Xms 表示JVM初始化堆的大小, -Xmx表示JVM堆的最大值.这两个值的大小一般根据需要进行设置. 当应用程序需要的内存超出堆的最大 ...
- 史上最全Redis面试题(2020最新版)
一个执着于技术的公众号 导读:2020 年最新版 Redis面试题,两万字干货,为方便读者阅读,已整理为PDF文档,后台回复『redis』即可领取.希望对大家有帮助! 概述 1. 什么是Redis? ...
随机推荐
- 牛客周赛34(A~E)
A 两种情况 两个字符相同只有2 两个字符不相同4 #include <bits/stdc++.h> #define int long long #define rep(i,a,b) fo ...
- nest.sh 脚本 发布服务
每次发布后端nest 直接执行一个脚本即可 给脚本赋值权限 chomd 777 nest.sh nest.sh 脚本 #!/bin/bash cd /root/gateway-study git pu ...
- court 法院 单词记忆
court 围绕得到 - 法院 讨好 c 表示得到 catch助记 ourt = turn = around = 围绕 围绕得到某一事物的地方或者行为 英[kɔːt],美[kɔrt] n. 法院, 法 ...
- vue中setTimeout之前 一定要 clearTimeout 否则将失效
window.clearTimeout(this.singleClick) // 这句很重要,否则不起作用 this.singleClick = window.setTimeout(() => ...
- WPF之事件
目录 WPF的树形结构 事件 路由事件 使用WPF内置路由事件 自定义路由事件 ButtonBase类的Click路由事件 创建一个路由事件 RoutedEventArgs的Source与Origin ...
- 手撕fft算法--fft原理和源码解析
一 前言 在音频信号处理中,fft变换是一个无法绕过过去的存在.借着一次算法出来的机会,把fft熟悉一下不为过啊. 二 问题 这里,其实是由一个问题驱动的,那就是:怎么通过fft的变化来得 ...
- 5分钟上手Python爬虫:从干饭开始,轻松掌握技巧
很多人都听说过爬虫,我也不例外.曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大.因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容.广告? ...
- tomcat报错Exception loading sessions from persistent storage解决方案
现象:项目在重启时报错:严重: Exception loading sessions from persistent storage的问题.该问题的原因是tomcat的session持久化机制引起的, ...
- zynq之TF卡写入常见问题
zynq之TF卡写入常见问题 1.基本原理 前面做过zynq的TF读写实验,使用串口返回了实验所需的现象.那个时候也没有深究头文件"ff.h"里的几个常用的函数.这次需要使用TF卡 ...
- KingbaseES kdb_database_link客户端字符集导致的乱码问题
前言 关于我们经常见到的字符集乱码问题,很可能因为数据库服务器端的操作系统字符集和客户端字符集不一致导致的. 当我们通过kdb_database_link插件访问oracle数据库出现乱码,只需要调整 ...