04 2022 档案
摘要:作为一个后端开发人员,可能在工作中或者面试的时候,总回被人问到SQL注入的问题。可能也会因为没有实际遇到过或者解决过这类问题,总是一知半解。本文着重讲清楚什么是SQL注入,以及列举一些示例,更直观的看到那些情况会导致SQL注入,以及可能带来的危害。 一.什么是SQL注入 SQL注入,一般指web应用
阅读全文
摘要:前言 为什么需要Spring? 什么是Spring? 对于这样的问题,大部分人都是处于一种朦朦胧胧的状态,说的出来,但又不是完全说的出来,今天我们就以架构设计的角度尝试解开Spring的神秘面纱。 本篇文章以由浅入深的方式进行介绍,大家不必惊慌,我可以保证,只要你会编程就能看懂。 本篇文章基于Spr
阅读全文
摘要:集合结构图 Java 中集合又叫做容器,主要分为两大阵营:Collection、Map;前者用来存放单一元素,后者用来存放键值对; Collection 主要包含两个集合类(1. List,List 集合的特点是,元素是有序的,可重复的) (2. Set 元素是无序的,不可重复的集合) Map(映射
阅读全文
摘要:大家好,我是老三,面渣逆袭 继续,这节我们来盘一盘另一个面试必问知识点——Java并发。 这篇文章有点长,四万字,图文详解六十道Java并发面试题。人已经肝麻了,大家可以点赞、收藏慢慢看!扶我起来,我还能肝! 基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单位。 并行
阅读全文
摘要:,下面我们就来看看如何解决才能最大限度的保证消息不丢失。 Producer 端解决方案 在剖析 Producer 端丢失场景的时候, 我们得出其是通过「异步」方式进行发送的,所以如果此时是使用「发后即焚」的方式发送,即调用 Producer.send(msg) 会立即返回,由于没有回调,可能因网络原
阅读全文
摘要:要在应用中做到幂等,其实并不难,本文尝试做一个系统性的总结,欢迎一起探讨。 什么是幂等 某个操作执行一次,跟执行多次的效果一样。幂等一词来自于数学中的幂等,即f(f(x)) = f(x)。 需要保证幂等的场景 查询类的读操作,天然是幂等的,多次调用不会有副作用。需考虑以下几种写操作的情况: 调用下游
阅读全文
摘要:小伙伴们在面试的时候,有一个特别常见的问题,那就是数据库的回表。什么是回表?为什么需要回表? 今天松哥就来和大家聊一聊这个话题。 1. 索引结构 要搞明白这个问题,需要大家首先明白 MySQL 中索引存储的数据结构。这个其实很多小伙伴可能也都听说过,B+Tree 嘛! B+Tree 是什么?那你得先
阅读全文
摘要:Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序。应用程序可以通过 http 的方式,或 Spring Cloud 服务发现机制注册到 SBA 中,然后就可以实现对 Spring Boot 项目的可视化管理和查看了。 Spring B
阅读全文
摘要:本篇的这个问题是一个开放性问题,HashMap 除了死循环之外,还有其他什么问题?总体来说 HashMap 的所有“问题”,都是因为使用(HashMap)不当才导致的,这些问题大致可以分为两类: 程序问题:比如 HashMap 在 JDK 1.7 中,并发插入时可能会发生死循环或数据覆盖的问题。 业
阅读全文
摘要:Redis是面试中绕不过的槛,只要在简历中写了用过Redis,肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入,全面考察候选人对于Redis的掌握情况。 小张: 面试官,你好。我是来参加面试的。 面试官: 你好,小张。我看了你的简历,熟练掌握Redis,那么我就随便问你
阅读全文
摘要:面试官:你们项目中有使用分布式锁么? 我:有使用。 面试官:你们使用分布式锁主要是为了干啥? 我:多节点并发访问同一份数据的时候,防止造成脏数据。 面试官:都有哪些方案实现分布式锁?你们用的是哪一种? 我:有基于zk的临时顺序节点的方案,有redis的setnx和指定expire超时时间的方案。 面
阅读全文
摘要:在工作中,如果我们想提高一条语句查询速度,通常都会想对字段建立索引。 但是索引并不是万能的。建立了索引,并不意味着任何查询语句都能走索引扫描。 稍不注意,可能你写的查询语句是会导致索引失效,从而走了全表扫描,虽然查询的结果没问题,但是查询的性能大大降低。 今天就来跟大家盘一盘,常见的 6 种会发生索
阅读全文
摘要:在实际开发,Redis使用会频繁,那么在使用过程中我们该如何正确抉择数据类型呢?哪些场景下适用哪些数据类型。而且在面试中也很常会被面试官问到Redis数据结构方面的问题: Redis为什么快呢? 为什么查询操作会变慢了? Redis Hash rehash过程 为什么使用哈希表作为Redis的索引?
阅读全文
摘要:专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段,MySQL对我们来说似乎只是一个存储数据的好东西,存储时一股脑往里边塞,查询时也是盲目的全表查询(不带一点点优化)。 我们总是自欺欺人的觉得,我们通过其他方面来优化就好了阿,迟迟不愿面
阅读全文
摘要:大家好,我是小林。 昨天发了一篇关于索引失效的文章:谁还没碰过索引失效呢 我在文末留了一个有点意思的思考题: 图片 这个思考题其实是出自于,我之前这篇文章「一条 SQL 语句引发的思考」中留言区一位读者朋友出的问题。 很多读者都在留言区说了自己的想法,也有不少读者私聊我答案到底是什么? 所以,我今晚
阅读全文
摘要:简介 ConcurrentHashMap是HashMap的线程安全版本,内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。相比于同样线程安全的HashTable来说,效率等各方面都有极大地提高。 在阅读这篇文章之前,如果对HashMap不是很了解,可以阅读这篇文章:深入理解HashMap源
阅读全文
摘要:最近出去面试,在简历中写了些关于Mybatis的技术点,于是面试官就开始对我不断询问,本文特意记录下面试中遇到的一些问题。 说说什么是Mybatis Mybatis是一款对于Sql进行了一定封装的持久化sql框架,将常用的crud接口进行了一定的封装,减轻了开发人员对于SQL操作的繁琐性。 在工作中
阅读全文
摘要:1、为什么使用消息队列 以用户下单购买商品的行为举例,在使用微服务架构时,我们需要调用多个服务。传统的调用方式是同步调用,这会存在一定的性能问题 使用消息队列可以实现异步的通信方式,相比于同步的通信式,异步的式可以让上游快速成功,极大提高系统的吞吐量。在分布式系统中,通过下游多个服务的分布式事务的保
阅读全文
摘要:Redis 中数据的持久化 前言 我们知道 Redis 是内存数据库,所有操作都在内存上完成。内存的话,服务器断电,内存上面的数据就会丢失了。这个问题显然是需要解决的。 Redis 中引入了持久化来避免数据的丢失,主要有两种持久化的方式 RDB 持久化和 AOF 持久化。 AOF 持久化 什么是 A
阅读全文
摘要:Redis 3.x单线程时代但性能依旧很快的主要原因 基于内存操作:所有数据都存于内存中,读写速度非常快,内存的响应时长约为100纳秒,运算都是内存级别的,因此性能比较高; 数据结构简单:常用的数据结构中有些是专门设计的,如采用自己设计的简单动态字符串(Simple Dynamic String)作
阅读全文
摘要:本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说,简单分为4大阶段: 实例化 -> 属性赋值 -> 初始化 -> 销毁 实例化 Instantiation 属性赋值 P
阅读全文
摘要:pageHelper的分页是怎么实现运行的? 下载pageHelper源码,使用pageHelper的官方demo进行Debug试验。 PageHelper.startPage(2, 10, "id desc"); 点进第一个断点 PageHelper.startPage <E> :Element,
阅读全文
摘要:MyBatis作为持久层框架,其主要思想是将程序中的大量sql语句剥离出来,配置在配置文件中,实现sql的灵活配置。这样做的好处是将sql与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改sql。 加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置
阅读全文
摘要:说说Redis为什么快 Redis有几种数据结构,底层分别是怎么存储的 Redis有几种持久化方式 多线程情况下,如何保证线程安全? 用过volatile吗?底层原理是? MySQL的索引结构,聚簇索引和非聚簇索引的区别 MySQL有几种高可用方案,你们用的是哪一种 说说你做过最有挑战性的项目 秒杀
阅读全文
摘要:如何分配请求? 大多数网站背后肯定不是只有一台服务器提供服务,因为单机的并发量和数据量都是有限的,所以都会用多台服务器构成集群来对外提供服务。 但是问题来了,现在有那么多个节点(后面统称服务器为节点,因为少一个字),要如何分配客户端的请求呢? 其实这个问题就是「负载均衡问题」。解决负载均衡问题的算法
阅读全文
摘要:在这里分享下设计模式七大原则以及各自的关键词:1.开闭原则(框架)对扩展开放、对修改关闭 在不被修改的前提下被扩展 抽象化*2.单一职责原则(封装)(权衡)建议一个对象一个bean,解耦合(看具体情况)一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中ps:一个类承担的职责越多,它被复用
阅读全文
摘要:Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健康的服务实例,最终保证了业务系统能够正常的执行。 两种健康检查机制 Nacos 中提供了两种健
阅读全文
摘要:一.什么是Docker? 百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。docker官网:http://w
阅读全文
摘要:B+树是有序的。 B+树和B-树的主要区别? B-树内部节点是保存数据的;而B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。 B+树相邻的叶子节点之间是通过链表指针连起来的,B-树却不是。 查找过程中,B-树在找到具体的数值以后就结束,而B+树则需要通过索引找到叶子结点中的数据才
阅读全文
摘要:Future.get()用于异步结果的获取。它是阻塞的,背后原理是什么呢? 我们可以看下FutureTask的类结构图: FutureTask实现了RunnableFuture接口,RunnableFuture继承了Runnable和Future这两个接口, 对于Runnable,我们太熟悉了, 那
阅读全文
摘要:一、序言 Java多线程编程线程池被广泛使用,甚至成为了标配。 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批线程,当有需要使用线程时从线程池取出,用完后放回线程池,这样避免了频繁创建与销毁线程。 // 任务R
阅读全文
摘要:线程池是开发过程中使用频率较高的一个并发组件之一,本篇会结合踩刀哥之前的实践经验来分享一下线程池拒绝策略的真实使用场景,至于线程池内部原理只会简单介绍,有需要的可以自行上网学习。 线程池工作机制 这里用一个例子来描述下线程池的工作机制,2015年公司boss创立公司,创立初期公司业务比较少,boss
阅读全文
摘要:大家好,我是捡田螺的小男孩。今天跟大家探讨一下分布式锁的设计与实现。希望对大家有帮助,如果有不正确的地方,欢迎指出,一起学习,一起进步哈~ 分布式锁概述 数据库分布式锁 Redis分布式锁 Zookeeper分布式锁 三种分布式锁对比 1. 分布式锁概述 我们的系统都是分布式部署的,日常开发中,秒杀
阅读全文
摘要:前阵子面试的时候,在第三面问到了MySQL索引相关的知识点,并且给出了一些SQL语句分析索引的执行情况。所以今天这篇文章给大家讲讲索引,结合一些案例分析一下一个SQL查询走索引时涉及到的最左前缀原则。 在讲解最左前缀原则之前,先复习一下MySQL索引的重要基础知识(下面都将基于InnoDB存储引擎下
阅读全文
摘要:1 索引基础 1.1 索引作用 在MySQL中,查找数据时先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行,假如要运行下面查询语句: sql SELECT * FROM USER WHERE uid = 5; 如果在uid在建有索引,则MySQL将使用该索引先找到uid为5的行,也就是
阅读全文
摘要:MySQL有ACID四大特性,本文着重讲解MySQL不同事务之间的隔离性的概念,以及MySQL如何实现隔离性。下面先罗列一下MySQL的四种事务隔离级别,以及不同隔离级别可能会存在的问题。事务隔离级别越高,多个事务在并发访问数据库时互相产生数据干扰的可能性越低,但是并发访问的性能就越差。(相当于牺牲
阅读全文
摘要:前言 最近一直在写《手撕MySQL系列》文章,我发现自己的切入点有一些问题,虽尝试深入探究MySQL中的一些关键特性,但对于MySQL的知识掌握不太能够形成较好的体系化的知识网络。我感到在对全局了解不够清晰的时候,去深究一个知识点往往会事倍功半。所以打算通过这篇文章,分析SQL语句从头到尾的执行,串
阅读全文
摘要:想了解 synchronized 是如何运行的?就要先搞清楚 synchronized 是如何实现?synchronized 同步锁是通过 JVM 内置的 Monitor 监视器实现的,而监视器又是依赖操作系统的互斥锁 Mutex 实现的,那接下来我们先来了解一下监视器。 监视器 监视器是一个概念或
阅读全文
摘要:1、聚集索引聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引 也就是说聚集索引的顺序就是数据的物理存储顺序。它会根据聚集索引键的顺序来存储表中的数据,即对表的数据按索引键的顺序进行排序,然后重新存储到磁盘上。因为数据在物理存放时只能有一种排列方式,所以一个表只能有一个聚集索引。比如字典中
阅读全文
摘要:Redis 的高可用集群 前言 这里来了解一下,Redis 中常见的集群方案 几种常用的集群方案 主从集群模式 哨兵机制 切片集群(分片集群) 主从集群模式 主从集群,主从库之间采用的是读写分离 主库:所有的写操作都在读库发生,然后主库同步数据到从库,同时也可以进行读操作; 从库:只负责读操作; 主
阅读全文
摘要:大致流程说明: 1) 开发人员每天把代码提交到Gitlab代码仓库 2) Jenkins从Gitlab中拉取项目源码,编译并打成jar包,然后构建成Docker镜像,将镜像上传到Harbor私有仓库。 3) Jenkins发送SSH远程命令,让生产部署服务器到Harbor私有仓库拉取镜像到本地,然后
阅读全文
摘要:前言 大家好呀,金三银四即将来临,整理了十道十分经典的消息队列面试题,看完肯定对面试有帮助的,大家一起加油哈~ 什么是消息队列 消息队列的应用场景 消息队列如何解决消息丢失问题 消息队列如何保证消息的顺序性。 消息有可能发生重复消费吗?如何幂等处理? 如何处理消息队列的消息积压问题 消息队列技术选型
阅读全文
摘要:大家好,我是老三,面渣逆袭系列继续,这节我们的主角是MyBatis,作为当前国内最流行的ORM框架,是我们这些crud选手最趁手的工具,赶紧来看看面试都会问哪些问题吧。 基础 1.说说什么是MyBatis? 先吹一下: Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开
阅读全文
摘要:三、Redis 事务 3.1、Transactions 简介 MULTI、EXEC、DISCARD 和 WATCH 是 Redis 中事务的基础,它们允许在一个步骤中执行一组命令。 事务中的所有命令都会被序列化并按照 顺序执行 ,这保证了命令作为单个隔离操作执行。 要么处理所有命令,要么不处理任何命
阅读全文
摘要:MySQL是典型的C/S架构(客户端/服务器架构),客户端进程向服务端进程发送一段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。 问题来了。服务器进程对客户端发送的请求究竟做了什么处理呢?本文以查询请求为例,讲解MySQL服务器进程的处理流程。 如下图所示,服务器进程在处理客户端请
阅读全文
摘要:这是图解MySQL的第3篇文章,这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用自增ID作为主键,而不推荐使用UUID? InnoDB设计者如何设计高效算法,快速在一个页中搜索记录。 正文开始! 注:
阅读全文
摘要:IOC(Inversion of Control),意思是控制反转,不是什么技术,而是一种设计思想,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制 在传统的程序设计中,我们直接在对象内部通过new进行对象创建,是程序主动去创建依赖对象,而IOC是有专门的容器来进行对象的
阅读全文
摘要:Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健康的服务实例,最终保证了业务系统能够正常的执行。 两种健康检查机制 Nacos 中提供了两种健
阅读全文
摘要:一、背景 今天下午,正酣畅淋漓的搬砖,突然运维同事在群里通知,核心服务某个节点内存异常,服务假死。神经一下子紧张起来,赶紧跑到运维那边观察现象。 观察的结果是服务内存溢出,该服务是核心服务,分配了5G内存。运维在转存快照后,立刻重启服务后正常。在接下来的一段时间里,另一台服务节点也发生了同样的情况。
阅读全文
摘要:一、简介 MQ全称为Message Queue-消息队列,是一种应用程序对应用程序的消息通信,一端只管往队列不断发布信息,另一端只管往队列中读取消息,发布者不需要关心读取消息的谁,读取消息者不需要关心发布消息的是谁,各干各的互不干扰。 市场上现在常用的消息队列有:RabbitMQ、RocketMQ、
阅读全文
摘要:JDK1.8中HashMap的不安全性主要源自 数据覆盖 问题。 注:JDK1.8在进行元素插入时使用的是尾插法。 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[]
阅读全文
摘要:HashMap 死循环是一个比较常见、比较经典的问题,在日常的面试中出现的频率比较高,所以接下来咱们通过图解的方式,带大家彻底理解死循环的原因。 前置知识 死循环问题发生在 JDK 1.7 版本中,造成这个问题主要是由于 HashMap 自身的运行机制,加上并发操作,从而导致了死循环。在 JDK 1
阅读全文
摘要:ArrayList类又称动态数组,同时实现了Collection和List接口,其内部数据结构由数组实现,因此可对容器内元素实现快速随机访问。但因为ArrayList中插入或删除一个元素需要移动其他元素,所以不适合在插入和删除操作频繁的场景下使用。 ArrayList的容量可以随着元素的增加而自动增
阅读全文
摘要:前言在日常工作中,我们经常会使用到ElasticSearch,在大数据量亿级别的情况下使用它进行实时检索,速度非常快。但是却不知道它的原理是什么,采用什么方式进行检索。和mysql数据库有什么区别?一直都有困惑 我花了些时间学习了一下。下面是我整理的内容,希望可以对大家有帮助 一、ES为什么查询速度
阅读全文
摘要:1、为什么需要内存淘汰策略我们都知道Redis是一个基于k-v数据库,随着里面键值对的增加,redis内存的使用量也会上升,因此,我们需要对Redis的最大内存使用量进行限制。那么有了Redis的内存容量限制,那么就会有达到这个内存容量限制的时候,这个时候就需要对Redis存储的数据进行清理,释放内
阅读全文
摘要:背景 OpenFeign 是 Spring Cloud 家族的一个成员, 它最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式。 如果说 Spring Cloud 其他成员解决的是系统级别的可用性,扩展性问题, 那么 OpenFeign 解决的则是与开发人员
阅读全文
摘要:如果让你设计一个动态配置的功能,你会怎么做?注意是动态配置,不是配置中心。 先在大脑里面考虑3分钟,也许你有答案了。 对的,你肯定想的和下面一样: 上图是需要人工发起通知的动态配置架构,实现很简单。 但我们为什么要人工操作两次呢,可不可以简化到一次? 对于上图只需要稍作调整,就能达到只需要一次修改配
阅读全文
摘要:前言 线程池,相信很多人都有用过,没用过相信的也有学习过。但是,线程池的拒绝策略,相信知道的人会少许多。 四种线程池拒绝策略 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize时,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略: ThreadPoolExec
阅读全文
摘要:在介绍双亲委派机制的时候,不得不提ClassLoader。说ClassLoader之前,我们得先了解下Java的基本知识。 Java是运行在Java的虚拟机(JVM)中的,但是它是怎么就运行在JVM中了呢?我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由我们得Clas
阅读全文