大咖笔记

其他

SpringBoot + Mybatis + Druid + PageHelper 实现多数据源并分页(附源码)

dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
2022年6月29日
其他

硬核!Java 实现数据动态插入,生成 PDF、EXECL,完美导出功能!

一、序言Excel、PDF的导出、导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策。公司有这么两个需求:需求一、给了一个表单,让把查出来的数据组装到表单中并且提供以PDF格式的下载功能。需求二、将数据查出来以Excel表格的形式下载下来。二、Java实现PDF的生成和数据动态插入、导出功能1、第一步:PDF制作模板因为PDF常用的软件不让支持编辑,我们就先使用WPS以Word的形式进行编辑制作出与客户需求一样的样式,然后直接另存为
2022年6月28日
其他

Java 中如何优雅的根治 null 值引起的 Bug 问题,速看分析!

在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不这头绪,它的出现很有可能和当前的业务逻辑并没有关系。但它会让你很头疼。有时候,更可怕的是系统因为这些空值的情况,会抛出空指针异常,导致业务系统发生问题。此篇文章,我总结了几种关于空值的处理手法,希望对读者有帮助。场景存在一个UserSearchService用来提供用户查询的功能:public
2022年6月27日
其他

isEmpty 和 isBlank 的用法区别,居然这么多人答不上来...

三年前,在之前公司上班时,碰到了一个工作三年的程序员,他居然没搞懂isEmpty和isBlank两者的区别,其实我感觉挺无语的,这两个方法在日常开发中应该经常的使用,很熟悉吧!也许你两个都不知道,也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外,并不知道还有isAnyEmpty/isNoneEmpty/isAnyBlank/isNoneBlank的存在。come
2022年6月24日
其他

Spring Boot 框架中如何使用 AOP 防止重复提交?(附源码)

在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端。页面提交请求携带这个提交令牌,后端验证并在第一次验证后删除该令牌,保证提交请求的唯一性。上述的思路其实没有问题的,但是需要前后端都稍加改动,如果在业务开发完在加这个的话,改动量未免有些大了,本节的实现方案无需前端配合,纯后端处理。思路1、自定义注解
2022年6月23日
其他

优秀的 Java 项目,代码都是如何分层的?

Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。VO(View
2022年6月22日
其他

线上接口经常超时,我用线程池 + FutureTask解决了,YYDS!

ThreadFactoryBuilder().setNameFormat("thread-start-runner-%d").build();
2022年6月21日
其他

MySQL 中别再用 OFFSET 和 LIMIT 分页了,试试这种方式!

为什么会在大数据量下的查询带来性能问题?思考完后,可以在思考下,如果分库分表,你会这么去分页呢?不需要担心数据库性能优化问题的日子已经一去不复返了。随着时代的进步,随着野心勃勃的企业想要变成下一个
2022年6月6日
其他

踩坑!Spring 事务方法与非事务方法相互调用 @Transactional 注解失效不回滚?

时是不受事务管理的,autoCommit=true,那么传播给方法B的也为true,执行完自动提交,即使B标注了@Transactional
2022年6月2日
其他

MySQL 数据库中百万级数据量,大神是如何分页查询?

1000,10;是很快的,基本上0.05秒,可是提高90倍,从9万开始,那就是0.05*90=4.5秒的速度了。和测试结果8-9秒到了一个数量级。从这里开始有人提出了分表的思路,这个和dis
2022年6月1日
其他

SpringBoot 集成 Sharding-jdbc + Mybatis-Plus 完美解决分库分表问题

防止主键重复#sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id#
2022年5月31日
其他

微服务 Spring Cloud 架构实现分布式日志采集方案

一、简介分布式应用必须有一套日志采集功能,目的是将分布在各个服务器节点上的应用日志文件采集到统一的服务器上,方便日志的查看。springCloud本身提供了基于elk的日志采集,但是由于使用logstash,会加大运维成本。这里将使用轻量级的方案。二、思路我们的目的是提供轻量级的日志采集来代替logstash,日志最终还是会存进Elasticsearch。为了能轻量级的实现日志采集,并且避免对代码的侵入,我们可以扩展Logback的appender,也可以扩展log4j的appender。这样我们使用slf4j来记录日志的时候,日志自动会保存到Elasticsearch中,并且不用修改任何业务代码。三、自定义Logback
2022年5月26日
其他

Java 性能调优:教你提高代码运行的效率!

我认为,代码优化的最重要的作用应该是:避免未知的错误。在代码上线运行的过程中,往往会出现很多我们意想不到的错误,因为线上环境和开发环境是非常不同的,错误定位到最后往往是一个非常小的原因。然而为了解决这个错误,我们需要先自验证、再打包出待替换的class文件、暂停业务并重启,对于一个成熟的项目而言,最后一条其实影响是非常大的,这意味着这段时间用户无法访问应用。因此,在写代码的时候,从源头开始注意各种细节,权衡并使用最优的选择,将会很大程度上避免出现未知的错误,从长远看也极大的降低了工作量。代码优化的目标是:减小代码的体积提高代码运行的效率本文的内容有些来自网络,有些来自平时工作和学习,当然这不重要,重要的是这些代码优化的细节是否真真正正地有用。那本文会保持长期更新,只要有遇到值得分享的代码优化细节,就会不定时地更新此文。代码优化细节1、尽量指定类、方法的final修饰符带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。2、尽量重用对象特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。3、尽可能使用局部变量调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。4、及时关闭流Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。5、尽量减少对变量的重复计算明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:for
2022年5月25日
自由知乎 自由微博
其他

写一手好SQL很有必要,频繁出现慢SQL告警的优化方案!

博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。其实这是非常低级的错误,我不禁后背一凉,团队成员的技术水平亟待提高啊。改造这些SQL的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。MYSQL性能最大数据量抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。博主曾经操作过超过4亿行数据的单表,分页查询最新的20条记录耗时0.6秒,SQL语句大致是select
2022年5月24日
其他

Redis如何实现故障自动恢复?浅析哨兵的工作原理

这篇文章,我们来看Redis是如何实现故障自动恢复的,它的实现正是要基于之前所讲的数据持久化和数据多副本而做的。Redis作为非常火热的内存数据库,其除了具有非常高的性能之外,还需要保证高可用,在故障发生时,尽可能地降低故障带来的影响,Redis也提供了完善的故障恢复机制:哨兵。下面就来具体来看看Redis的故障恢复是如何做的,以及其中的原理。部署模式Redis在部署时,可以采用多种方式部署,每种部署方式对应不同的可用级别。单节点部署:只有一个节点提供服务,读写均在此节点,此节点宕机则数据全部丢失,直接影响业务master-slave方式部署:两个节点组成master-slave模式,在master上写入,slave上读取,读写分离提高访问性能,master宕机后,需要手动把slave提升为master,业务影响程度取决于手动提升master的延迟master-slave+哨兵方式部署:master-slave与上述相同,不同的是增加一组哨兵节点,用于实时检查master的健康状态,在master宕机后自动提升slave为新的master,最大程度降低不可用的时间,对业务影响时间较短从上面几种部署模式可以看出,提高Redis可用性的关键是:多副本部署
2022年5月23日
其他

阿里规定超过三张表时禁止使用 JOIN 关联查询,为什么呢?

一、问题提出《阿里巴巴JAVA开发手册》里面写了超过三张表禁止加入,这是为什么?二、问题分析对这个结论,你是否有疑问?也不知道是哪位先哲说的不要人云亦云,今天我设计了sql,来验证这个结论。(实验没有从代码角度分析,目前达不到。可以把mysql当一个黑盒,使用角度来验证这个结论)验证结论的时候,会有很多发现,各位往后看。三、实验环境vmware10+centos7.4+mysql5.7.22
2022年5月20日
其他

炸锅了,Java 多线程批量操作,居然有人不做事务控制?

基于两个CountDownLatch控制多线程事务提交由于多线程提交时,每个线程事务时单独的,无法保证一致性,我们尝试给多线程添加事务控制,来保证每个线程都是在插入数据完成后在提交事务,另外,推荐下
2022年5月19日
其他

说说 hashcode() 和 equals() 的作用、区别、联系?

hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:1、equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。2、hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!这种大量的并且快速的对象对比一般使用的hash容器中,比如hashset,hashmap,hashtable等等,比如hashset里要求对象不能重复,则它内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。然而hashCode()和equal()一样都是基本类Object里的方法,而和equal()一样,Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同,所以这显然不是我们想要的,所以我们必须重写我们类的hashCode()方法,即一个类,在hashCode()里面返回唯一的一个hash值,比如下面:自定义一个类,代码如下:class
2022年5月16日
其他

为什么程序员都说 SELECT * 效率低,那究竟是什么原因造成的?

没了”陈小哈:“....??(几个意思)”面试官:“嗯...好,那你还有什么要问我的么?”陈小哈:“我问你个锤子,把老子简历还我!”无论在工作还是面试中,关于SQL中不要用“SELECT
2022年5月13日
其他

你还在使用 BeanUtils 来做对象转换吗?快试试 MapStruct 吧!

assertEquals(orderQueryParam.getReceiverKeyword(),
2022年5月12日
其他

美团面试官问Java线程池,这样的回答让他竖起了大拇指!

这周我投递出了简历,岗位是java后端开发工程师。这周美团面试官给我进行了面试。面试过程中他问了线程池,今天详细讲一讲Java线程池。线程池线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。start();//创建一定数量的线程池,进行线程循环stop();//停止所有线程循环,回收所有资源addTask();//添加任务Excutors创建线程池便捷方法如下:Executors.newFixedThreadPool(100);//创建固定大小的线程池Executors.newSingleThreadExecutor();//创建只有一个线程的线程池Executors.newCachedThreadPool();//创建一个不限线程数上限的线程池,任何提交的任务都将立即执行对于服务端需要长期运行的程序,创建线程池应该使用ThreadPoolExecutor的构造方法public
2022年5月11日
其他

为什么很多公司强制弃坑 Fastjson 了?主推 Jackson

FastJson为何物首先抄录一段来自官网的介绍:FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java
2022年5月10日
其他

Spring 源码分析(二)容器基本用法(系列文章基于Spring 5.0)

}}很普通,Bean没有任何特别之处。的确,Spring的目的就是让我们的Bean能成为一个纯粹的POJO,这也是Spring所追求的。接下来看看配置文件:
2022年5月9日
其他

JWT token 过期后自动续期的解决方案

code(授权码)。code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。第三方应用通过code获取网页授权凭证access_token和刷新凭证
2022年5月7日
其他

Spring Boot 项目不同环境打包配置与Shell脚本部署实践,太实用了!

uat方式指定通过mvn中配置文件来区分不同环境对应的配置文件夹,人工可以手动在idea替换生成不同环境的包(推荐)这里我们要讲的是第二种,首先在mvn中配置如下内容:
2022年5月6日
其他

Spring Boot 集成 WebSocket,实现前后端即时通讯,如此简单!

前言在一次项目开发中,使用到了Netty网络应用框架,以及MQTT进行消息数据的收发,这其中需要后台来将获取到的消息主动推送给前端,于是就使用到了MQTT,特此记录一下。一、什么是websocket?WebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工通信,学过计算机网络都知道,既然是全双工,就说明了服务器可以主动发送信息给客户端
2022年5月5日
其他

推荐 IntelliJ IDEA 15 款超神级插件(自用,真的超级牛掰)

Codota代码提示工具,扫描你的代码后,根据你的敲击完美提示Codota基于数百万个开源Java程序和您的上下文来完成代码行,从而帮助您以更少的错误更快地进行编码。安装:3、Material
2022年4月29日
其他

放弃 JDK8 中 StringBuilder,使用 StringJoiner 辅助类,真香!

StringJoiner(",");IntStream.range(1,10).forEach(i->sj.add(i+""));有哪些平时用的还比较少的功能:setEmptyValue,
2022年4月28日
其他

Spring 框架中解决循环依赖的 3 种方式,值得一看!

对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。第一种:构造器参数循环依赖Spring容器会将每一个正在创建的Bean
2022年4月26日
其他

责任链模式在王者荣耀中的应用,妙啊!

一、简述在王者荣耀商城中,玩家可以参与夺宝抽奖。夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖;在平常,两种夺宝抽奖方式均可以通过60钻石/积分抽奖一次,或者通过270钻石/积分连续抽奖5次;其中,当钻石夺宝幸运值达到201时,可以获得稀有王者水晶,当积分夺宝幸运值达到361时,可以获得稀有荣耀水晶;玩家可以使用王者水晶或荣耀水晶换取特定的英雄、皮肤、装备等。在很多情况下,可以处理某个请求的对象不止一个。很多对象都可以处理申请,而且它们构成一条链,请求沿着这条链传递,这条链就称为职责链。针对以上描述,王者荣耀中的夺宝就是责任链模式在王者荣耀中应用的例子。在这个问题中,玩家通过点击60钻石/积分抽一次或者270钻石/积分抽五次实现抽奖结果。具体而言,我们首先通过一个接口实现接收用户提交的请求,再通过三个类的实例实现具体的处理请求操作;其中,通过类“60钻石/积分抽一次”实现在14种奖品中随机得到一个奖品、类“270钻石/积分抽五次”实现在14种奖品中随机得到五个奖品、类“幸运值达到一定数值之后”实现获得稀有水晶的奖励。二、责任链模式责任链模式理解:
2022年4月25日
其他

23 种设计模式的通俗解释,虽然有点污,但是秒懂!

适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。7、BRIDGE
2022年4月24日
其他

为什么程序员都说 SELECT * 效率低,那究竟是什么原因造成的?

没了”陈小哈:“....??(几个意思)”面试官:“嗯...好,那你还有什么要问我的么?”陈小哈:“我问你个锤子,把老子简历还我!”无论在工作还是面试中,关于SQL中不要用“SELECT
2022年4月23日
其他

Spring 源码分析(一)从基本介绍开始(系列文章基于Spring 5.0)

远程调用你可以使用Spring的Hessian-,Rmi-或HttpInvokerProxyFactoryBean类来通过web服务访问现存的代码。远程访问现存应用程序并不困难。
2022年4月22日
其他

Spring 框架 @Component、@Service 等注解是如何被解析的?

添加到返回结果的listClassPathScanningCandidateComponentProvider#isCandidateComponent其源码如下:protected
2022年4月21日
其他

总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?

前言不得不说SpringBoot的开发者是在为大众程序猿谋福利,把大家都惯成了懒汉,xml不配置了,连tomcat也懒的配置了,典型的一键启动系统,那么tomcat在springboot是怎么启动的呢?内置tomcat开发阶段对我们来说使用内置的tomcat是非常够用了,当然也可以使用jetty。
2022年4月20日
其他

一文彻底搞懂 cookie、session、token,和面试官扯皮就没问题了!

App上,也不可以转到其它用户上。Session只提供一种简单的认证,即有此SID,即认为有此User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App。
2022年4月19日
其他

为并发而生的 ConcurrentHashMap,基于 Java8 分析

操作,整体上还未完成,不过我们要插入的桶的位置已经完成了所有节点的迁移。由于检测到当前哈希表正在扩容,于是让当前线程去协助扩容。关于扩容:一文看懂HashMap扩容为什么总是2的次幂final
2022年4月18日
其他

为什么Spring Boot构造的jar包能直接运行?

在系统属性中设置注册了自定义的URL处理器:org.springframework.boot.loader.jar.Handler。如果URL中没有指定处理器,会去系统属性中查询
2022年4月16日
其他

源码分析系列之HashMap源码分析(基于JDK 1.8)

e;}//上述for循环执行完毕后,e要么指向了存储的新节点,要么是原来已有的元素,具有和新节点一样key值}//当e非空时,说明e是原来HashMap中的元素,具有和新节点一样的key值if
2022年4月15日
其他

主流 Java 进阶技术(学习资料分享)

分享一些Java进阶学习资料,都是目前Java开发比较流行和实用的视频教程和源代码,希望对你有帮助!另外为了方便随时随地在线刷Java面试题,分享面试题集微信小程序,这样就不在发愁找工作时再抽时间整理面试题。Spring
2022年4月14日
其他

Spring 最常用的 7 大类注解,哪些你还不知道?

随着技术的更新迭代,Java5.0开始支持注解。而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架。而spring的的注解那么多,可能做java很多年,都用不上。这里按照类型总结了这7种最常用的注解。一.
2022年4月14日
其他

优秀的 Java 项目,代码都是如何分层的?

Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。VO(View
2022年4月13日
其他

别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!

测试项目构建JMH是内置Java9及之后的版本。这里是以Java8进行说明。为了方便,这里直接介绍使用maven构建JMH测试项目的方式。第一种是使用命令行构建,在指定目录下执行以下命令:$
2022年4月12日
其他

为什么 MySQL 不推荐使用 uuid 或者雪花 id 作为主键?

前言在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?本篇博客我们就来分析这个问题,探讨一下内部的原因。本篇博客的目录mysql程序实例使用uuid和自增id的索引结构对比总结一、mysql和程序实例1.1.要说明这个问题,我们首先来建立三张表分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变.根据控制变量法,我们只把每个表的主键使用不同的策略生成,而其他的字段完全一样,然后测试一下表的插入速度和查询速度:注:这里的随机key其实是指用雪花算法算出来的前后不连续不重复无规律的id:一串18位长度的long值id自动生成表:用户uuid表随机主键表:1.2.光有理论不行,直接上程序,使用spring的jdbcTemplate来实现增查测试:技术框架:springboot+jdbcTemplate+junit+hutool,程序的原理就是连接自己的测试数据库,然后在相同的环境下写入同等数量的数据,来分析一下insert插入的时间来进行综合其效率,为了做到最真实的效果,所有的数据采用随机生成,比如名字、邮箱、地址都是随机生成。package
2022年4月11日
其他

Spring Boot 三大专用开发工具,你都用过么?

lombok.NoArgsConstructor;@AllArgsConstructor//全参构造器@NoArgsConstructor//无参构造器@Data//getter
2022年4月10日
其他

一次 List 集合去重失败,引发对 Java 8 中 distinct() 的思考!

list的转map的另一种猜想Java8使用lambda表达式进行函数式编程可以对集合进行非常方便的操作。一个比较常见的操作是将list转换成map,一般使用Collectors的toMap()方法进行转换。一个比较常见的问题是当list中含有相同元素的时候,如果不指定取哪一个,则会抛出异常。因此,这个指定是必须的。当然,使用toMap()的另一个重载方法,可以直接指定。这里,我们想讨论的是另一种方法:在进行转map的操作之前,能不能使用distinct()先把list的重复元素过滤掉,然后转map的时候就不用考虑重复元素的问题了。使用distinct()给list去重1、直接使用distinct(),失败package
2022年4月9日
其他

Redis 如何实现故障自动恢复?浅析哨兵的工作原理

这篇文章,我们来看Redis是如何实现故障自动恢复的,它的实现正是要基于之前所讲的数据持久化和数据多副本而做的。Redis作为非常火热的内存数据库,其除了具有非常高的性能之外,还需要保证高可用,在故障发生时,尽可能地降低故障带来的影响,Redis也提供了完善的故障恢复机制:哨兵。下面就来具体来看看Redis的故障恢复是如何做的,以及其中的原理。部署模式Redis在部署时,可以采用多种方式部署,每种部署方式对应不同的可用级别。单节点部署:只有一个节点提供服务,读写均在此节点,此节点宕机则数据全部丢失,直接影响业务master-slave方式部署:两个节点组成master-slave模式,在master上写入,slave上读取,读写分离提高访问性能,master宕机后,需要手动把slave提升为master,业务影响程度取决于手动提升master的延迟master-slave+哨兵方式部署:master-slave与上述相同,不同的是增加一组哨兵节点,用于实时检查master的健康状态,在master宕机后自动提升slave为新的master,最大程度降低不可用的时间,对业务影响时间较短从上面几种部署模式可以看出,提高Redis可用性的关键是:多副本部署
2022年4月8日
其他

Java 中 volatile 关键字的最全总结,抓紧差缺补漏吧!

重排序是为了优化性能,但是不管怎么重排序,单线程下程序的执行结果不能被改变。比如:a=1;b=2;c=a+b这三个操作,第一步(a=1)和第二步(b=2)由于不存在数据依赖关系,
2022年4月7日
其他

关于 Redis 性能问题分析和优化方法,非常实用!

一、如何查看Redis性能info命令输出的数据可以分为10个分类,分别是:server,clients,memory,persistence,stats,replication,cpu,commandstats,cluster,keyspace为了快速定位并解决Redis性能问题,这里选择5个关键性的数据指标,它包含了大多数人在使用Redis上会经常碰到的性能问题。二、内存上图中used_memory
2022年4月6日
其他

Spring 中 Controller 是单例还是多例?如何保证并发安全?

单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;prototype:
2022年4月3日