Redis后端面试题
目录
简要说一下什么是Redis?
redis是最受欢迎的nosql数据库,其包含多种数据结构,支持网络,基于内存,可持久性键值对
- 基于内存运行,性能高效(每秒可以处理超过10万次读写操作)
- 支持分布式,理论上可以无限扩展
- 存储的形式是key-value形式(其中key是字符串,键有字符串,列表,集合,散列表,有序集合等)
你知道的有哪些大厂再用?
- github
- 微博
- 阿里
- 百度
- 美团
为什么要⽤Redis(缓存)?
主要是高性能和高并发方面得到的优化最多:
高性能:当用户第一次访问某一个数据的时候,需要去从硬盘里去读,这个过程比较慢,但是如果用了redis做缓存的话,会把读取过得数据放到缓存里面,下次再需要的时候就直接从缓存(内存)里面拿了,这个过程是比较快的。
举一个通俗易懂的例子感受一下:就好比是你在家里面做饭需要盐,如果家里面有的话,就直接拿来用(就好比缓存即内存),如果家里没有盐,就需要去超市(磁盘读取数据)去买,然后在存放在家里供下次使用,这个过程就比较耗时
高并发:直接操作缓存的速度是远远高于直接操作磁盘的,所以我们可以把数据库的部分数据存放到缓存里面,这样一部分的用户就可以直接操作缓存而不用经过数据库,这样就大大节省了开销,使得可以有更多的用户进行其操作,达到的效果就是在相同的时间内可以有更多的用户进行操作,从而达到了高并发的目的。
为什么要⽤Redis⽽不⽤map/guava做缓存?
缓存分为本地缓存和分布式缓存。
- 以Java为例,使⽤⾃带的map或者guava实现的是本地缓存,最主要的特点是轻量以及快速,⽣命周期随着jvm的销毁⽽结束,并且其缓存不具有⼀致性。
- 使⽤redis或memcached之类的称为分布式缓存,在多实例的情况下,各实例共⽤⼀份缓存数据,缓存具有⼀致性。
- 缺点是需要保持redis或memcached服务的⾼可⽤,整个程序架构上较为复杂。
Redis与Memcached的区别
两者都是⾮关系型内存键值数据库(nosql),现在公司⼀般都是⽤Redis来实现缓存,
Redis与Memcached主要有以下不同:
- memcached所有的值均是简单的字符串,redis作为其替代者,⽀持更为丰富的数据类型
- redis的速度⽐memcached快很多
- redis可以持久化其数据
Redis的应⽤场景
- 计数器:他可以对String进行自增自减的操作,从而实现计数器的功能,因为他是从内存中进行读写的,所以他的效率也是非常的高,适用于数据频繁的进行更改。
- 缓存:可以将热点数据放到内存中,然后设置内存的最大使用量,从而可以大大增加缓存的命中率,从而大大加快搜索效率。
- 会话缓存:一个用户可以会话多台应用服务器,通过进行会话缓存可以大大的加快在不同的应用服务器上的会话效率,举个例子:有三台服务器,登录其应用系统时需要登录,并且这三台服务器具有负载均衡功能,你第一次登录是1号主机,你需要登录,下次进入的时候负载均衡就有可能给你分配到了第二胎主机,你还是需要登录,这就很烦,如果有redis会话缓存的话,我们就只需要登录一次,其原理是,这三台服务器的背后共用的是同一个redis服务进程,所以三台服务器就是一个中间人,最终的效果是你和redis一对一进行验证登录。
- 页面缓存:可以加快你打开之前打开过的页面的速度,及内容加载速度。
redis为什么那么快
- 完全基于内存,其绝大部分的时间都是在和内存打交道,时间很快,其类似于hashMap,查找和操作的时间复杂度都是O(1)。
- 其数据结构是非关系型数据库,数据结构比较简单,对数据的操作也比较简单。
- 其采用的是单线程,不会出现资源占用,冲突,互锁的情况出现,也不会频繁的切换线程。
- 使用多路I/O复用,非阻塞I/o
- redis有自己的vm机制,不会像其他的系统一样需要在进行调用系统函数,会浪费一定的时间去请求和响应。
redis有哪些数据类型
redis有5种数据类型:其中包括:
- String
- List
- set
- zset
- hash
redis的持久化机制是什么
redis的效率高是因为其数据都是在内存里面存储,交互速率快,但其也有弊端,就是当服务器突然宕机,内存的数据就会丢失,这是万万不可取的,因此为了解决这个问题,提出了redis持久化机制。
其中,redis的持久化机制有两种:RDB持久化和AOF持久化
RDB持久化:RDB持久化就是将某个时间点上的redis数据保存到一个RDB文件中,这个RDB文件是一个二进制文件,一旦出现宕机的情况,可以通过该文件还原生成RDB文件时Redis的数据。其中创建RDB文件的常用命令问:BGSAVE
载入RDB文件:载入RDB文件的目的是通过其上面的二进制文件对redis数据进行还原,从而到达备份的目的,但是载入RDB文件并没有专门的执行命令,而是在服务器启动时自动执行的。但是,系统能不能自动执行RDB文件也有条件限制:
- AOF持久化机制是否关闭,如果AOF持久化机制关闭才会去执行RDB文件,否则就去执行AOF文件,说白了就是AOF文件的优先级更高。
AOF持久化:AOF持久化是通过保存客户端发来的写命令来记录存储的数据记录的,但AOF通过这种方式存储数据占用的空间会远大于RDB文件,所以在默认的情况下AOF机制是默认关闭的,如果想要打开,需求修改其配置。
RDB持久化与AOF持久化的区别与联系
联系:都是为redis保存数据为最终目的
区别:
实现方式:
- RDB机制是通过保存redis内存数据到RDB文件,然后载入RDB文件来达到可持久化的。
- AOF机制是通过保存输入redis的写入数据的命令来存储数据的,然后通过载入AOF文件即重新执行一下AOF保存的命令,从而达到了持久化的功能。
文件体积:
- RDB文件记录的是结果,而AOF文件记录的是过程。大部分的情况下AOF的文件体积是要大于RDB文件体积的。
安全性:
- AOF的安全性要比RDB的安全性要好
- 因为AOF文件的安全性存储的是指令过程,所以一旦数据丢失,丢失的也只是上1秒丢失的指令
- RDB文件一旦数据丢失,丢失的可就是上次传入的整个文件,同等情况下AOF要比RDB丢失的数据少。
优先级:
- AOF文件的优先级要比RDB的优先级要高。
reids的缓存穿透,击穿和雪崩
缓存穿透:
指访问的key值缓存和数据库都没有。会先访问缓存,缓存没有的话就会访问数据库,而在访问数据库的过程中,需要遍历数据库的所有值,就会给数据库带来很大的压力,从而造成系统瘫痪。
解决办法:
- 一般都是恶意进行攻击的,可以对其进行身份验证,阻止其频繁的访问。
- 或者是可以通过将其key值保存到一个空的value值供其取,从而减小数据库的压力。
缓存击穿:
指大量请求访问缓存中的一个key时,该key过期了,导致这些请求都同时去直接访问数据库,短时间内出现大量的请求可能会将数据库击垮。
解决办法:
- 添加互斥锁或分布式锁,先让一个线程访问数据库,然后将数据放到缓存里面,后面的线程就直接从缓存中获取,不仅高效还能够减小数据库的压力。
- 设置热点数据key不过期,定时更新缓存,但如果更新出问题会导致缓存中的数据一直为旧数据。
缓存雪崩:
指在系统运行过程中,缓存服务宕机或大量的key值同时过期,导致所有请求都直接访问数据库导致数据库压力增大。
解决办法:
- 将key的过期时间打散,避免大量key同时过期。
- 对缓存服务做高可用处理。
- 加互斥锁,同一key值只允许一个线程去访问数据库,其余线程等待写入后直接从缓存中获取。
如何快速记忆:
缓存穿透是通过频繁访问直接把数据库搞炸了。
缓存击穿是针对一个key失效,同时访问把数据库搞炸了。
缓存雪崩和缓存击穿类似,不同点是,涉及到多个key同时失效,其破坏力比缓存击穿要大。
Redis后端面试题的更多相关文章
- python后端面试题
1. 果壳 电话面试: 说一下TCP的三次握手,四次挥手,为什么会这样? http安全的性的了解,说一下对cookie和session的了解: 对mysql的了解,说一下你常用的数据类型,char和v ...
- 大小厂必问Java后端面试题(含答案)
你好,我是yes. 这个系列的文章不会是背诵版,不是那种贴上标准答案,到时候照着答就行的面试题汇总. 我会用大白话尽量用解释性.理解性的语言来回答,但是肯定没有比平时通过一篇文章来讲解清晰,不过我尽量 ...
- 小米Python后端面试题
电话面 时长:30m 说一下对浏览器缓存的理解: 说一下MySQL优化: 说一下redis: 说一下从输入url到返回都发生了什么: 域名怎么解析的: 一面 1h 编程实现翻转单链表: MySQL中v ...
- java后端面试题汇总
转载链接:https://www.nowcoder.com/discuss/90776?type=0&order=0&pos=23&page=0 基础篇 数据结构与算法 线性表 ...
- [转帖]关于一个 websocket 多节点分布式问题的头条前端面试题
关于一个 websocket 多节点分布式问题的头条前端面试题 https://juejin.im/post/5dcb5372518825352f524614 你来说说 websocket 有什么用? ...
- 前端面试题2016--HTML
本文由我收集总结了一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习.透彻学习,形成自己的知识链.万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的!也是不可能的!不可能的!不可 ...
- 【web前端面试题整理02】前端面试题第二弹袭来,接招!
前言 今天本来准备先了解下node.js的,但是,看看我们一个小时前与一个小时后的差距: 既然如此,我们继续来搜集我们的前端面试题大业吧!!! 特别感谢玉面小肥鱼提供哟,@玉面小飞鱼 题目一览 Jav ...
- 各大互联网公司前端面试题(js)
对于巩固复习js更是大有裨益. 初级Javascript: 1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型 ...
- 2016最全的web前端面试题及答案整理
面试web前端开发,不管是笔试还是面试,都会涉及到各种专业技术问题,今天小编整理了一些常见的web前端面试题及答案,希望对大家有所帮助. 1.常用那几种浏览器测试?有哪些内核(Layout Engin ...
- 常见前端面试题之HTML/CSS部分
转自http://www.cnblogs.com/jscode/archive/2012/07/10/2583856.html Doctype是什么?如何触发严格模式与混杂模式模式?区分它们有何意义? ...
随机推荐
- java HashMap的四种获取key,value的方式
初学java不久,我觉得这样将学到的东西总结下来非常好,如果有一天有些地方忘记了 可以回过头来翻看,不用来回的找,非常好,也是一个很好的习惯 今天主要将记录获取hashMap的key,value的几种 ...
- css 属性选择器需要加引号吗
平常我们是不加引号的: HTML: <div data-a='aq1'>99</div> CSS: [data-a=aq1]{ color: #f00; } 想加上也行 ...
- offer_48
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路: /* 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计 ...
- centos mininet安装-坑
https://blog.csdn.net/milesandnick/article/details/108017349?utm_medium=distribute.pc_relevant.none- ...
- 青少年CTF-Hanser!![wp]
一 题目描述 二 解题步骤 1. hanser.txt Anemḍiq-nni ...
- 苹果App 上架 app store 提示 “构建版本错误”使用Application Loader发布App
步骤1 打开Application Loader(有2种方法) 或 步骤2 使用开发者帐号登录 步骤3 选择需要上传发布的ipa包 选择成功后,会显示ipa包的相关信息 步骤4 上传验证 上传成功 转 ...
- torrent种子
- java ArrayList 原理
概述 底层通过数组实现,所以 查询/更新效率很高,删除/增加跟位置相关,除未实现同步外和 Vector 大致相同 自动扩容,每次扩容大概 1.5 倍,扩容代价比较高尽量避免 实现了 RandomAcc ...
- vue 中使用 XLSX 和 xlsx-style 实现前端下载Excel表格
import XLSX from "xlsx-style" //ps 需要修改源码:在\node_modules\xlsx-style\dist\cpexcel.js 807行 ...
- nginx通过参数代理到其他站点
http { include mime.types; default_type application/octet-stream; resolver 8.8.8.8; ##Nginx0.6.18以后的 ...