java
文章平均质量分 81
ouseika
这个作者很懒,什么都没留下…
展开
-
什么是缓存穿透,如何解决?
日常开发中,大家经常使用缓存,但是你知道大型的互联网公司面对高并发流量,要注意缓存穿透问题吗!!! 本文会介绍布隆过滤器,空间换时间,以较低的内存空间、高效解决这个问题。1、性能不够,缓存来凑现在的年轻人都喜欢网购,没事就逛逛淘宝,剁剁手,买些自己喜欢的东西,释放下工作压力。地址:https://detail.tmall.com/item.htm?id=628993216729上图是一个天猫 iphone12 的商品详情页,id表示商品的编号我们都知道淘宝的访问...原创 2021-08-12 11:36:40 · 1675 阅读 · 0 评论 -
SpringBoot 代码规范
如何更规范化编写Java 代码Many of the happiest people are those who own the least. But are we really so happy with our IPhones, our big houses, our fancy cars?忘川如斯,拥有一切的人才更怕失去。背景:如何更规范化编写Java代码的重要性想必毋需多言,其中最重要的几点当属提高代码性能、使代码远离Bug、令代码更优雅。一、MyBatis 不要为了多个查询..原创 2021-08-12 10:14:18 · 1479 阅读 · 0 评论 -
对象copy之BeanUtils
这里说的是spring的BeanUtils.copyProperties。场景开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法: 一个一个set 用BeanUtils.copyProperties 很显然BeanUtils更加方便,也美观很多。那么任何情况都能使用BeanUtils么,当然不是。要先了解他。BeanUtils是深拷贝,还是浅拷贝?是浅拷贝。 浅拷贝:只是调用子对象的set方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)原创 2021-08-12 09:58:58 · 511 阅读 · 0 评论 -
Nginx 应用场景
一、HTTP服务器Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。1、 首先在文档根目录Docroot(/usr/local/var/www)下创建html目录, 然后在html中放一个test.html;2、 配置nginx.conf中的serverusermengdaystaff;http{server{listen80...原创 2021-08-12 09:54:58 · 125 阅读 · 0 评论 -
Field injection is not recommended的原因探解
本章的内容主要是想探讨我们在进行 Spring 开发过程当中,关于依赖注入的几个知识点。感兴趣的读者可以先看下以下问题: @Autowired,@Resource,@Inject三个注解的区别 当你在使用@Autowired时,是否有出现过Field injection is not recommended的警告?你知道这是为什么吗? Spring 依赖注入有哪几种方式?官方是怎么建议使用的呢? 如果你对上述问题都了解,那我个人觉得你的开发经验应该是不错的????。下面原创 2021-08-12 09:48:13 · 2918 阅读 · 0 评论 -
一种通用整形数组压缩方法
我们在开发中后台应用或者中间件的时候,会存储一些数据在内存中以加快访问速度。随着数据量的增加,除了可以放置于堆外,还可以通过实时压缩来缓解。今天就给大家介绍一种压缩整形数组的方式。一 数据压缩数组指long[]或者int[]类型,在 Java 中应用很广。当数据量很大时,其内存占用的问题便突显出来,原因是一个 long 类型是占 8 个字节,而 int 也是占用 4 个字节,当有千万级别的数据时,其占用的空间便是上百 MB 级别的了。1 去冗余首先想到的就是缩减每个数字占用的空间...转载 2021-07-14 09:01:24 · 929 阅读 · 0 评论 -
有了HTTP,为什么还要RPC?
本文简单地介绍一下两种形式的 C/S 架构,先说一下他们最本质的区别,就是 RPC 主要是基于 TCP/IP 协议的,而 HTTP 服务主要是基于 HTTP 协议的。我们都知道 HTTP 协议是在传输层协议 TCP 之上的,所以效率来看的话,RPC 当然是要更胜一筹啦!下面来具体说一说 RPC 服务和 HTTP 服务。OSI 网络七层模型在说 RPC 和 HTTP 的区别之前,我觉的有必要了解一下 OSI 的七层网络结构模型(虽然实际应用中基本上都是五层)。它可以分为以下几层:(从上到下原创 2021-06-28 11:58:33 · 141 阅读 · 1 评论 -
PO,VO,DAO,BO,POJO 详解
POpersistant object:持久层对象。对应数据库中表的字段。VO 和 PO 都是属性加上属性的 get 和 set 方法;表面看没什么不同,但代表的含义是完全不同的。DTOdata transfer object:数据传输对象。表里面有十几个字段:id,name,gender(M/F),age,conmpanyId(如001)...页面需要展示四个字段:name,gender(男/女),age,conmpanyName(如今日头条股份有限公司)。DTO由此产生,一是原创 2021-06-17 16:06:51 · 147 阅读 · 0 评论 -
MySql批量插入时,如何不插入重复的数据?
业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率看来这个问题不止我一个人苦恼过。解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了。几百万的数据,不可能查出来,做去重处理...转载 2021-06-17 16:02:00 · 230 阅读 · 0 评论 -
Springboot中常用的log组件分析
Slf4jslf4j 的全称是 Simple Loging Facade For Java,它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则而已。所以单独的 slf4j 是不能工作的,必须搭配其他具体的日志实现方案,比如 apache 的 org.apache.log4j.Logger,jdk 自带的 java.util.logging.Logger 等。简单语法SLF4J 不及 Log4J 使用普遍,因为许多开发者熟悉 L原创 2021-03-18 14:01:58 · 488 阅读 · 0 评论 -
SpringCloud中Hystrix容错保护原理及配置
1 什么是灾难性雪崩效应?如下图的过程所示,灾难性雪崩形成原因就大致如此:造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用。如:硬件故障、程序BUG、缓存击穿、并发请求量过大等。 重试加大流量。如:用户重试、代码重试逻辑等。 服务调用者不可用。如:同步请求阻塞造成的资源耗尽等。 雪崩效应最终的结果就是:服务链条中的某一个服务不可用,导致一系列的服务不可用,最终造成服务逻辑崩溃。这种问题造成的后果,往往是无法预料的。2 如何解决灾难性雪崩效应?转载 2021-03-16 16:57:37 · 177 阅读 · 0 评论 -
redis 做缓存时常见问题
1.缓存雪崩什么是缓存雪崩 缓存雪崩就是指缓存由于某些原因(比如 宕机、cache服务挂了或者不响应)整体crash掉了,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。如何解决?1. 高可用 多增加几台redis,防止一台挂掉,整个服务不可用2.先来降级 缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。或者使用断路器,如果缓存宕机,为了防止系统全部宕机,限制部分流量进入 DB,保证部分可用,其余的请求返回断路器的默认值。3.数据预热...原创 2021-03-15 10:22:21 · 170 阅读 · 0 评论 -
mysql性能优化策略
1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。4,应尽量原创 2021-03-12 09:12:34 · 129 阅读 · 0 评论 -
mysql 常用命令
库的基本操作1.创建数据库:mysql>createdatabaseceshi;2.连接数据库mysql>useceshi;3.查看当前使用的数据库mysql>selectdatabase();4.当前数据库包含的表信息mysql>showtables;5.删除数据库mysql>dropdatabaseceshi;表的基本操作一、建表1.命令:createtable<表名>(<字段...原创 2021-03-12 08:57:38 · 103 阅读 · 0 评论 -
微信公众号获取不到用户发送的消息和事件的解决方案
最近做关于微信共中号的开发,遇到了一个很奇怪的问题,无论如何也收不到用户发送过来的消息和接收不到事件,通过微信提供的工具检测也是没有问题的检测结果为:提示是成功的,但是怎么也就接收不到对应的消息。。。最后突然想起来之前好像遇到过,具体忘记了,好像要加结束 / ,抱着试试的心态试了一下,果然好了解决方案:在配置的接口中,请求地址之后加/能解决问题,如下图所示:真是太坑了,特此记录,希望能帮助更多的人,也希望微信能解决这个bug...原创 2021-03-09 16:46:30 · 3433 阅读 · 4 评论 -
synchronized 实现原理
前言众所周知synchronized锁在Java中经常使用它的源码是C++实现的,它的实现原理是怎样的呢?本文以OpenJDK 8为例探究以下内容。synchronized 是如何工作的 synchronized 锁升级过程 重量级锁的队列之间协作过程和策略对象头对象头的内容非常多这里我们只做简单介绍以引出后文。在 JVM 中对象布局分为三块区域:对象头 实例数据 对齐填充当线程访问同步块时首先需要获得锁并把相关信息存储在对象头中。所以wait、notify...原创 2021-03-05 11:20:45 · 484 阅读 · 1 评论 -
设计模式基础之——模板模式业务实战
前言本文章主要采用如下结构:什么是「XX 设计模式」? 什么真实业务场景可以使用「XX 设计模式」? 怎么用「XX 设计模式」?本文主要介绍「模板模式」如何在真实业务场景中使用。什么是「模板模式」?抽象类里定义好算法的执行步骤和具体算法,以及可能发生变化的算法定义为抽象方法。不同的子类继承该抽象类,并实现父类的抽象方法。模板模式的优势:不变的算法被继承复用:不变的部分高度封装、复用。 变化的算法子类继承并具体实现:变化的部分子类只需要具体实现抽象的部分即可,方便扩展,且可无限原创 2021-03-05 11:15:39 · 302 阅读 · 0 评论 -
数据库SQL语句中 where,group by,having,order by的执行顺序
一、SQL查询1.查询中用到的关键词主要包含六个,并且他们的顺序依次为:select>from>where>group by>having>order by其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行:from>where>group by>having>select>order byfrom:需要从哪个数据表检索数据where:过滤表中数原创 2021-03-03 08:46:50 · 2046 阅读 · 0 评论 -
ArrayList与linkedList区别及扩容方式
1. ArrayArray(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据, (因为删除数据以后, 需要把后面所有的数据前移)缺点:数组初始化必须指定初始化的长度, 否则报错例如:int[] a = new int[4];//推介使用int[] 这种方式初始化int c[] = {23,43,56,78};//长度:4,索引范围:[0,3]2.原创 2021-03-03 08:43:41 · 1499 阅读 · 0 评论 -
Java 编程规范 ---- 华为篇
1、引言这个标准是衡量代码本身的缺陷,也是衡量一个研发人员本身的价值。华为作为一家全球化的 IT 公司,十几万员工,无论是人事管理,还是代码管理,都是一件不容易的事情,没有规范的约束,想想都是件可怕的事情。下面挑选了一些网上流传的编程规范,一起来学习下,以下内容不涉及基础的语法规范(请见 Refer),更侧重于一些编程习惯,如何提高程序的健壮性、可维护性等。2、军规简介军规一:【避免在程序中使用魔鬼数字,必须用有意义的常量来标识。】军规二:【明确方法的功能,一个方法仅完成一个功能。】军规原创 2021-03-02 13:40:52 · 1948 阅读 · 0 评论 -
RabbitMQ 总结
前言 -RabbitMQ 是基于 AMQP 协议的,通过使用通用协议就可以做到在不同语言之间传递。- AMQP 协议 -核心概念1、Server:又称 broker,接受客户端连接,实现 AMQP 实体服务。2、Connection:连接和具体 broker 网络连接。3、Channel:网络信道,几乎所有操作都在 channel 中进行,channel 是消息读写的通道。客户端可以建立多个 channel,每个 channel 表示一个会话任务。4...原创 2021-02-25 09:53:09 · 307 阅读 · 0 评论 -
Jar包冲突问题及解决方案!
Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版本而导致,可采用依赖排除、依赖管理等常规方式来尝试解决该问题,但这些方式真正能彻底解决该冲突问题吗?答案是否定的。笔者之所以将文章题目起为“重新看待”,是因为之前对于Jar包冲突问题的理解仅仅停留在前面所说的那些,直到在工作中遇到的一系列Jar包冲突问题后,才发现并不是那么简单,对该问题有了重新的认识,接下来本文将围绕Jar包冲突的问题本质和相原创 2021-02-25 09:31:28 · 1926 阅读 · 2 评论 -
MyBatis 的执行流程
前言MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下: 1、Mapper接口和映射文件是如何进行绑定的 2、MyBatis中SQL语句的执行流程 3、自定义MyBatis中的参数设置处理器typeHandler 4、自定义MyBatis中结果集处理器typeHandler PS:本文基于MyBatis3.5.5版本源码。概要在MyBatis中,利用编程式进行数据查询,主要就原创 2021-02-23 15:00:19 · 162 阅读 · 0 评论 -
lambda 使用心得
1、什么是函数式接口 1.1 java8自带的常用函数式接口。 1.2 惰性求值与及早求值 2、常用的流 2.1 collect(Collectors.toList()) 2.2 filter 2.3 map 2.4 flatMap 2.5 max和min 2.6 count 2.7 reduce 3.1 转换成值 3.2 转换成块..原创 2021-02-23 14:53:08 · 370 阅读 · 5 评论 -
Google Guava 初了解
以面向对象思想处理字符串:Joiner/Splitter/CharMatcherJDK提供的String还不够好么?也许还不够友好,至少让我们用起来还不够爽,还得操心!举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。那么,看下面的代码示例,guava让你不必在操心这些:Joiner/SplitterJoiner是连接器,Splitter是分割器,通常原创 2021-02-03 10:21:26 · 156 阅读 · 0 评论 -
retrofit 初了解
在SpringBoot项目直接使用okhttp、httpClient或者RestTemplate发起HTTP请求,既繁琐又不方便统一管理。因此,在这里推荐一个适用于SpringBoot项目的轻量级HTTP客户端框架retrofit-spring-boot-starter,使用非常简单方便,同时又提供诸多功能增强。目前项目已经更新至2.2.2版本,并且会持续进行迭代优化。github项目地址:https://github.com/LianjiaTech/retrofit-spring-boot-st原创 2021-02-03 10:17:50 · 745 阅读 · 0 评论 -
SpringBoot 接口幂等性的实现方案
一、什么是幂等性幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。二、什么是接口幂等性在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即第原创 2021-02-03 10:13:12 · 97 阅读 · 0 评论 -
AVL树详解
什么是AVL树AVL树,是一种平衡(balanced)的二叉搜索树(binary search tree, 简称为BST)。由两位科学家在1962年发表的论文《An algorithm for the organization of information》当中提出,作者是发明者G.M. Adelson-Velsky和E.M. Landis(链接由维基百科提供)。它具有以下两个性质: 任意一个结点的key,比它的左孩子key大,比它的右孩子key小; 任意结点的孩子结点之间高度差距最大为原创 2021-02-02 08:46:11 · 1752 阅读 · 0 评论 -
String hashCode 方法为什么选择数字31作为乘子
1. 背景某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。2. 选择数字31的原因在详细说明 String ha原创 2021-02-02 08:44:25 · 230 阅读 · 0 评论 -
RPC实现以及相关学习
我们即希望能够敏捷开发,不做重复的劳动,用别人的势能赋能自己;又要成为一名能够赋能别人的人,拥有自身的势能。在一个拥有成千上万大大小小的服务的公司里,每个团队在不同的机器上部署它们自己的服务,所以真实开发一个新服务的场景一定需要考虑两个问题: 我的团队开发一个新服务,可能需要调用别人的服务。 我的团队开发一个新服务,别的团队可能会调用。 RPC调用的变与不变由于服务部署在不同机器,想要进行服务间的调用必须进行网络通信,那服务消费方每调用一个服务都要写一大堆网络通信的东西,不仅复杂原创 2021-01-30 17:16:54 · 163 阅读 · 0 评论 -
JVM知识点
1、你在项目中都使用了哪些参数打印GC?具体的参数名称记不清楚了,但是我一般在项目中输出详细的 GC 日志,并加上可读性强的 GC 日志的时间戳。特别情况下我还会追加一些反映对象晋升情况和堆详细信息的日志,这些会单独打到gc.log文件中用来排查问题。另外,OOM 时自动 Dump 堆栈,我一般也会进行配置。2、常用的调优工具有哪些?JDK内置的命令行:jps(查看jvm进程信息)、jstat(监视jvm运行状态的,比如gc情况、jvm内存情况、类加载情况等)、jinfo(查看jvm参数的,也可原创 2021-01-30 17:13:12 · 184 阅读 · 1 评论 -
Java 8 中使用 Optional 处理 null 对象
系统环境: Java JDK 版本:1.8 参考地址: Oracle JDK API 参考文档 https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html 菜鸟教程-Java 8 Optional 类 https://www.runoob.com/java/java8-optional-class.html一、Optional 简介Optional 是一个容器对象,可以存储对象、字符串等值,原创 2021-01-30 17:10:15 · 138 阅读 · 0 评论 -
SpringBoot 超全注解
一、注解(annotations)列表1、@SpringBootApplication包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。2、@ComponentScan组件扫描,可自动发现和装配一些Bean。3、@Configuration等同于Spring的XML配置文件;使用Java代码可以检查类转载 2021-01-30 17:06:39 · 68 阅读 · 0 评论 -
数据库链接池注意事项
数据库连接池的配置是开发者们常常搞出坑的地方,在配置数据库连接池时,有几个可以说是和直觉背道而驰的原则需要明确。1万并发用户访问想象你有一个网站,压力虽然还没到Facebook那个级别,但也有个1万上下的并发访问——也就是说差不多2万左右的TPS。那么这个网站的数据库连接池应该设置成多大呢?结果可能会让你惊讶,因为这个问题的正确问法是: “这个网站的数据库连接池应该设置成多小呢?” 下面这个视频是Oracle Real World Performance Group发布的,请先看完:ht原创 2021-01-30 10:39:48 · 164 阅读 · 0 评论 -
CountDownLatch 用法和详解
CountDownLatch是多线程控制的一种工具,它被称为门阀、计数器或者闭锁。这个工具经常用来用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。下面我们就来一起认识一下 CountDownLatch认识 CountDownLatchCountDownLatch 能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。它相当于是一个计数器,这个计数器的初始值就是线程的数量,每当一个任务完成后,计数器的值就会减一,当计数器的值为 0 时,表示所有的线程都已经...原创 2021-01-29 20:07:40 · 10822 阅读 · 0 评论 -
@Autowire 警告的原因
今天使用Idea写代码的时候,看到之前的项目中显示有warning的提示,去看了下,是如下代码?@AutowireprivateJdbcTemplatejdbcTemplate;提示的警告信息Field injection is not recommended Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always..原创 2021-01-29 19:47:29 · 682 阅读 · 0 评论 -
List数据去重
1.使用LinkedHashSet删除arraylist中的重复数据LinkedHashSet是在一个ArrayList删除重复数据的最佳方法。LinkedHashSet在内部完成两件事: 删除重复数据 保持添加到其中的数据的顺序 Java示例使用LinkedHashSet删除arraylist中的重复项。在给定的示例中,numbersList是包含整数的arraylist,其中一些是重复的数字。例如1,3和5.我们将列表添加到LinkedHashSet,然后将内容返回到列表中。原创 2021-01-29 19:45:01 · 111 阅读 · 0 评论 -
SpringBoot 注解 详解
一、注解(annotations)列表1、@SpringBootApplication包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。2、@ComponentScan组件扫描,可自动发现和装配一些Bean。3、@Configuration等同于Spring的XML配置文件;使用Java代码可以检查类转载 2021-01-20 14:08:53 · 74 阅读 · 0 评论 -
数据脱敏的6种方案
什么是数据脱敏先来看看什么是数据脱敏?数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如手机号、银行卡号等信息,进行转换或者修改的一种技术手段,防止敏感数据直接在不可靠的环境下使用。像政府、医疗行业、金融机构、移动运营商是比较早开始应用数据脱敏的,因为他们所掌握的都是用户最核心的私密数据,如果泄露后果是不可估量的。数据脱敏的应用在生活中是比较常见的,比如我们在淘宝买东西订单详情中,商家账户信息会被用*遮挡,保障了商户隐私不泄露,这就是一种数据脱敏方式。淘...原创 2021-01-20 14:02:08 · 45486 阅读 · 4 评论 -
validation 注解说明
@Null 被注释的元素必须为 null@NotNull 被注释的元素必须不为 null@AssertTrue 被注释的元素必须为 true@AssertFalse 被注释的元素必须为 false@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value原创 2021-01-20 11:55:26 · 684 阅读 · 0 评论