自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

分享传递价值

一个健全的心态比一百种智慧都有力量!

  • 博客(241)
  • 资源 (1)
  • 收藏
  • 关注

转载 【转】重写equals方法和hashcode方法那些事

重要声明:本文内容转载自知乎:看似简单的hashCode和equals面试题,竟然有这么多坑!单纯觉得写得好,所以转载。如有侵权,请联系删除。hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面试星友的情况来说,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要么抓不住重点,答非所问。从这个很小的面试题上我们就可以看出来,对于任何一个面试题来说,...

2020-04-23 22:19:15 975

原创 高并发秒杀功能架构设计

本文包含的知识点秒杀场景简述及分析 使用乐观锁控制库存数量 结合redis缓存层减小DB压力 使用zookeeper分布式锁控制库存数量 kafka异步削峰 接口限流 jmeter压测接口前阵子经常开发一些秒杀/抽奖类型的项目,故而抽时间总结下。把我们产品的流程图大致勾勒了下:项目中的秒杀逻辑简图秒杀一类项目有一些公共的特点:秒杀开始时并发流量瞬间增大 秒...

2018-12-18 23:09:34 5864 17

原创 jdk动态代理和cglib动态代理详解

本文内容概括:静态代理概述 基于继承方式实现静态代理 基于聚合方式实现静态代理 jdk动态代理实现 如何实现一个HashMap的动态代理类 cglib动态代理实现 jdk和cglib代理的区别 动态代理和静态代理的区别 spring如何选择jdk和cglib代理如上图,代理模式可分为动态代理和静态代理,我们比较常用的有动态代理中的jdk动态代理和Cglib代理,像spr...

2018-08-22 15:14:11 9405 15

原创 高并发处理之接口限流

最近开发的抢购活动上线后发现了两个比较明显的问题,其一:活动一开始,接口访问量剧增;其二:黑名单中增加了一大批黑名单用户(或者说IP),这其中就包含了一些恶意用户或机器人刷接口。针对一些高并发的接口,限流是处理高并发的几大利剑之一。一方面,限流可以防止接口被刷,造成不必要的服务层压力,另一方面,是为了防止接口被滥用。限流的方式也蛮多,本篇只讲几种我自己常用的,并且是后端的限流操作。漏桶...

2018-06-13 18:24:56 27079 15

原创 Redis缓存穿透、缓存雪崩问题分析

把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下:(一)缓存和数据库间数据一致性问题分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两...

2018-06-01 22:16:35 96370 22

原创 ConcurrentHashMap详解

线程安全的HashMap虽然经常被我们使用,但是也存在两个比较明显的缺点: 线程不安全,效率比较低; 并发编程时容易死循环; 而使用HashTable虽然能解决并发问题,但是由于使用了synchronized来实现锁机制,也使得在并发时读写效率较低。基于以上几点的话,我们会考虑使用ConcurrentHashMap来替代。不得不说的是concurrentHashMap的设计是比较出色的,它将数据分...

2018-05-24 15:52:27 24762 2

原创 Java线程池详解

本文包含知识点为什么需要使用线程池? 线程池的创建及重要参数 springboot中使用线程池1.为什么需要线程池?java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也会占用过多的内存,这个时候引入线程池比较合理,方便线程任务的管理...

2018-04-08 19:07:23 62253 14

原创 HashMap结构图及特点

HashMap基于Map接口,其提供了Map接口中几乎所有的操作,允许空值和空键,不保证元素的次序,线程不安全。由于数组查询操作速度快,链表插入更改操作快,hashmap底层即采用这两种数据结构来实现。截图取自《java编程思想》jdk 1.7版本HashMap put()方法结合put源码来看下,调用map.put()方法时候到底做了哪些事情:核心步骤:1、判断存放e...

2018-03-15 14:18:40 2542

转载 (转)深拷贝与浅拷贝详解

1.拷贝的引入(1)引用拷贝创建一个指向对象的引用变量的拷贝。例1:

2021-05-29 12:20:20 749

原创 接口幂等性设计的简单思考

幂等性场景接口重试:服务A调用服务B,B由于某些原因未在指定时间内返回响应,出于容错性考虑服务A进行多次重试,服务B接口未做幂等性设置,影响业务数据; 表单重复提交:用户注册接口,用户很激动,瞬时点击多次造成表单重复提交,造成同一用户注册多次; 请求重发:网络抖动引发的nginx重发请求,造成重复调用; 消息重复消费:例如kafka的"再均衡"造成消息重复消费,影响业务数据;幂等性含义从数学的角度来看,幂等性表示为f(f(x))=f(x),即x经过同一函数多次计算和一次计算的效果相同,从程序

2021-02-23 22:51:06 917

原创 解决Kafka消费端错误:o.s.kafka.listener.LoggingErrorHandler : Error while processing: null

简单记录下使用kafka遇到的问题,万一也会有小伙伴遇到了呢。程序端使用springboot服务消费kafka,某天出现消息大量堆积,经过定位到错误日志如下:2020-05-12 10:22:36.500 ERROR 5171 --- [org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1] o.s.kafka.listener.LoggingErrorHandler : Error while processing:

2020-05-12 12:06:41 10028

原创 Mysq limit深度分页解决方案

有个机构基本信息表,数据量200多万,使用select * fromorg_basic_info limit2016582,100查询耗时10s,表结构如下:普通的limit m,n,m表示偏移量,n表示返回条数,当m偏移量很大时,就需要扫描过多的表数据,例如limit1000000,100,查询就需要扫描1000100条,然后舍弃掉不符合条件的前1000000条,效率自然也就低了。...

2020-04-23 17:50:02 1922 1

原创 CopyOnWriteArrayLis简单使用

背景Collections.synchronizedList()、Vector虽然线程安全,但是使用的synchronized锁实现,锁粒度较粗,且迭代时候不允许修改,否则会抛出异常,鉴于这种情况,java.util.concurrent包下提供了CopyOnWriteArrayList、CopyOnWriteSet一类的并发集合,本文以CopyOnWriteArrayList为例,简单聊聊这...

2020-03-24 18:11:23 1180 1

原创 优雅的替换if-else语句

场景日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段:优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

2020-03-18 23:09:30 28685 33

原创 RestTemplate调用post方式接口

场景~我的服务是应用层,要调用其它项目组的搜索接口,接口访问方式是HTTP POST,搜索接口中用了@RequestBody注解修饰入参,希望接收到的参数格式为:按照正常思路,噌噌噌的写了如下代码:HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON_U...

2020-03-18 22:03:26 3307 1

原创 mysql中将时间戳转换为指定日期格式from_unixtime

场景给某客户用的POC数据落地在我司的测试环境,有程序拉取数据解析后落地到mysql中,再导出excel给客户,由于数据量不大且是测试环境,故没有开发专门的导出接口,而是Navicat中进行select查询再导出结果集,其中有个"发布时间"、"创建时间"等时间字段都是存的13位时间戳格式,用bigint字段类型存储的,需要将这个13位时间戳转换成"yyyy-MM-dd HH:mm:ss"格式显...

2020-03-18 21:21:16 2126

转载 Java中的共享锁和排他锁(以读写锁ReentrantReadWriteLock为例)

重要声明:本人之前对java中的读写锁也不是非常了解,用的也不是很多,尤其在读写锁的策略原理一块没有深究过,本篇文章是在学习【玩转Java并发工具,精通JUC,成为并发多面手】课程后写的,故文章类型选择为"转载",因为本文的很多结论都是来自于那门课程,请知悉~。希望对各位同仁有帮助~读写锁的基本使用在【ReentrantLock锁详解】一文中讲到了java中锁的划分,本篇主要讲述共享锁和...

2020-02-14 16:11:41 4698 1

原创 CAS原理详解

本文包含知识点CAS是什么? CAS应用场景及原理 CAS的不足1.CAS是什么?CAS是Compare And Swap的缩写,比较并更新,是非阻塞同步的实现原理,它是CPU硬件层面的一种指令,从CPU层面能保证"比较并更新"两个操作的原子性。CAS指令操作包括三个参数:内存值(内存地址值)V、预期值A、新值B,当CAS指令执行时,当且仅当预期值A和内存值V相同时,才更新内存值...

2020-02-12 22:46:20 1673

原创 ThreadLocal类(线程本地存储)详解

本文包含知识点ThreadLocal是什么? ThreadLocal使用场景 ThreadLocal的具体使用 ThreadLocal注意事项1.ThreadLocal是什么?从广义上来说实现线程安全的方式包括:互斥同步、非阻塞同步、无同步方案三种,ThreadLocal就属于无同步方案中的一种。ThreadLocal被称为线程本地存储,顾名思义就将共享的数据存储到每个线程本...

2020-02-11 13:07:09 3788 3

原创 记录一次pre环境OOM异常解决过程

问题发现部署在客户机器上的程序经常发生OOM异常:java.lang.OutOfMemoryError: GC overhead limit exceeded。初步排查1、系统本身代码问题;2、系统大量调用了第三方接口http超时或者被第三方服务超量调用;3、机器问题;这个程序的主要作用就是拉取kafka里的消息落地到mysql,外加两个kafka消息写入及堆积的监控接口,不涉及到被其...

2020-01-10 14:04:06 3569 2

转载 面试时如何做自我介绍?聪明的应聘者只聚焦1点

最近帮其它项目组同事面试了几位java后端开发人员,发现他们刚开始的自我介绍一段都非常的不理想,扯了半天完全没有主次重点,然后想起之前收藏的这篇文章,觉得很有必要分享给在或即将踏上求职路上的你。重要声明:本文转自微信公众号:Yangongzi2015自我介绍通常是面试过程中的第一个问题,它非常关键,直接影响了面试官对你的第一印象。那么,自我介绍时,面试官到底想要听什么?容易犯哪几个误区...

2019-11-07 18:29:09 3121

原创 记录一次线上mysql事务隔离级别引发的思考

场景:我们公司在客户方(某证券公司)部署了几套程序,用来监听客户方内网kafka消息(kafka消息是我们公司写入的),一旦监听到消息便即时消费写入到相关的表中(一个主表及6个子表),然后客户部门再同步数据给他们的下游业务部门使用。某天客户来电说:"需要主表增加一个字段,用来存储与其相关联的子表数据,拼成一个json格式存储在主表字段中",原因是下游部门在使用数据的时候发现:比如,某个时刻A主表...

2019-10-25 15:19:45 2794 4

原创 intellij idea左侧project导航栏设置背景色

点击这里查看 <intellij idea使用教程汇总篇>引言:最近几天眼睛莫名的很疼,买了两瓶进口的眼药水,有点效果,虽然将idea的代码编辑区背景色设置成了苹果色"#CCE8CF",但是左侧project栏目导航栏还是白色的,一直设置无果,强迫症犯了,折腾了一会搞定。(今天还把我的Chrome安装了“眼睛护航”插件,"神经质"犯病了),最终效果如图(控制台、代码编辑区、左侧pr...

2019-07-30 10:43:31 25971 9

原创 Chrome浏览器解决插件安装"CRX-INVALID-HEAD"问题

今天安装在Chrome浏览器上面安装插件时,直接将下载好的插件拖入到浏览器的插件页面,发现出现“CRX-INVALID-HEAD"问题,一小番折腾后搞定,记录下解决方案:1、将下载好后的“×××.crx”的扩展程序直接修改后缀为.zip,变成“×××.zip”;2、将"×××.zip”文件解压,我这里用的是WinRAR解压,解压后得到如下:3、打开Chrome浏览器的扩展程序页...

2019-07-30 10:20:24 4210

原创 java实现文件打包压缩下载接口(附上可实际运行的代码)

最近在写项目接口,涉及到文件下载、打包压缩下载,单个文件下载还是比较简单的,多文件下载涉及到打包和压缩知识,之前也没做过,写篇博客做个简单的记录一下。闲言少叙,上代码:如下代码是精简过后的测试代码,亲测可实际使用:/** * @author simons.fan * @version 1.0 * @date 2019/7/9 * @description 文件下载controll...

2019-07-10 16:31:08 4723 5

原创 SpringMvc中返回json时对象属性为空也要返回key

场景: 最近在写接口时候,正常使用@RestController返回json串,发现当返回的对象里的属性值为空字符串或者null时候,json返回里就会自动去除这个key,啥意思呢?举个"栗子":/** * 商品评论、回复、点赞【查询】接口 * * @param goodsId * @param userId * @param currenP...

2019-07-08 11:16:23 7973

原创 记录一次mysql导入导出数据过程

本文包含知识点:1、mysql数据库给大表增加字段;2、mysql表分区;3、linux排查磁盘空间;4、linux中的mysql导入导出数据;环境:centos7.4 + mysql5.7.24事件原由:线上版本迭代的过程中,根据新需求需要对表进行增减字段、重新分区,表数据达到一定量(600W左右),占用磁盘100多G,表结构如下:CREATE TABLE `ne...

2019-06-12 11:00:45 2621

转载 项目中常用的19条MySQL优化(转载)

重要声明: 本文转自https://segmentfault.com/a/1190000012155267一、EXPLAIN做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选...

2019-05-09 20:22:13 588

转载 不就是个短信登录API嘛,有这么复杂吗?(转载)

重要声明: 本篇文章转载自公众号ThoughtWorks洞见(ID:TW-Insights),个人觉得文章分析问题的思路还行,如有侵权,请联系删除,谢谢。上联:这个需求很简单,下联:怎么实现我不管,横批:今晚上线暴力破解上开完站会,小李领了张新卡,要对登录功能做升级改造,在原来只支持用户名密码登录模式的基础上,新增手机号和短信验证码登录。业务分析师薇薇早就准备好了故事...

2019-05-09 20:03:56 1023 2

原创 使用ProcessOn在线画流程图

题外话:年后刚换工作,两个月没更新博客了~~前言作为一名专业的程序员,项目中经常需要用到流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计等,这个时候一个好的画图工具是必不可少了,你可能会使用Microsoft Visio工具,我在这里推荐使用ProcessOn,在线工具,浏览器直接访问https://www.processon.com/即可使用,非常方便,来看...

2019-04-14 16:09:33 12796 4

原创 intellij idea查看方法被哪些类引用过?

点击这里查看 &lt;intellij idea使用教程汇总篇&gt;场景: 项目开发时候经常需要修改某个类的方法,于是想要看下项目里这个类的方法被哪些类引用过,一种比较挫的方式是根据方法名字 Ctrl+Shift+f 进行全局搜索,这样可以实现却非最佳实践,idea中是支持快速查看方法的引用类的。鼠标光标需要放在方法名字上,然后快捷键Alt+F7,出现弹层点击Yes项,即可出现该方法被哪...

2019-01-30 11:30:58 34119 2

原创 java list和map的初始化

项目中经常需要使用到ArrayList、HashMap集合的初始化操作,下面分享几种ArrayList实例化的方法,都是项目中实际用到的,方法二、三同样适用于HashMap等其他常用的集合类方法一:普通版 List&lt;String&gt; list = new ArrayList&lt;String&gt;(); list.add("a"); Map&lt;S...

2019-01-29 16:53:00 3364 2

转载 知乎7万赞回答:你思考问题的方式,决定了你的层次

重要声明:本文出自公众号:《管理的常识》"知乎7万赞回答:你思考问题的方式,决定了你的层次"一文。本人觉得写得蛮好,分享给大家,共勉!文章有点长,看完全文需要点耐心……所谓厉害的人,遇到问题时的思维模式,跟我们的差别在哪?这篇文章里,作者从“一家零售店的困境”出发,用实际例子来解读6种层次不同的人才,是如何思考、解决问题的。思维层次,很大程度会决定你的人生高度。文章看不懂的地方可以...

2019-01-29 10:25:50 5028 3

转载 java后端面试总结

重要声明:本文转自https://www.cnblogs.com/JavaArchitect/p/10011253.html    在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间。我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面的。    我也知道,不少候选人能力其实不差,但面试时没准备...

2019-01-25 15:49:36 5245 5

转载 避免SQL注入

重要声明:本文转自https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/09.4.md什么是SQL注入SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至...

2019-01-25 10:10:08 698

原创 mysql和elastic search数据同步方案

方案一利用es api实时写入es中优点:实时性高,能灵活控制写入es的时间缺点:同步方案与业务逻辑耦合,严重依赖于es api,破坏了原有业务程序逻辑demo:https://blog.csdn.net/fanrenxiang/article/details/86509688备注:实时同步的场景比较多,比如后台维护(CRUD)基础数据或者接口调用时候,把es同步写逻辑加入到之...

2019-01-22 14:43:43 3424

原创 策略模式详解

策略模式核心点: 把每个核心方法逻辑抽象封装出来,使得程序调用结构更加灵活和扩展。典型应用就是用来替换程序中过多的if else分支结构。当程序逻辑分支很多时,我们会选择if else语句或switch case语句来切分,但是这样的结果往往是程序难以维护,例如下面一段代码,是根据价格包pricecode来区分给用户赠送哪些权益类型:原来的if else嵌套结构可以看到,一个充值方法...

2019-01-22 10:31:17 619

转载 java面试技巧

重要声明: 本文出自https://www.cnblogs.com/rjzheng/p/10275453.html原标题为"平时的你VS面试的你",个人觉得可以归纳为一些java面试时的小技巧,在技术面试没啥大问题的前提下,"征服"HR势必也能给你带来额外的效果。面对HR问题:你是如何和你同事相处的?平时的你:卧槽,知不知道我很忙的,这点破事也来问我,能不能别来烦我!面试的你:...

2019-01-21 14:44:28 1111 2

原创 Elastic Search Java API(文档操作API、Query DSL查询API)、es搜索引擎实战demo

elastic search实战小demo:https://github.com/simonsfan/springboot-quartz-demo,分支:feature_es之前在 Elastic Search之Search API(Query DSL)、Elasticsearch之索引和文档API 文章中讲到过elastic search(以下简称es)的以下常用的原生api,本篇开始讲述如...

2019-01-17 18:48:17 30164

原创 NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{QVFHsEVaRHiYIb

使用java api和elastic search进行交互时,进行到如下代码编写:elasticsearch: cluster: name: elasticsearch host: 127.0.0.1 port: 9200SearchRequestBuilder searchRequestBuilder = this.esClient .prep...

2019-01-17 11:18:22 58785 2

mybatis逆向生成xml和pojo工具

mybatis逆向生成xml和pojo,解压下载后得zip文件,得到的文件可以直接在idea或者eclipse中打开或者导入,需要改动的地方有:数据库连接信息、targetPackage属性是配置生成后的bean和xml的位置、表名,使用非常方便,直接运行MyBatisGeneratorMain类里的main方法即可,,不需要和你现有的项目有任何的耦合,直接把生成后的xml、实体类copy到你的所需项目中即可。如使用有障碍,请留言。

2018-05-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除