2019秋招:460道Java后端面试高频题答案版【模块十二:Redis】

MyISAM以及InnoDB引擎默认排序方式 今天在review代码查看SQL语句时突然对没有指定排序方式的SQL语句返回怎样的排序结构感兴趣!在某些场景中返回结果中的元素到底是按照什么顺序以什么字段排序的将直接影响到整个业务是否正确。例如myBatis中语句如下: 阅读详情

Redis

写在前面

Redis 对于 2020 届后端开发秋招面试中已经是一个常规的模块了。毕竟现在是互联网时代,各大公司维护的系统的并发量都是很高的,对性能都是有很高的要求,所以很多系统都是拿 Redis 做缓存,减小 MySQL 的查询压力,从提高系统的整体性能。

对于 Redis 的学习,我一开始是看了某培训机构的教学视频,学了一些简单的操作指令,然后自己做“秒杀系统”时涉及到了一些 Redis 的使用,再然后就是在拼多多实习的时候用到了一些 Redis。给大家推荐一本书,这也是很多人推荐给我的:

640?wx_fmt=jpeg

个人觉得 Redis 比较重要的几个点:数据类型、使用场景、缓存穿透、缓存雪崩、双写一致性问题、持久化等。

1、谈下你对 Redis 的了解?

Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

2、Redis 一般都有哪些使用场景?

640?wx_fmt=png

  • Redis 适合的场景
1. 缓存:减轻 MySQL 的查询压力,提升系统性能;
2. 排行榜:利用 Redis 的 SortSet(有序集合)实现;
3. 计算器/限速器:利用 Redis 中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等。这类操作如果用 MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个 API 的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;
4. 好友关系:利用集合的一些命令,比如求交集、并集、差集等。可以方便解决一些共同好友、共同爱好之类的功能;
5. 消息队列:除了 Redis 自身的发布/订阅模式,我们也可以利用 List 来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的 DB 压力,完全可以用 List 来完成异步解耦;
6. Session 共享:Session 是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用 Redis 保存 Session 后,无论用户落在那台机器上都能够获取到对应的 Session 信息。
  • Redis 不适合的场景
数据量太大、数据访问频率非常低的业务都不适合使用 Redis,数据太大会增加成本,访问频率太低,保存在内存中纯属浪费资源。
3、Redis 有哪些常见的功能?
1. 数据缓存功能
2. 分布式锁的功能
3. 支持数据持久化
4. 支持事务
5. 支持消息队列
4、Redis 支持的数据类型有哪些?
  • 1. string 字符串
字符串类型是 Redis 最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的。字符串类型实际上可以是字符串:简单的字符串、XML、JSON;数字:整数、浮点数;二进制:图片、音频、视频。
使用场景:缓存、计数器、共享 Session、限速。
  • 2. Hash(哈希)

在 Redis中哈希类型是指键本身是一种键值对结构,如 value={{field1,value1},......{fieldN,valueN}}  

使用场景:哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询开发困难且维护成本高。
  • 3. List(列表)

列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素,一个列表最多可以储存 2 ^ 32 - 1 个元素,在 Redis 中,可以队列表两端插入和弹出,还可以获取指定范围的元素列表、获取指定索引下的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。
使用场景:Redis 的 lpush + brpop 命令组合即可实现阻塞队列,生产者客户端是用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

640?wx_fmt=png

  • 4. Set(集合)
集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,Redis 除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。合理的使用好集合类型,能在实际开发中解决很多实际问题。
使用场景:如:一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。
  • 5. zset(sorted set:有序集合)
有序集合和集合有着必然的联系,它保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下标作为排序依据不同的是:它给每个元素设置一个分数,作为排序的依据。
使用场景:排行榜是有序集合经典的使用场景。例如:视频网站需要对用户上传的文件做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
5、Redis 为什么是单线程的?

官方解释:

https://blog.youkuaiyun.com/xlgen157387/article/details/79470556

640?wx_fmt=png

官方 FAQ 表示,因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了,毕竟采用多线程会有很多麻烦。
6、Redis 为什么这么快?
1. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速;
2. 数据结构简单,对数据操作也简单;
3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4. 使用多路 I/O 复用模型,非阻塞 IO。
7、什么是缓存穿透?怎么解决?

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

  • 解决办法:

1. 缓存空对象:如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存空对象带来的问题:

1. 空值做了缓存,意味着缓存中存了更多的键,需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。

2. 缓存和存储的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如:过期时间设置为 5分钟,如果此时存储添加了这个数据,那此段时间就会出现缓存和存储数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。


2. 布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。

8、什么是缓存雪崩?该如何解决?
如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
  • 解决办法:
1. 加锁排队:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待;
2. 数据预热:可以通过缓存 reload 机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀;
3. 做二级缓存,或者双缓存策略:Cache1 为原始缓存,Cache2 为拷贝缓存,Cache1 失效时,可以访问 Cache2,Cache1 缓存失效时间设置为短期,Cache2 设置为长期。
4. 在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。
9、 怎么保证缓存和数据库数据的一致性?
1. 从理论上说,只要我们设置了合理的键的过期时间,我们就能保证缓存和数据库的数据最终是一致的。因为只要缓存数据过期了,就会被删除。随后读的时候,因为缓存里没有,就可以查数据库的数据,然后将数据库查出来的数据写入到缓存中。除了设置过期时间,我们还需要做更多的措施来尽量避免数据库与缓存处于不一致的情况发生。
2. 新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。

10、Redis 持久化有几种方式?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。Redis 提供了两种持久化方式:RDB(默认) 和 AOF。

  • RDB
RDB 是 Redis DataBase 的缩写。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即 Snapshot 快照存储,对应产生的数据文件为 dump.rdb,通过配置文件中的 save 参数来定义快照的周期。核心函数:rdbSave(生成 RDB 文件)和 rdbLoad(从文件加载内存)两个函数。

640?wx_fmt=png

  • AOF
AOF 是 Append-only file 的缩写。Redis会将每一个收到的写命令都通过 Write 函数追加到文件最后,类似于 MySQL 的 binlog。当 Redis 重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。每当执行服务器(定时)任务或者函数时,flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作:
  • WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件;

  • SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。

640?wx_fmt=png

  • RDB 和 AOF 的区别:
1. AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据;
2. AOF比 RDB 更安全也更大;
3. RDB 性能比 AOF 好;
4. 如果两个都配了优先加载 AOF。

11、Redis 怎么实现分布式锁?

Redis 为单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对 Redis 的连接并不存在竞争关系。Redis 中可以使用 SETNX 命令实现分布式锁。一般使用 setnx(set if not exists) 指令,只允许被一个程序占有,使用完调用 del 释放锁。

12、Redis 淘汰策略有哪些?

1. volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰;
2. volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑选将要过期的数据淘汰。
3. volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中任意选择数据淘汰。
4. allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。
5. allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。
6、no-enviction(驱逐):禁止驱逐数据。

13、Redis 常见性能问题和解决方案?

1. Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件。如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次;
2. 为了主从复制的速度和连接的稳定性, Master 和 Slave 最好在同一个局域网内;
3. 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…

640?wx_fmt=png


640?wx_fmt=png
您点的“在看”就是对我最大的鼓励
Python 打包与发布陷阱:如何用 setuptools 和 PyInstaller 生成跨平台可执行文件? 使用。 阅读详情

相关推荐

泛微OA表单开发实战:如何用JavaScript动态控制明细表的必填与可编辑属性

本文详细介绍了如何在泛微OA系统中使用JavaScript动态控制明细表字段的必填与可编辑属性。通过主表字段变更事件监听和明细表字段属性批量修改,实现智能化的表单交互,提升用户体验和系统灵活性。文章深入解析了关键API的使用方法,并提供了实战代码示例和最佳实践。

weixin_30955617的博客 548

2020-09-28

Mybatis中#{}和${} 1、#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个引号(单引号?双引号?加了引号就对了)如: //传入的值是sex order by #{column} 解析后为 order by “sex” //将会出错 2、${}将传入的数据直接显示生成在sql中,如: //传入的值是sex order by ${column} 解析后为 order by sex //正确的 3、#{}可以在很大程度上防止sql注入,${}无法防止sql注入 4、${}一般用于传入数据库对

weixin_43705952的博客 186

【原创,解决CLodop安装后无法调用的问题】已经安装过CLodop,但是网页上仍然提示“clodop云打印服务(localhost本地)未安装启动,点击这里执行安装....”

在某些国内web网站中,需要安装一个名为“CLodop”的插件;但在实际使用过程中,即使安装了CLodop插件,网页试图调用它时还是会提示“clodop云打印服务(localhost本地)未安装启动,点击这里执行安装...”,且无法完成相关打印任务 本文属原创博客,分析了解决CLodop无法被调用的问题,并附上了原理和解决方法,本质上是和跨域请求以及CORS类安全组策略相关

link_in_csdn的博客 2万+

mybatis按照id查询出来的顺序进行排序

service层 List<GoodsSpu> goodsSpuList = baseMapper.queryGoodsSpuListByOrderBySpuIdList(PageParam.initial(page, queryDto), MapUtils.buildKeyValueMap("spuIdList", orderBySpuIdList, "spuIdStr", spuIdSb.substring(0, spuIdSb.length() - 1))); mapper层 .

weixin_40496774的博客 2154

【推荐100个unity插件之34】在unity中实现和Live2D虚拟人物的交互——Cubism SDK for Unity

Live2D是一款2D建模的软件,常用于游戏,动态壁纸,虚拟主播,游戏公司里面是有专门的ive2D岗位的。游戏里面还有一个经常使用的软件——spine,他做的也是2d的模型,但是他更适合做一些动作,Live2D更适合人物交互方面。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4996

安卓讲课笔记1.1 安装Android Studio

1. 能安装配置Android Studio; 2. 能创建安卓虚拟机(AVD); 3. 能创建简单安卓应用

howard2005的专栏 3363

mybatis 排序

https://blog.youkuaiyun.com/kobi521/article/details/16941403, MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 正确写法: ORDER BY FIELD(f.id, <foreach collection="machineIds" item="machineId" index="index" o...

青春不羁88的博客 797

秋叶ComfyUI整合包使用FRP实现公网访问教程 ComfyUI内网穿透 秋叶整合包

最近在做 ComfyUI 的实验时,我发现很多小伙伴都遇到一个问题:本地启动的 ComfyUI 服务只能在本地访问,想要通过公网远程访问,就必须借助来实现。作为一名前端开发工程师,我花了点时间把 ComfyUI 启动器和 FRP 配置整合了一下,今天就分享给大家。本文适合已经了解。需要注意的是 穿透到公网的话任何人都能访问 为了安全建议看我另一篇帖子加上密码验证 防止恶意攻击。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1347

mybaties根据list参数查询并排序

mybaties根据list参数查询并排序 测试代码 List<Integer> merList=new ArrayList<Integer>(); merList.add(37); merList.add(40); merList.add(38); merList.add(39); Map<String,Object> merParam=new HashMap<String,Object>(); merPar

qq_39267979的博客 987

Transformer 时间序列预测实战

Transformer 时间序列预测实战

机器学习深度学习业余选手 743

每周技术面试高频题汇总:大厂面试官到底在考什么?完整实战指南

大家好,又到了每周的面试复盘时间。。现在的面试官更喜欢把你扔进一个具体的“场景”里,看你怎么思考、怎么权衡(Trade-off)。基于过去一周 优快云、掘金、LeetCode 等社区的热议内容,我为大家精选了,涵盖算法、系统设计、数据库和网络四大领域。咱们不整那些虚的,直接上干货,看看这些题目背后的考察点和解题思路。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 482

分数间隔均衡器的基本原理及应用(使用Matlab)

通过对接收信号进行加权求和,分数间隔均衡器可以抵消信号在传输过程中受到的频率响应失真。Matlab提供了丰富的工具和函数,可以方便地实现分数间隔均衡器,并进行性能评估。分数间隔均衡器(Fractional Interval Equalizer)是一种数字信号处理技术,用于均衡带通信道中的信号失真。分数间隔均衡器的基本原理是通过对接收信号进行加权求和,以抵消信号在传输过程中受到的频率响应失真。分数间隔均衡器在通信系统中具有广泛的应用。最后,我们通过比较均衡后的信号和发送数据的阈值来进行解调,并计算误码率。

2301_79325657的博客 678

几年前的项目用了YYYY-MM-dd,跨年夜老板喊我回去改Bug

点击上方“码农进阶之路”,选择“设为星标”回复“面经”获取面试资料昨天听一粉丝讲到自己的项目中因为格式化时间用到了"YYYY-MM-dd",元旦当天被喊回去改Bug,到底...

二师兄撒欢之地 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java就业寒冬:400份简历争1个岗,这些题答不出直接挂

当某大厂总监说出:“我们不要背题家,要能。

x1ao_fe1的博客 588

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

mybatis使用经验

自用于记录mybatis使用遇到的知识点和问题

qq_54799493的博客 381

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mybatis中查询的结果有序展示

如何把mybatis中sql查询的结果按照自己定义的resultMap有序展示? 1、分析为啥结果是乱序 先看下图: 第一张为select语句,resultType是本项目封装的一个类 第二张为resultMap语句,type也是本项目封装的一个类 第三张是本项目封装的一个类,可以看到继承了HashMap 通过上图可以分析出,HashMap存取数据大多是无序的,那么关键点找出来了...

HY0101的博客 1679

Mybatis返回map集合时,列的顺序与select不一致

<select id="queryPercentByAsset" resultType="java.util.HashMap"> 将Hashmap换成LinkedHashMap即可 <select id="queryPercentByAsset" resultType="java.util.LinkedHashMap">

m0_54853420的博客 1287

mysql修改select默认排序

alter table tablename order by id desc

Ambulong的博客 1131

Mybatis,Order By排序问题

曾写过一篇博客,是接触了一段时间的mybatis开发总结的:《Mybatis,怀疑--使用--感悟》。又过去了一段时间,前不久和别人联调接口,遇到了mybatis的排序问题。这篇博客就来总结一下,在mybatis框架下,如何实现排序?     排序,是个很基础的需求。实现的时候只需要在查询语句后面加上order by 某个字段即可。在mybatis中,用工具可以帮助我们自动生成底层的一套东西,便

Dream it Possible 15万+

mybatis指定字段和升降排序

mybatis指定字段和升降排序

docsz的博客 1926

深入了解:MyBatisPlus条件构造器带条件排序方法orderBy、orderByDesc、orderByAsc使用

MyBatisPlus是一个优秀的持久层框架,它在MyBatis的基础上进行了增强和封装,提供了更加便捷的数据库操作方式。其中,条件构造器是MyBatisPlus的重要特性之一,它可以帮助我们动态地构建SQL查询条件。而在条件构造器中,排序是一个常见的需求,MyBatisPlus提供了​​orderBy​​、​​和​​三个方法来实现条件排序。本文将介绍这三个方法的使用方式。MyBatisPlus的条件构造器提供了丰富的方法来构建SQL查询条件,其中排序是一个常见的需求。通过​​orderBy​​、​​和​。

牛肉胡辣汤 1万+

mybatis排序

排序的时候#和$的分别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".  2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,...

weixin_33698043的博客 196

MybatisPlus 分页排序封装

MybatisPlus 分页排序封装

daorenfeixueyuhau的博客 2516

MyBatis中按in的参数顺序排序(案例详解)

本篇分享MyBatis中按in的参数顺序排序~

末尾卡片和博主交流学习! 2165

mybatis 排序_hibatis--mybatis,自动生成SQL, 通用Mapper, 通用Dao

——从Mybatis到Hibernate、Spring data JPA,再到QueryDSL,用过了这些框架后,对各种框架的毛病已不胜其烦。在看到Mybatis Plus这样的框架后,突发奇想,不如自己使用mybatis 定制一个数据库持久层框架,实现SQL语句的自动生成。一个Mybatis增强工具包。新增了5种SQL语句自动生成注解:ExecuteInsert, ExecuteSelect, ...

weixin_39611863的博客 270
上一篇: 十一我没去旅游,拜访了腾讯、阿里、美团的Java开发大佬的公众号,都很优秀。...
下一篇: 前有莫雷,今有清华学霸要求公开华人程序员自杀真相,被Facebook开除了
程序员乔戈里
博客等级 码龄8年 1057粉丝 220原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值