前前后后,小孟已经帮助很多的小伙伴挺近了大厂。

1,专科的粉丝拿到了阿里的offer,小孟直呼不可思议

2,❤️专科出身拿到阿里offer,小孟直呼666!【付硬核面试】❤️

3,大三下学期挂科,大四奋发图强,拿到阿里offer​​​​​​​

我是农村出来的娃,从程序员到项目主管到产品经理,到现在公司出任CEO!技术改变了我的命运。

我身边越来越多的朋友,从农村出来到现在在大城市安身立命,甚至在一线城市买车买房。有的已经成为大厂的Leader,年薪200w+。

所以关注我,不迷路。小孟拥有极光的互联网关系,可以找我内推各个大厂。

极度的说明了,只要努力,一切皆有可能!

技术改变世界,知识改变命运!

兄弟们,鸡汤已经喝完了,让我们开干!

前面已经分享了很多的面试题和项目:

前面的话,已经分享了SpringBoot的相关知识,例如:

1,Java基础大全,帮你省去2w的培训费

2,SpringBoot一天快速入门,超级肝货!【一】

3,SpringBoot一天快速入门,超级肝货!【二】

4,SpringBoot与分布式

5,肝完了,总结了SpringBoot与缓存的知识点,快速掌握

6,一天掌握数据结构和算法面试题,吊打面试官

7,整理了一周的Spring面试大全【含答案】

8,三天肝完设计模式的面试题,面试再不怕设计模式的问题了​​​​​​​

9,Mysql面试大全​​​​​​​

10,算法学习大全

当然也分享了很多的SpringBoot的项目,这些项目真的很肝!

1,基于springboot的在线教育系统分享

2,基于springboot的活动管理小程序系统分享

3,基于springcloud的微服务项目分享【视频教程+源码】

4,撸完这个springboot项目,我对boot轻车熟路【视频教程+源码】

今天复习Redis面试,Redis作为缓存系统,面试基本是常问的。因此必须要搞。

目录

1,什么是Redis

2,Redis和Memecache有什么区别?

3,Redis和Mysql的区别:

4,为什么要用reids,不用不行吗?

5,Redis为什么是单线程的?单线程可以处理高并发吗?

6,为什么Redis 6.0 之后改多线程呢?

7,Redis的五种类型有那些?

8,Redis常见的功能有哪些?

9,Redis的优缺点有哪些

10,说说缓存穿透,缓存雪崩以及缓存击穿?

11,说一下Redis的持久化机制。

12,MySQL 里有 1000w 数据,redis 中只存 10w 的数据,如何保证 redis 中的数据都 是热点数据?

13,说下Redis的淘汰策略?

14,请讲一下Redis的应用场景?

15,如何实现Redis的高可用?


1,什么是Redis

简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因此 redis 被广泛应用于缓存方向。

另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

最主要的Redis就是缓存应用!

2,Redis和Memecache有什么区别?

对于 redis 和 Memecache的区别有下面四点。

a.redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。

b.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。

c.集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的。

d.Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。

3,Redis和Mysql的区别:

redis: 内存型非关系数据库,数据保存在内存中,速度快

mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的Io操作,访问速度相对慢

4,为什么要用reids,不用不行吗?

主要从“高性能”和“高并发”这两点来看待这个问题。在这两种情况下Redis非常的快。

首先看一下高性能:

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

最重要的就是在高并发的时候,Redis非常的快。

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

那么Redis为啥这么快呢?听小孟道来。

如果简单的解释就是:

首先,采用了多路复用io阻塞机制然后,数据结构简单,操作节省时间。并且,Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。最后,运行在内存中,Redis直接自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,自然速度快。

5,Redis为什么是单线程的?单线程可以处理高并发吗?

Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。再说了,单线程切换开销小,容易实现既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

当然可以处理高并发,Redis不就实现了吗?

6,为什么Redis 6.0 之后改多线程呢?

上面说了Redis是单线程的,Redis6.0之前Redis都是单线程的,就是处理客户端的数据时,读写都由一个顺序串行的主线程处理。

redis使用多线程并非是完全摒弃单线程,redis还是使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析,执行命令还是使用单线程。

这样做的目的是因为redis的性能瓶颈在于网络IO而非CPU,使用多线程能提升IO读写的效率,从而整体提高redis的性能。

它的执行命令操作内存的仍然是个单线程。

7,Redis的五种类型有那些?

String 整数,浮点数或者字符串,使⽤场景:缓存、计数器、共享 Session、限速。

Set 集合,通常用在兴趣标签之类的。

Zset 有序集合,通常用在排行榜之类的。

Hash 散列表,哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。

List 列表,在 Redis 中,可以队列表两端插⼊和弹出,还可以获取指定范围的元素列表、获取指定索引下的元素等,列表是⼀种⽐较灵活的数据结构,它可以充当栈和队列的⻆⾊。

Set用的比较多,redis的端口号通常是6379:

127.0.0.1:6379> set key1 xiaomeng1OK127.0.0.1:6379> set key2 xiaomeng2OK127.0.0.1:6379> set key3 xiaomeng3OK127.0.0.1:6379> set key4 xiaomeng4OK127.0.0.1:6379> set key5 xiaomeng5OK127.0.0.1:6379> set key6 xiaomeng6OK

除此之外,还有三种特殊的数据类型:

Geo:Redis3.2推出的,地理位置定位,用于存储地理位置信息,并对存储的信息进行操作。

HyperLogLog:用来做基数统计算法的数据结构。

Bitmaps :用一个比特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps成作一个以比特位为单位的数组。

8,Redis常见的功能有哪些?

1. 数据缓存功能

2. 分布式锁的功能

3. ⽀持数据持久化

4. ⽀持事务

5. ⽀持消息队列

9,Redis的优缺点有哪些

优点:

上面已经了列举了Redis的很多优点:

1,读写非常的快,提高网站的访问速度,Redis能读的速度是110000次/s,写的速度是81000次/s。强悍的一比。

2,持AOF和RDB两种持久化方式。

3,支持较多的数据结构类型,有String、hash、set、zset等等。

4,支持主从复制,主机可以自动的将数据同步到从机,从而进行读写分离。

5,支持AOF和RDB的持久化方式。

缺点:

任何的事物有优点,必然有缺点。Redis也不例外。

Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

10,说说缓存穿透,缓存雪崩以及缓存击穿?

A,缓存穿透:缓存穿透是指查询一条数据库和缓存都没有的一条数据,就会一直查询数据库,对数据 库的访问压力就会增大,缓存穿透的解决方案,再换个说法就是客户持续向服务器发起对不存在服务器中数据的请求。客户先在Redis中查询,查询不到后去数据库中查询。

缓存穿透的如何避免:

  1. 缓存空对象:如果⼀个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进⾏缓存,但它的过期时间会很短,最⻓不超过五分钟。
  2. 接口层增加校验,对传参进行个校验,比如说我们的id是从1开始的,那么id<=0的直接拦截;
  3. 缓存中取不到的数据,在数据库中也没有取到,这时可以将key-value对写为key-null,这样可以防止攻击用户反复用同一个id暴力攻击
  4. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  5. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。

B,缓存击穿:就是一个很热门的数据,突然失效,而此时大量请求到服务器数据库中。

最好的办法就是设置热点数据永不过期。热点数据快要过期时,异步线程去更新和设置过期时间。

此外还可以采用互斥锁方案。

C,缓存雪崩:概念上是大量数据同一时间失效。此刻无数的请求直接绕开缓存,直 接请求数据库。

造成缓存雪崩的原因,有以下2种: reids宕机,可以通过构造redis集群解决! 大部分数据失效。可通过均匀设置过期时间解决,即让过期时间相对离散一点。

11,说一下Redis的持久化机制。

Redis的持久化机制有RDB和AOF。

RDB把内存数据以快照的形式保存到磁盘上。其核心的配置:

save <seconds> <changes># save ""save 900 1save 300 10save 60 10000

可以进行备份和全量复制,但是无法做到实时的持久化。适合大规模的数据恢复。

RDB做不到实时的持久化,但AOF可以。采用日志的形式来记录每个写操作,追加到文件中,通过重启执行AOF来恢复数据。

Redis默认是把AOF关闭的,我们可以把它打开。no改为yes

appendonly yes

AOF数据的完整性和一致性更高,

但是,因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。

基于以上分析,若只打算用Redis 做缓存,可以关闭持久化。

若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。所以还是要根据不同的需求,去做不同的操作。

12,MySQL 里有 1000w 数据,redis 中只存 10w 的数据,如何保证 redis 中的数据都 是热点数据?

redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。其实面试除了考察 Redis,大厂对于底层、分布式、微服务考察很多!

13,说下Redis的淘汰策略?

Redis的淘汰策略有8种,分别为:noeviction,volatile-lru,volatile-lfu,volatile-ttl,volatile-random,allkeylru,allkeys-lfu,allkeys-random

14,请讲一下Redis的应用场景?

我们都知道Redis最主要的就是缓存,在网站中应用最广泛,可以很明显的提高访问的速度,减少数据库的压力!和memcached相比,redis更加的强悍,因为提供了丰富的数据结构,还提供了RDB和AOF等持久化机制。通常运用在如下场景:

15,如何实现Redis的高可用?

一般有三种模式,分别为主从模式(Replication-Sentinel模式)、哨兵模式、集群模式。

主从模式:

主从模式是部署多台服务器,有主节点和从节点,主节点负责读写,从节点负责读。

首先是master和slave的连接,然后会将自身的数据复制给slave。

如果maser和slave断开连接后重新连接,只获取在断开连接期间内丢失的命令流。

如果无法同步,slave 会请求进行全量重同步。

Redis Sentinel(哨兵):

哨兵是社区版本推出的原生高可用解决方案,为什么要提供哨兵?

在主从模式中,主节点发什么问题时,需要人工的将从节点搞成主节点,非常的费事,而且通知应用方更新主节点的地址,更加的费事。哨兵就可以解决这个问题。

哨兵模式的搭建:

#配置端口port 26379#以守护进程模式启动daemonize yes#日志文件名logfile "sentinel_26379.log"#存放备份文件以及日志等文件的目录dir "/opt/redis/data"#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个sentinel monitor mymaster 192.168.14.101 6379 2#30秒ping不通主节点的信息,主观认为master宕机sentinel down-after-milliseconds mymaster 30000#故障转移后重新主从复制,1表示串行,>1并行sentinel parallel-syncs mymaster 1#故障转移开始,三分钟内没有完成,则认为转移失败sentinel failover-timeout mymaster 180000

哨兵模式的架构图如下所示:

集群模式:

Redis 集群是一个提供在多个Redis节点间共享数据的程序集,对数据进行分片,也就是说每台Redis节点上存储不同的内容,来解决在线扩容的问题。哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,并且不好在线扩容。

,

Redis Cluster有一个槽的概念,所有的键根据哈希函数映射到 0~16383 个整数槽内,每个节点负责维护一部分槽以及槽所映射的键值数据,可以直接自动跳转到这个对应的节点上进行存取操作。

槽位的信息存储于每个节点中。只有master节点会被分配槽位,slave节点不会分配槽位。

参考文献:

  • http://www.redis.cn/
  • 《Redis设计与实现》

为了帮助大家快速面试,整理了很多的面试干货题和项目。

​​​​​​​

Java基础到就业!项目加面试!之Redis面试大全!倾心整理【建议收藏】相关推荐

  1. 50道JAVA基础算法编程题【内含分析、程序答案】【建议收藏】【建议收藏】【建议收藏】

    非常基础的题目,但是想学好Java它真的是基础,基础有多重要我就不再废话,重要的事情说三遍[建议收藏][建议收藏][建议收藏]. [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一 ...

  2. 尚硅谷 java基础第二个项目之客户关系管理系统

    尚硅谷 java基础第二个项目之客户关系管理系统. 做了一些完善,增加性别,电话,邮箱有效性验证.其中电话和邮箱验证直接"饮用"了网友的果汁. 在此感谢各位原著大佬们的分享. 具体 ...

  3. 适合有一些Java基础的实战项目

    有些同学学了很久的Java,记了许多知识,但一用的时候发现脑子里一片空白,这是为什么呢,归根到底就是项目练得少,没有实战经验.为了避免这种现象,学姐今天给大家分享一个Java初级游戏项目--大鱼吃小鱼 ...

  4. 2020 - [Java基础 +多线程 + 虚拟机] + [计网 + 操作系统] + [MySQL] + [Redis] + [RocketMQ] + [Spring]常见面试题与解析

    前情提要:下面的内容主要由网上的资料和个人的理解整理而成.由于时间仓促可能没有给出相应的链接,并不代表我不尊重他人的劳动成果,后续更新会补上相应的链接.其中内容可能有理解不到位的地方,大家可选择性采纳 ...

  5. 金九银十已到,大厂面试大全+面试经历都在这了(建议收藏)

    前言 疫情到现在已经持续有3年的时间了,由于疫情的影响,无数行业都受到了影响,互联网寒冬下,许多程序员被裁,大环境格外困难. 我发现一个奇怪的现象:那些跳槽的人,总是从一个坑,跳进令一个坑中.毕竟一年 ...

  6. 2018.7-2019.7一周年Java进阶架构师技术文章整理 建议收藏

    其实师长的公众号从2017年就开始发技术文章了,但是因为某些原因(就是懒)太监了许久,直到2018.7的时候才恢复更新.不知不觉中,已经更新了一年的广告,在没广告的日子里,顺带更新技术文章,截至201 ...

  7. 第一章-----Java基础入门(项目名称使用小驼峰命名)

    一.java简介 1.1 前言 Java语言是美国Sun公司(stanford University Network),在1995年推出的高级编程语言.所谓编程语言是计算机的语言,人们可以使用编程语言 ...

  8. 秒表计时器——Java基础练手项目(Java课程设计)

    前言:鄙人是大二在读学生,大二上学期Java课程设计选了一个秒表计时器的题目,在此把代码和心得分享出来(懒人可以直接看PPT).鄙人资历尚浅,代码中会有许多不当之处,望各位大佬海涵,有更好的建议希望各 ...

  9. 小白自学笔记——JAVA基础 2.12 项目一 家庭记账软件

    需求说明 模拟实现基于文本界面的<家庭记账软件>. 该软件能够记录家庭的收入.支出,并能够打印收支明细表. 假设家庭起始的生活基本金为10000元. 每次登记收入(菜单2)后,收入的金额应 ...

最新文章

  1. 当铅笔芯加上直流电压的时候
  2. 安装redis及python redis模块
  3. 分块矩阵在秩不等式中的应用
  4. flatform installer web 安装php_web安装平台-微软web服务器配置安装工具(Web Platform Installer)5.0 官方最新版-东坡下载...
  5. RADIO廉价冗余阵列radio0 dadio1 radio10/01 radio5 radio6
  6. CentOS 7安装megacli
  7. linux(Ubuntu)下安装英伟达的显卡驱动、cuda和cudnn详细步骤
  8. 拓端tecdat|基于R统计软件的三次样条和光滑样条模型数据拟合及预测
  9. 【Missing separate debuginfos, use: debuginfo-install glibc-2.17-222.el7.x86_64】 解决方法
  10. OA办公自动化系统设计方案
  11. 平板android rom下载地址,Android平板第三方ROM开放下载
  12. 地下市场金融牌照疯狂买卖:全牌照可以卖十几个亿
  13. 计算机仿真工具软件,计算机仿真技术
  14. “三地合作社”轧在农民心里的一道沟
  15. 标签传播算法(LPA)
  16. JS的三种弹出提示框(alert、confirm、prompt)
  17. 关于虚拟货币内容发布规则的调整通知
  18. 大数据时代下“被直播”问题现状调研报告
  19. VUE 实现拖拽效果
  20. 一般产品需求的研发流程

热门文章

  1. 中国计算机软件专业技术,中国计算机软件专业技术资格考试-20210325012847.doc-原创力文档...
  2. MapReduce整合Avro
  3. Oracle ODBC连接配置
  4. 3分钟让你明白JSON是什么
  5. 大数据预科班作业10
  6. (简单)华为M3揽月 BTV-W09的Usb调试模式在哪里开启的经验
  7. 策略模式之支付案例实战
  8. 永恒之塔修改服务器名字,永恒之塔模拟器服务端每个文件的用途及修改
  9. PyQt5设计GUI(二)为程序设计图形界面
  10. 韩顺平 javascript教学视频_学习笔记17_js超级玛丽小游戏