iCode
日常代码
MrXionGe
普普通通的打工人
展开
-
MySQL巧用公用表表达式(CTE)处理递归查询
根据《MySQL 8.0 Reference Manual》的描述,Common Table Expressions(简称CTE)是一种名为临时结果集的表达式。它可以用来构造复杂的查询语句,并且可以在多个查询中重复使用同一个结果集。CTE的优点是可以使查询语句更加简洁、易于理解和维护,同时也可以提高查询性能。原创 2023-11-28 16:08:18 · 1407 阅读 · 1 评论 -
MySQL使用RANK窗口函数计算排名
在 MySQL8.0.2 的升级中,引入了一个新特性,就是窗口函数的支持。对于查询中的每一行,使用与该行相关的行执行计算。其中包括 RANK()、LAG() 和 NTILE() 等函数。此外,现在大多数现有的聚合函数都可以用作窗口函数;例如,SUM() 和 AVG()。本次我们简单了解下 RANK()、DENSE_RANK() 和 ROW_NUMBER() 三个和排名计算有关系的函数。RANK() 当前行在其分区内的排名,有间隔。DENSE_RANK() 当前行在其分区内的排名,无间隔。原创 2023-02-17 16:36:16 · 980 阅读 · 1 评论 -
ShardingSphere-JDBC5.2.X读写分离配置示例(Java Config)
不负众望,ShardingSphere的5.2.X版本,在带来若干新特性的同时,又双叒叕修改了API。以下,就是ShardingSphere-JDBC5.2.X版本的读写分离JavaConfig配置示例。5.2.0和5.2.1版本,都可以使用以下配置,初始化读写分离数据源。原创 2022-10-28 23:10:42 · 2097 阅读 · 0 评论 -
【笔记】ThreadFactory自定义线程名前缀
在上一篇文章中,我们简单介绍了一下《ThreadPoolExecutor构造方法参数含义》。在实际开发场景中,我们推荐为每一个自定义的线程池都设置不同的线程名前缀,方便后续问题的处理。整体的思路也比较简单:1.创建一个ThreadFactory实现类,NamedThreadFactory;2.创建NamedThreadFactory对象的时候,设置好线程名前缀;3.执行newThread方法时,拼接线程名前缀;......原创 2022-06-09 18:28:03 · 4457 阅读 · 0 评论 -
【笔记】ThreadPoolExecutor构造方法参数含义
线程池不推荐使用Executors创建,而是推荐使用ThreadPoolExecutor创建。Executors返回的线程池对象的弊端如下:1)FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。2)CachedThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。3)ScheduledThreadPool:允许的请求队列长度原创 2022-06-06 16:23:04 · 513 阅读 · 0 评论 -
ShardingSphere-JDBC5.1.0读写分离配置示例(Java Config)
前言ShardingSphere-JDBC近几次更新后,相对应的API也发生了一些变化。从5.0.0升级5.1.0之后,数据源配置也有一点点不同,所以在这里记录一下5.1.0版本的读写分离配置。下面的配置,还是以Spring框架体系为例,且用同一个数据库模拟多库。依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-conne原创 2022-03-29 11:26:56 · 2412 阅读 · 3 评论 -
【笔记】JCommander解析命令行参数
JCommander可以通过注解的方式解析命令行参数,非常方便,推荐尝试。依赖 <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.82</version> </dependency>原创 2022-01-19 18:33:41 · 743 阅读 · 0 评论 -
MySQL·COUNT查询效率对比
前言最近看到一篇关于COUNT查询效率的博客,主要就是探究COUNT(*)、COUNT(1)、COUNT(主键)、COUNT(字段)之间哪个查询效率更高一些。刚好手里有一个1200W测试数据的表,本着好奇的心态,我们也试一试不同COUNT方式之间有多大的差异。注意:以下测试均在MySQL8.0.27下的InnoDB中进行,且在本机进行查询测试,避免网络延迟对查询快慢造成影响。测试COUNT(*)三次查询结果分别是:6.99s、6.96s、6.97s。COUNT(1)三次查询结果分别是:6原创 2022-01-10 22:31:29 · 1323 阅读 · 1 评论 -
【笔记】MySQL文本搜索忽略空格
方案使用MySQL中的"REPLACE"函数即可解决。思路就是在查询的时候,先替换掉入参和条件字段值中的空格。示例数据库中存在若干条记录,如下:idname1001iPad Mini1002iPad Mini21003OnePlus 9Pro1004ThinkPad T14s执行SQL:SELECT * FROM warehouse WHERE REPLACE(`name`,' ','') LIKE CONCAT('%',REPLACE('iP原创 2022-01-04 23:58:42 · 1563 阅读 · 1 评论 -
MySQL搜索精准匹配大小写(转换字符集排序规则)
常规搜索通常情况下,我们创建数据库和数据表的时候,会选择"utf8mb4"这个字符集,而排序规则,可能就是默认的"utf8mb4_0900_ai_ci",这种排序规则在搜索的时候,是忽略大小写的(也包括部分中英文符号)。举例一:这里搜索的是中文括号,但是查询结果中,中文英文括号的数据都搜索出来了。不仅仅是括号,包括分号,逗号等符号也都会遇到此类问题。举例二:这里搜索的是小写的beijing,但是查询结果中,大写的Beijing被搜索出来了。精准匹配使用"BINARY"关键字,转换二进制字原创 2021-12-30 23:58:11 · 2146 阅读 · 0 评论 -
【笔记】Java原生API图片缩放(平滑模式)
代码示例原生APIpackage cn.mrxionge.idemo;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import static java.io.File.separator;public class ImgScaleTest { public st原创 2021-12-16 23:22:35 · 1239 阅读 · 0 评论 -
ShardingSphere-JDBC5.0正式版读写分离配置示例
前言2020年10月,第一次使用shardingsphere-jdbc5版本实现读写分离。只不过当时只是5.0.0-alpha版本,还不算是满血版。2021年11月,发布了5.0.0正式版,带来相当多的新特性,比如我们很需要的“支持解析MySQL UNION/UNION ALL语句”。更多特性参考release note:https://github.com/apache/shardingsphere/releases目前生产环境已升级5.0.0,且稳定运行。升级过程中发现部分API存在变动,所以原创 2021-12-14 23:51:59 · 3309 阅读 · 0 评论 -
Redisson分布式调度任务小栗子
任务调度常见方案说起任务调度,很多时候我们都在用单机的任务调度器,比如Timer、ScheduledThreadPoolExecutor或者Spring内置的@Scheduled。还有就是一些可以整合到项目中的任务调度框架,如Quartz。要么就是分布式任务调度中间件,比如xxl-job等等……优缺点:单机任务调度,简单方便,但是在多机部署的环境下,需要考虑并处理任务同时触发的情况。虽然这个问题可以用分布式锁来解决,但还是不够优雅。也有用单台机器crontab来触发任务的案例,但是毕竟是单点,理原创 2021-11-22 23:56:42 · 2548 阅读 · 1 评论 -
Redisson延迟队列稳定性测试
在一次探讨的过程中,听到有人使用Redisson延迟队列遇到了丢消息的问题。于是打算自己做一个小测试,看看是否会有这种情况发生。环境&版本Redis 6.2.6(standalone)Redisson 3.16.4(Netty 4.1.70)JDK 17测试模拟2个生产端共发送10万延迟消息。4个消费端轮流消费,检查是否能够完整拉取到10万个消息。反复测试5次。消息体模拟一个简单的消息对象。package cn.mrxionge.idemo.redisdq;impor原创 2021-11-06 14:07:35 · 983 阅读 · 2 评论 -
【笔记】Stream数据分组常用方法整理
模拟数据创建一个DTOimport lombok.AllArgsConstructor;import lombok.Data;@Data@AllArgsConstructorpublic class Student { private Integer id; private String groupTag; private String name; private Integer score;}创建测试数据 //创建集合原创 2021-11-01 23:53:27 · 2379 阅读 · 0 评论 -
【笔记】从List中取出指定字段等于指定值的对象
例如我们有一个Student集合,每个对象有“id”,“name”,“age”三个字段,如下:@Data@AllArgsConstructorpublic class Student { private Integer id; private String name; private Integer age;}其中id字段是1000~1099,如下:Student(id=1000, name=学生_0000, age=18)Student(id=1001, na原创 2021-10-18 18:30:57 · 20144 阅读 · 1 评论 -
【笔记】MySQL使用ORDER BY IF进行条件排序
测试数据按照主键反排序SELECT * FROM user_info ui ORDER BY ui.id DESC;按照主键反排序,但是"status = 4"的数据排在最后SELECT * FROM user_info ui ORDER BY IF (ui.`status`=4,1,0),ui.id DESC;查看结果集"status = 4"的数据在后面,其他的数据在前面,且都按照ID进行了反排序注意:ORDER BY IF并不是一个SQL函数,而是ORDER BY与IF()函数原创 2021-05-19 18:40:41 · 749 阅读 · 0 评论 -
【笔记】go生成随机密码
可以指定密码长度和复杂度修改’length’即可修改长度修改’baseStr’和’baseSymbol’即可指定基本字符或特殊符号package mainimport ( "fmt" "math/rand" "time")func main() { length := 16 baseStr := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" baseSymbol := "!@#$%^&*(原创 2021-03-10 11:23:25 · 1339 阅读 · 0 评论 -
Redisson延迟队列生产消费小栗子
这是一个基于Redisson的RDelayedQueue实现的,且非常简单的延迟队列代码示例。这个例子中,包含1个生产者和2个消费者。(消费者代码完全一样,所有下面的代码示例中仅给出一份消费者的代码)消息对象package cn.mrxionge.idemo.redisdq;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/** * 消息对象 */@Data@N原创 2020-12-07 16:23:50 · 1229 阅读 · 11 评论 -
ShardingSphere-JDBC读写分离代码示例
ShardingSphere简介这里直接引用官方的概览Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。Apache ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数原创 2020-11-26 18:45:09 · 1187 阅读 · 1 评论 -
使用函数接口实现一个简单的缓存处理器
场景简介解析一个有10000条数据的excel,假设一行数据包含若干办公设备的基础信息和设备负责人的信息,但是数据入库之前,需要校验负责人是否存在,不存在需要单独创建负责人信息。数据中,设备信息有10000条,我们假设一个负责人负责1000个设备,那么实际的负责人只有10个。如果我们只是简单的遍历查询,需要和数据库有10000次交互,为了提高性能,需要减少数据库交互,所以我们考虑应用缓存技术来提高性能。(实际上,查询之前聚合负责人信息,并单独校验这10个负责人的信息也不错,但是上述场景是我为了便于理解简化原创 2020-11-05 22:05:03 · 301 阅读 · 0 评论 -
Java限流器的小栗子
JDK原生类-Semaphore@Slf4jpublic class JDKLimiter { public static void main(String[] args) { Semaphore semaphore = new Semaphore(2); for (int i = 0; i < 10; i++) { ne...原创 2020-02-28 18:43:56 · 551 阅读 · 0 评论 -
SQL使用GROUP BY分组排序问题
当我们想要查询一个单表或者想要JOIN一个表的数据,且需要使用GROUP BY来进行分组时,发现分组之后的顺序又不是我们想要的顺序,怎么办?例子测试数据:SELECT * FROM lesson l ORDER BY l.course_id;上面是一个用于测试的数据表,一个course_id对应多个lesson_id,且每个lesson都有自己的start_time。如果我们直接使用G...原创 2020-02-26 17:10:39 · 14327 阅读 · 0 评论 -
vertx实现简单的反向代理
一提到反向代理,我们首先想到的或许是nginx,但某些场景,我们不能随意的去搭建一个NG。如果我们此时只有一个JavaWeb项目可用,或许最好的办法,就是在已有项目中集成一个反向代理服务。所以我们就需要用Java手写一个简单的反向代理。语言:Java技术框架:Vert.x代理:TCP反向代理例子描述本机暴露8088端口,外部客户端访问该端口的连接,都映射到xxx.xxx.xxx.x...原创 2020-01-14 11:44:23 · 2454 阅读 · 0 评论 -
Logback自定义日志颜色
熟悉Spring Boot的同学应该都比较喜欢他默认的日志配色风格在平时的开发中,我们也可以通过logback的配置来自定义日志的颜色本次主要演示如何自定义不同日志等级的配色留意:IDEA控制台和Linux控制台能够显示配色,Windows下PowerShell不支持该配色,Eclipse控制台未测试自定义配置类LogbackColorful.javaimpor...原创 2018-09-09 16:20:08 · 16959 阅读 · 0 评论 -
使用自定义注解加密实体中手机号码字段
通常我们数据库中带有用户手机号的数据,在展示给前端的时候,都需要进行部分加密,也就是真实手机号为15066668888的数据在加密返回给前端之后,应为150****8888关于这个问题,解决方案很多很灵活,这里我写一个使用自定义注解来加密手机号码字段的小栗子基本思路:1.首先我们把数据从数据库中查询出来,放到实体对象中,在实体对象中需要被加密的字段上面加上我们自定义的注解2.在业务层中,我...原创 2019-02-22 11:23:53 · 3824 阅读 · 1 评论 -
Java使用groupingBy分组数据乱序问题解决方案
业务背景假设当前有一个对学生进行各方面评价的对象,评价包括考察模块、考察点、评价备注。字段关系为,同一模块包含多个考察点,每个考察点有一个评价备注。对象代码如下/** * 评价信息对象 */@Data@AllArgsConstructorclass Evaluation { /** * 考查模块 */ private String inspec...原创 2019-08-29 20:21:01 · 2984 阅读 · 0 评论 -
Gradle和Maven修改缓存路径和代理配置
本示例是Windows系统上的示例Maven缓存路径修改:先找到maven的配置文件在maven的路径下"apache-maven/conf/settings.xml"打开该文件,找到"localRepository"标签,修改成想要的路径即可,如下图修改代理:还是在这个配置文件中,找到"proxies"标签,在注释代码中,有配置示例,我们放开一段配置,改为自己的代理地址即可,如图...原创 2019-02-24 19:39:32 · 4155 阅读 · 3 评论 -
一个简单的java回调小栗子
在说回调之前,说一下3种调用方式:1.同步调用栗子:比如我们去商店买东西,到了商店,我们选择好商品,等待售货员找到你要的商品,并拿给你。这个时候,如果售货员着商品需要5秒,那你就等待5秒,如果需要1分钟,你就得等待1分钟。这就是同步调用,被调用的方法如果需要执行很长时间,那么你的主线程就会阻塞在这里,大大降低了效率和体验。2.异步调用栗子:这里的箭头是单向的,也就是说我告诉原创 2018-01-30 14:43:09 · 2138 阅读 · 0 评论