目录
简要说一下什么是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同时失效,其破坏力比缓存击穿要大。
标签:AOF,面试题,缓存,后端,Redis,数据库,redis,RDB From: https://www.cnblogs.com/YuQiLe/p/16920158.html