自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

javaTalk

越努力,越幸运!

  • 博客(165)
  • 收藏
  • 关注

原创 IDEA值得推荐的20款优秀的插件

工欲善其事,必先利其器。想要提升编程开发效率,必须选择一款顺手的开发工具。JetBrains 公司提供了一系列功能强大、风格统一的开发工具,深受开发者喜爱。其中,IDEA 是面向 Java 开发的专业 IDE(集成开发环境),90% 以上的企业都在使用 IDEA 进行 Java 开发,而不是用其他的工具如 Eclipse。但是,想要开发效率最大化,仅有好的开发工具是不够的,还要能够熟练地使用它。对于 IDEA 的新用户来说,面对功能如此丰富的开发工具可能会有些迷茫,但又不想花时间去学习如何使用,

2020-12-22 09:58:50 87660 13

原创 Kafka 基本概念和术语

Consumer:从主题订阅新消息的应用程序,可以同时订阅多个主题的消息。一个主题可以让若干个 consumer 消费,若干个 consumer 组成一个 consumer group ,一条消息只能被 consumer group 中一个 consumer 消费,若干个 partition 被若干个 consumer 同时消费,达到消费者高吞吐量。kafka 底层是追加写,所以效率高,所以单调递增,一旦写到磁盘上后,消息的位置就是固定的了。正常都是顺序消费一遍的,当然也可以重置消费者位移来达到业务目的。

2024-01-07 17:58:57 769 2

原创 阿里巴巴开源Java项目

说明:以下都是项目中使用过的,后续将持续更新!!!

2023-10-06 16:16:14 149

原创 Jasypt 实现自定义加解密

1、自定义解密属性加密形式重写 EncryptablePropertyDetector 这个 bean ,实现 isEncrypted 和 unwrapEncryptedValue 方法@Overrideif (value!= null) {@Override重写 EncryptablePropertyResolver ,实现 resolvePropertyValue 方法。

2023-09-30 19:56:35 388

原创 Mongodb 常用操作

记录 Mongodb 常用操作。

2023-08-09 22:56:15 897

转载 SpringBoot2中使用Lettuce 拓扑刷新问题

SpringBoot2.x开始默认使用的Redis客户端由Jedis变成了Lettuce,但是当Redis集群中某个节点挂掉之后,Lettuce将无法继续操作Redis,原因在于此时Lettuce使用的仍然是有问题的连接信息。实际上,Lettuce支持redis 集群拓扑动态刷新,但是默认并没有开启,SpringBoot在集成Lettuce时默认也没有开启。并且在SpringBoot2.3.0之前,是没有配置项设置Lettuce自动刷新拓扑的。

2022-11-20 11:00:41 3082 1

原创 SpringBoot Rest API实现统一异常处理

使用 @RestControllerAdvice 替换 @ControllerAdvice和@ResponseBody。程序在运行的过程中难免会出现异常,如果不对异常处理很容易暴露堆栈信息,发生信息泄露事件。2 相同的异常处理逻辑放在一个地方统一处理,能保证逻辑的统一性。也可以在异常处理程序方法中返回自定义对象。1 异常处理逻辑应该与业务逻辑剥离开来,单独处理。注释来注释异常处理程序方法。3 系统中异常处理逻辑可以复用和统一维护。一 为什么需要统一异常处理。二 如何实现统一异常处理。为什么统一异常处理?

2022-10-24 16:21:54 990

原创 RestTemplate 集成拦截器

Spring RestTemplate 经常被用作客户端向 Restful API发送各种请求,在开发过程中我们会发现很多请求都会有相同的场景,如请求携带认证的token、验证的签名、打印请求和响应日志等。在请求方法里面添加这些通用的非业务逻辑,代码显得很冗余。这个时候我们就思考,我们是不是就可以将这些非业务性代码抽取出来进行复用。Spring 提供了 ClientHttpRequestInterceptor 接口,可以对请求进行拦截,并在其被发送至服务端之前修改请求或是增强相应的信息。

2022-09-18 23:27:30 2487

原创 CodeTop 记录

206 反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]实现:class Solution { public ListNode reverseList(ListNode head) { if(head == null) { return head; } ListNode pre = null;

2022-05-16 21:25:12 2204 1

转载 如何理解BIO、NIO、AIO的区别?

很多文章在谈论到BIO、NIO、AIO的时候仅仅是抛出一堆定义,以及一些生动的例子。看似很好理解。但是并没有将最基础的本质原理显现出来,如果没有没有从IO的原理出发的话是很难理解这三者之间的区别的。所以本篇文章从Java是如何进行IO操作为开头进行分析。Java中的IO原理首先Java中的IO都是依赖操作系统内核进行的,我们程序中的IO读写其实调用的是操作系统内核中的read&write两大系统调用。那内核是如何进行IO交互的呢?网卡收到经过网线传来的网络数据,并将网络数据写到内.

2022-05-10 15:51:56 513

转载 Spring 事务失效的7种场景

目录1、事务失效的7种情况1.1、未启用 spring 事务管理功能1.2、方法不是 public 类型的1.3、数据源未配置事务管理器1.4、自身调用问题1.5、异常类型错误1.6、异常被吞了1.7、业务和spring事务代码必须在一个线程中2、如何快速定位事务相关bug?1、事务失效的7种情况1.1、未启用 spring 事务管理功能@EnableTransactionManagement 注解用来启用 spring 事务自动管理事务的功能,这个注解.

2022-05-09 19:47:04 416

原创 OAuth 2.0最佳实践

一OAuth 2.0 是什么OAuth 2.0 是一种授权协议。二 为什么用OAuth 2.0OAuth 2.0 这种授权协议,能保证第三方软件只有在获得授权之后,才可以进一步访问授权者的数据,能保证授权者数据的安全性。三OAuth 2.0四种授权流程在 OAuth 2.0 的体系里面有 4 种角色,它们分别是资源拥有者、客户端、授权服务和受保护资源。为了详细的讲解四种授权流程,以产品 A 集成产品 B 进行授权登录为例,来具体说明四种授权流程和应用场景。3.1授权码模...

2022-04-30 11:02:44 856

原创 必知必会的正则表达式

目录1 正则表达式概念2 正则表达式语法元字符限定符反义词3 正则表达式的应用汉字字符数字邮政编码日期格式手机号码IP地址邮箱地址身份证号特殊字符4 正则表达式可视化iHate Regexregex101The Regular Expression Visualizer, Simulator & Cross-Compiler Tool1 正则表达式概念正则表达式,又称规则表达式。(英语:Regular Ex

2022-04-30 10:54:17 384

原创 Java 线程生命周期

Java线程生命周期

2022-04-21 10:45:31 320

原创 Java 并发编程三要素

并发编程三要素学习。

2022-04-20 23:18:17 1336 3

原创 Java 并发笔记

Java并发学习笔记。

2022-04-19 21:27:01 637

原创 Optional 最佳实践

目录一 Optional 是什么二 Optional API介绍三 Optional 最佳实践3.1 不要直接返回 null,使用 Optional.empty();3.2 正确使用 ifPresent()3.3 少用 get(),多用orElse()和orElseGet()3.4 少用of(),多用ofNullable()一 Optional 是什么Optional 的作者 Brian Goetz 对这个 API 的说明:Our intention was

2022-04-09 17:57:50 838 1

转载 MySQL存储时间的最佳实践

平时开发中经常需要记录时间,比如用于记录某条记录的创建时间以及修改时间。在数据库中存储时间的方式有很多种,比如 MySQL 本身就提供了日期类型,比如 DATETIME,TIMESTAMEP 等,我们也可以直接存储时间戳为 INT 类型,也有人直接将时间存储为字符串类型。那么到底哪种存储时间的方式更好呢?不要使用字符串存储时间类型这是初学者很容易犯的错误,容易直接将字段设置为 VARCHAR 类型,存储"2021-01-01 00:00:00"这样的字符串。当然这样做的优点是比较简单,上手快。

2022-03-13 20:56:53 673

原创 SQL 优化最佳实践

本文是通过实践总结的,SQL优化的重点和要点。还需要在实践中灵活运用。

2022-02-26 11:54:34 657 1

原创 List 分割最佳实践

List分割成多个子数组实践总结,它山之石可以攻玉。

2022-01-09 13:34:35 3510

原创 代码整洁之道学习

目录2.1 介绍2.2 名副其实2.3 避免误导2.4 做有意义的区分2.5 使用读的出来的名称2.6 使用可搜索的名称2.7 避免使用编码2.8 避免思维映射2.9 类名2.10 方法名2.11 别扮可爱2.12 每个概念对应一个词2.13 别用双关语2.14 使用解决方案领域名称2.15 使用源自所涉问题领域的名称2.16 添加有意义的语境2.17 不要添加没有用的语境2.1 介绍软件开发中命名随处可见,做好命名是必要且重要的。

2021-12-25 11:58:40 525

转载 供应链服务术语

目录1 范围2 规范性引用文件3 供应链服务基础术语4 供应链服务商流术语5 供应链服务物流术语6 供应链服务资金流术语7 供应链服务信息流术语8 供应链服务综合术语1 范围本文件界定了供应链服务的术语及其定义。本文件适用于供应链服务及相关领域的信息处理和信息交换。2 规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。 凡是不注日期的引用文件,其最新版本(包...

2021-11-21 15:11:08 1797

原创 为什么数组的下标都是从0开始而不是1?

目录一 数组寻址公式二 数组模型表示三 数组寻址计算一 数组寻址公式a[i]_address = base_address + i * data_type_sizedata_type_size 是数组中每一个元素大小。二 数组模型表示以 int[] a = new int[10] 为例。计算机给数组 a[10],分配了一块连续内存空间 2000~2039,内存块的首地址为 base_address = 2000。三 数组寻址计算假设数组从0开始,计算第9个元

2021-09-19 15:47:46 349

原创 RPC必知必会

目录一 RPC是什么二 RPC通信流程2.1 请求部分2.2 响应部分一 RPC是什么RPC的全称是 Remote Procedure Call,即远程过程调用。什么是远程调用?本地服务调用远程服务。什么是RPC?RPC是帮助我们屏蔽网络编程细节,实现调用远程方法就像调用本地方法一样。总结来讲,RPC作用有两个:屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法; 隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。二 RPC通信流程RPC通信流.

2021-08-28 15:23:55 287

原创 TP50、TP90、TP99的理解和使用

一 TP50、TP90、TP99 的概念1.1 什么是 TPTP 是 Top Percentile 的缩写,中文译作百分位。1.2 什么是百分位百分位是一个统计学的术语。如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组N个观测值按数值大小排列。如,处于P%位置的值称第P百分位数。1.3 TP50、TP90、TP99 怎么理解TP50、TP90、TP99 是工程性能指标,以网络请求耗时为例:TP50:表

2021-04-24 12:13:08 5555

原创 09-Redis IO 多路复用

目录一 Redis 是单线程还是多线程?二 为什么单线程的 Redis 性能很高?三 什么是 IO 多路复用技术?一 Redis 是单线程还是多线程?这个问题可以一分为二:Redis 是单线程,是因为 Redis 使用文件事件分派器来处理事件队列,且该文件事件分派器是单线程的,所以 Redis 才叫做单线程的模型。Redis 是多线程,是因为持久化、异步删除、集群数据同步等操作都是由数据读写线程之外其他线程执行的,所以 Redis 也可以叫做多线程模型。之所以大家都说是单线程

2021-04-18 22:42:35 2037

原创 提高工作效率的利器

目录一ListUtils.partition 方法1.1 引入依赖1.2 代码演示1.3 输出结果二Lists.partition 方法2.1 引入依赖2.2 代码演示2.3 输出结果三 源码分析3.1 ListUtils.partition 源码分析3.2Lists.partition 源码分析在工作中经常遇到需要将数组分割成多个子数组,然后进行批量处理的需求。那有没有比较优雅的实现呢?经过多次实践,总结出如下两种较好实现。一ListUti...

2021-04-17 11:40:03 282 4

原创 设计模式在JDK源码中的应用

一 工厂模式工厂类都是以 Factory 作为后缀来命名。 工厂类的功能主要就是创建对象。是不是所有的工厂模式中都以Factory作为后缀来命名呢?不是的,我们以 java.util.Calendar 为例。public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> { //... public static Calendar getInstance..

2021-02-17 14:03:10 753 8

原创 短链接设计和思考

什么是长链接、什么是短链接?https://github.com/jack1liu/Java/这个地址一共33个字符,属于长链接。当然这个只是示例,真实场景会带有各种参数。http://d.sb.com/U7eRz这个地址是上面的长链接地址经过处理得到的,一共21个字符,属于短链接。有了长链接为啥需要短链接呢?以发送营销短信为例子,每一条短信字符是有上限的。如果使用长链接很容易超过单条短信上限,将变成两条短信,成本增加,用户体验也很差。 如果使用短链接,将大大减少字符数目,由于链接..

2021-02-16 11:35:16 817

原创 SpringBoot 集成 Redis 实现消息队列

list 原理说明Redis 的 list 是按照插入顺序排序的字符串链表。如图所示,可以通过 lpush和 rpop 或者 rpush 和 lpop 实现消息队列。1 lpush 和 rpop2 rpush 和 lpop消息队列实现引入 Redis 依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>sprin.

2021-02-06 15:54:42 7991 21

原创 消息队列应用最佳实践

目录消息队列系统有哪些角色组成?在消息队列系统中如何保证消息不丢?在消息队列系统中如何保证消息不重复?在消息队列系统中如何保证消息的顺序性?这篇文章讲了消息队列作用。下面我来讲讲消息队列的最佳实践。消息队列系统有哪些角色组成?主要有三个角色组成:生产者、消息队列、消费者。生产者:将消息发送给消息队列。消息队列:接收生产者生产的消息,将消息提供给消费者消费。消费者:消费消息队列消息。在消息队列系统中如何保证消息不丢?为了保证消息不丢,我们可以先考虑什么情况下消息

2021-01-31 11:59:00 899 1

原创 mysql 学习笔记

mysql 学习记录,包含日志、事务、索引、锁等功能。

2021-01-23 15:30:09 3352 13

原创 创建线程的四种方式

四种创建方式及其比较。

2021-01-21 22:45:51 888 3

原创 java.time包优雅处理时间和日期

Java8 优雅的处理时间和日期,有了它,吃嘛嘛香。

2021-01-17 16:26:57 1253 1

原创 Java后端稳定性建设最佳实践

合理设置网络超时时间什么叫网络调用超时时间呢?如应用服务器之间、应用服务器与 redis 服务器之间、应用服务器与 mq 服务器之间的网络请求,这些网络请求一般有三个超时时间:connectRequestTimeout :客户端从连接池获取连接超时时间。 connectTimeout:客户端与服务端建立连接超时时间。 sockettimeout :客户端与服务端读取数据超时时间。为什么需要设置超时时间?由于系统的连接池或者线程池的资源是有限的,假设没有设置超时时间,由于下游服务慢或者下

2021-01-15 22:50:23 1749 1

原创 Redis 的 key 和 value 应用最佳实践

目录一 key的使用二 value的使用2.1 避免出现大对象2.2 给 value 设置过期时间。2.3 value 数据冷热分离三 容量评估本文主要总结工作这些年来,一些使用 Redis 较好的实践经验,希望能给你一点点启发或者帮助。一 key的使用key 如何命名呢?从简洁性、易阅读性角度考虑,如:服务名 + 业务模块 + 业务数据key 多长合适呢?在完整描述业务的前提下,key 越短越好,为啥呢?key 长了不占内存么?内存也不是大风刮来的吧。.

2021-01-14 20:47:52 2145 3

翻译 06. 重构-简化条件表达式

一 Decompose Conditional (分解条件表达式) 如果有一个复杂的条件(if-then-else)语句。从 if、then、else 三个段落中分别提炼出独立函数。二 Consolidate Conditional Expression (合并条件表达式) 如果有一系列条件测试,都得到相同的结果。将这些条件测试合并为一个条件表达式,并将这个条件表达式提炼成为一个独立函数。三 Consolidate Duplicate Conditional Frag...

2021-01-13 20:56:00 380

原创 多开关、多业务线设计思考和总结

假设有这样一个业务需求,需要给用户新增短信、微信、app push 的开关。开关0表示关闭,1表示打开。这块如果是你,数据库表你会怎么设计呢?1 每一个开关一个字段么?你可能会说这个简单,短信开关用一个字段表示,微信开关用一个字段表示,app push 一个字段表示。如果只有这三个开关,那还好,假设这块来了新的需求说,再需要给用户新增课前5分钟、课前10分钟开关。。。。,那研发和测试不得疯了。针对上面的问题,有更好的方案么?是有的,可以用一个字段实现多个开关。2 一个字段如何实现多个开关?

2021-01-12 23:47:43 496 1

原创 String.join()和StringUtils.join()优雅解决数组或者集合拼接

你也许遇到过将数组或集合以某“,”、“-”、“.”等拼接字符拼接成新的字符串的需求,拼接后的字符串将会是这样 a,b,c 或者 a-b-c 或者 a.b.c 等。你可能会想遍历拼接,去除掉最后一个特殊字符。public static void main(String[] args) { List<String> list = new ArrayList<>(Arrays.asList(new String[]{"a", "b", "c"})); Strin.

2021-01-10 15:14:30 6740 12

原创 mysql 建表最佳实践

目录一 自增主键 id二创建时间、更新时间三 字段添加索引四 数据逻辑删除五 灵活运用数据库编码六 添加 version 字段本文主要总结工作这些年来,一些建表的较好的实践经验,希望能给你一点点启发或者帮助。一 自增主键 id为什么需要自增主键id?从性能、存储空间两个角度考虑:性能:自增主键在新增记录的时候属于顺序写,磁盘的数据页利用率高,不会触发数据页分裂;与业务相关的字段做主键,容易触发随机写,为了维护索引的有序性,需要移动索引树页子节点,容易引发数据页..

2021-01-08 10:36:22 2976 7

空空如也

空空如也

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

TA关注的人

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