JAVA实习生第十一次面试题打卡——Redis篇

Posted Code_BinBin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA实习生第十一次面试题打卡——Redis篇相关的知识,希望对你有一定的参考价值。

秋招马上要开始了,为了进入好公司,刷面试题可不能停

01、什么是redis

redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合] hash(hash表))

02、为什么要使用redis

当我们做了一个项目,比方说个人博客,我们把这个项目发布到自己的服务器,一般来说,我们做的这个项目没有商用,访问量会很小,这个时候,我们不使用redis也可以,可以要访问量直接经过mysql,我们都知道,mysql是在磁盘上面,读取需要一点时间,访问量小的时候,这些时间我们可以忽略不及。
但是,当我们做了一个大型的商用项目,例如淘宝,那么访问量就会成几何数上升,特别是双十一的时候,并发量更是达到顶峰,这个时候,如果我们还是用mysql,那么大量的访问会让服务器处理速度非常的慢,甚至宕机,所以这个时候我们就要使用redis
redis是在内存上面,我们知道内存读取数据非常的快,当大量的访问量余姚访问某一个数据的时候,我们把这个数据存放在redis里面,那么这样,我们的服务器就不会宕机。

03、什么是redis雪崩

当大量的redis失效的时候,大量的访问直接打在我们的数据库上面,于是导致服务器访问变慢甚至宕机。

解决方法:

  • 设置redis永远不会过期
  • 给每个redis设置随机的过期时间

04、什么是redis击穿

当出现一个热点数据,譬如说当年鹿晗和关晓彤谈恋爱的时候,这个就是一个热点数据,当有大量的访问同时访问一个数据,然后这个热点数据在某个时进段过期了,那么大量的请求就会打在我们的数据库上面,便会造成服务器的宕机。

解决方法:

当redis热点数据失效时,我们把全部的访问量锁住,只通过一个访问,让他去数据库查询,查询到数据之后,redis上便会存在所需要的数据,然后这个时候在放行全部的请求,这样全部的请求就打在redis上面,不会打到我们的数据库了。

05、什么是redis击穿

当我们访问是需要携带参数的,比方说携带id=1这样的参数,访问后就在内存里面存下查询到的数据,但是有些人会发起一些恶意请求,比方说id=-1000,id=sadasdsa这样的,那么这些是不存在的,当这样的请求一旦多了起来,那么数据库就很有可能被打爆。

解决方案

有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
另外也有一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

06、Redis 常见的数据结构

基础

  • String:字符串,最基本的类型
  • List:列表
  • Hash:哈希
  • Set:无序集合
  • Zset:有序集合

高级

  • HyperLogLog:通常用于基数统计(例如,网站访客统计)
  • Bitmap:位图
  • Stream:主要用于消息队列,类似于 kafka,可以认为是 pub/sub 的改进版。提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
  • Geo :redis 3.2 版本的新特性。可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作:获取2个位置的距离、根据给定地理位置坐标获取指定范围内的地理位置集合。

07、Redis 在项目中的使用场景

计数器

可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

缓存

将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。

会话缓存

可以使用 Redis 来统一存储多台应用服务器的会话信息。当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。

全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

查找表

例如 DNS 记录就很适合使用 Redis 进行存储。查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。

消息队列(发布/订阅功能)

List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。不过最好使用 Kafka、RabbitMQ 等消息中间件。

分布式锁实现

在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。

其它

Set 可以实现交集、并集等操作,从而实现共同好友等功能。ZSet 可以实现有序性操作,从而实现排行榜等功能。

08、Redis 是单线程还是多线程的?

  • redis 4.0 之前,redis 是完全单线程的。
  • redis 4.0 时,redis 引入了多线程,但是额外的线程只是用于后台处理,例如:删除对象,核心流程还是完全单线程的。(核心流程指的是 redis 正常处理客户端请求的流程,通常包括:接收命令、解析命令、执行命令、返回结果等。)
  • redis 6.0 中,多线程主要用于网络 I/O 阶段,也就是接收命令和写回结果阶段,而在执行命令阶段,还是由单线程串行执行。

为什么 Redis 是单线程?

  1. redis是基于内存的操作
  2. redis使用了I/O多路复用模型
  3. 单线程可以避免不必要的上下文切换和竞争条件,减少了性能消耗
  4. 在 redis 6.0 之前,redis 的核心操作是单线程的。因为 redis 是完全基于内存操作的,通常情况下CPU不会是redis的瓶颈,redis 的瓶颈最有可能是机器内存的大小或者网络带宽。

09、Redis 的持久化机制是什么?各自的优缺点?

RDB(默认)

RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。


优点:

  • 只有一个文件 dump.rdb,方便持久化。
  • 容灾性好,一个文件可以保存到安全的磁盘。
  • 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
  • 相对于数据集大时,比 AOF 的启动效率更高。

缺点:

  • 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
  • AOF(Append-only file)持久化方式:是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。

AOF

AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。


优点:

  • 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
  • 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
  • AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))

缺点:

  • AOF 文件比 RDB 文件大,且恢复速度慢。
  • 数据集大的时候,比 rdb 启动效率低。

两者对比

  • AOF文件比RDB更新频率高,优先使用AOF还原数据。
  • AOF比RDB更安全也更大
  • RDB性能比AOF好
  • 如果两个都配了优先加载AOF

如何选择合适的持久化方式

  • 一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
  • 如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。
  • 有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。
  • 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。

10、Redis的过期键的删除策略

众所周知,redis是非关系型数据库,我们可以设置key的过期时间,redis的过期策略就是说说当redis缓存的key过期了,redis应该怎么处理

过期策略有以下三种:

  1. 定时过期:每个key都需要设置过期时间,时间一到就会马上清除,这个方法可以马上清除过期的数据,对内存很友好,但是会占用大量的cpu资源去处理过期数据,从而影响缓存的响应时间和吞吐量
  2. 惰性过期:只有当有某个访问用到这个key的时候,才会判断这个key是否过期,过期就清除,没过期便不会,这样节省了很多的cpu资源,但是对内存不友好,有可能出现一大堆没有过期的key存在内存
  3. 定期过期:每过一段时间,会扫描一定数量的key,清除过期的,这个是一个折中方案

Redis key的过期时间和永久有效分别怎么设置?

EXPIRE和PERSIST命令。

10、Redis的内存用完了会发生什么?

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

今天的面试题学习结束,你今天刷面试题了吗???

以上是关于JAVA实习生第十一次面试题打卡——Redis篇的主要内容,如果未能解决你的问题,请参考以下文章

JAVA实习生第十二次面试题打卡——Redis篇

JAVA实习生第十二次面试题打卡——Redis篇

第十次JAVA实习生面试题打卡

Java实习生每日10道面试题打卡!

Java实习生每日10道面试题打卡!

Java实习生每日面试题打卡——计算机网络篇