- 博客(50)
- 收藏
- 关注
原创 MySQL巧用公用表表达式(CTE)处理递归查询
根据《MySQL 8.0 Reference Manual》的描述,Common Table Expressions(简称CTE)是一种名为临时结果集的表达式。它可以用来构造复杂的查询语句,并且可以在多个查询中重复使用同一个结果集。CTE的优点是可以使查询语句更加简洁、易于理解和维护,同时也可以提高查询性能。
2023-11-28 16:08:18
1333
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
931
1
原创 Redis架构 - Cluster集群模式
Redis Cluster是Redis数据库的分布式解决方案,它能够将数据分布在多个Redis节点之间,从而提高数据的存储和访问能力。Redis Cluster使用哈希槽(hash slot)机制来将数据分布在多个节点之间。每个节点都负责存储一定数量的哈希槽。当向Redis Cluster写入数据时,会根据数据的键计算出一个哈希值,然后将该哈希值映射到相应的哈希槽上。这样,相同的键会被映射到同一个哈希槽上,并存储在同一个节点上。
2023-01-03 22:43:20
980
原创 Redis架构 - Sentinel哨兵模式
Redis Sentinel是Redis官方提供的一个靠可用方案。是一种用于监控、提醒和自动故障转移的系统。它可以监控多个Redis实例,并在主服务器出现故障时执行故障转移,将从服务器升级为主服务器。在Sentinel模式下,你可以设置多个Sentinel实例来监控多个Redis实例。这些Sentinel实例之间通过主从复制连接,并且主Sentinel实例负责决策和控制。当主服务器出现故障时,Sentinel会检测到故障并执行故障转移。
2022-12-28 00:31:01
693
原创 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
2013
原创 【笔记】ThreadFactory自定义线程名前缀
在上一篇文章中,我们简单介绍了一下《ThreadPoolExecutor构造方法参数含义》。在实际开发场景中,我们推荐为每一个自定义的线程池都设置不同的线程名前缀,方便后续问题的处理。整体的思路也比较简单:1.创建一个ThreadFactory实现类,NamedThreadFactory;2.创建NamedThreadFactory对象的时候,设置好线程名前缀;3.执行newThread方法时,拼接线程名前缀;......
2022-06-09 18:28:03
4309
原创 【笔记】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
476
原创 MySQL索引失效的几种常见场景
前言我们在使用MySQL查询数据的时候,总会遇见没有正确使用到索引的情况。这里我们列举几种常见的,搜索条件使用了索引列却没有走索引的场景。(以下测试均在MySQL8.0.28中完成,且所有数据均为脚本随机生成)数据表结构CREATE TABLE `student_info` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `school_id` int UNSIGNED NOT NULL, `class_id` int UNSIGNED
2022-03-29 17:26:53
1864
原创 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
2375
3
原创 DBMS事务隔离级别
什么是事务隔离级别ACID四大特性中,I就是隔离性(Isolation)。隔离性可以确保多个事务可以同时发生,且事务之间相互隔离,互不影响,当前事务中发生的更改对于其他事务来说是不可见的。隔离级别定义事务必须与数据库系统中任何其他事务所做的数据修改隔离的程度。现象事务隔离级别由以下现象定义。脏读脏读是一个事务读取到另一个事务没有提交的数据。例如:事务1读取到事务2更新但未提交的数据,此时事务2进行回滚,事务1读取到的数据就是数据库中不存在的数据。不可重复读不可重复读是指,在一个事务内,重
2022-02-28 22:46:13
385
原创 【笔记】JCommander解析命令行参数
JCommander可以通过注解的方式解析命令行参数,非常方便,推荐尝试。依赖 <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.82</version> </dependency>
2022-01-19 18:33:41
717
原创 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
1269
1
原创 什么是CAP定理
概念CAP定理中的CAP就是三个单词的缩写,分别是:C:Consistency 一致性(在分布式系统中的所有数据备份,在同一时刻都是同样的值)A:Availability 可用性(保证每个请求不管成功或者失败都有响应)P:Partition tolerance 分区容错性(系统中任意信息的丢失或失败不会影响系统的继续运作)定理的概念是,对于一个分布式系统来说,不可能同时满足以上三点,最多只能同时满足其中两点。场景我们把CAP两两组合,每种场景都用两个例子来解释,方便理解。①以订单库存系统为例
2022-01-10 00:00:46
1815
原创 【笔记】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
1515
1
原创 MySQL搜索精准匹配大小写(转换字符集排序规则)
常规搜索通常情况下,我们创建数据库和数据表的时候,会选择"utf8mb4"这个字符集,而排序规则,可能就是默认的"utf8mb4_0900_ai_ci",这种排序规则在搜索的时候,是忽略大小写的(也包括部分中英文符号)。举例一:这里搜索的是中文括号,但是查询结果中,中文英文括号的数据都搜索出来了。不仅仅是括号,包括分号,逗号等符号也都会遇到此类问题。举例二:这里搜索的是小写的beijing,但是查询结果中,大写的Beijing被搜索出来了。精准匹配使用"BINARY"关键字,转换二进制字
2021-12-30 23:58:11
2067
原创 【笔记】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
1171
原创 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
3239
原创 MySQL8.0安装配置示例(Ubuntu)
注意:本示例中MySQL程序都是以root身份运行,实际上不推荐这么做。下载打开MySQL社区版下载页面。https://dev.mysql.com/downloads/mysql/以当前最新的8.0.27为例,我们选择Linux通用版,glibc选择最高的2.17版本(glibc根据自身操作系统灵活选择),下方选择压缩的TAR包,最小安装版。点击download下载按钮,获取下载地址。wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mys
2021-12-13 23:54:31
1116
原创 Redis编译安装示例(Ubuntu)
下载打开redis官网下载页面。https://redis.io/download已当前最新版6.2.6为例,右键获取链接地址后,下载源码包。wget https://download.redis.io/releases/redis-6.2.6.tar.gz解压tar -zxvf redis-6.2.6.tar.gz编译安装进入到解压后的文件夹内。cd redis-6.2.6/执行编译命令。(这里我们把redis安装到"/app/redis/"路径下)make PREFIX=
2021-12-13 23:10:34
586
原创 Redisson分布式调度任务小栗子
任务调度常见方案说起任务调度,很多时候我们都在用单机的任务调度器,比如Timer、ScheduledThreadPoolExecutor或者Spring内置的@Scheduled。还有就是一些可以整合到项目中的任务调度框架,如Quartz。要么就是分布式任务调度中间件,比如xxl-job等等……优缺点:单机任务调度,简单方便,但是在多机部署的环境下,需要考虑并处理任务同时触发的情况。虽然这个问题可以用分布式锁来解决,但还是不够优雅。也有用单台机器crontab来触发任务的案例,但是毕竟是单点,理
2021-11-22 23:56:42
2426
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
907
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
2349
原创 【笔记】从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
19481
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
733
原创 【笔记】SpringBoot中Bean创建和销毁时执行自定义操作
场景在初始化Bean的时候,需要创建一些资源;在销毁Bean的时候,需要释放一些资源。方案一在配置类中,使用@Bean来初始化一个Bean,并在注解参数中,指定初始化和销毁时所对应的方法即可。方法中可以执行自定义的操作。TestBean@Slf4jpublic class TestBean { public void init() { log.info("初始化TestBean"); // DO STH. } public void
2021-04-19 16:24:48
4146
1
原创 【笔记】go生成随机密码
可以指定密码长度和复杂度修改’length’即可修改长度修改’baseStr’和’baseSymbol’即可指定基本字符或特殊符号package mainimport ( "fmt" "math/rand" "time")func main() { length := 16 baseStr := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" baseSymbol := "!@#$%^&*(
2021-03-10 11:23:25
1310
原创 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
1187
11
原创 ShardingSphere-JDBC读写分离代码示例
ShardingSphere简介这里直接引用官方的概览Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。Apache ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数
2020-11-26 18:45:09
1157
1
原创 【笔记】SpringBoot在yml中配置日志格式
实际上spring boot默认的日志格式(logging.pattern)可以满足大部分场景,但有些场景需要做日志的链路追踪,所以我们就需要在日志文件中,打印特定的“日志ID”来满足这个场景。(比如在接收到请求的时候,put一个日志ID,这样从请求到响应的完整流程日志,都可以通过这一个日志ID过滤出来)想要在日志中打印log_id,就需要修改pattern。但是如果引入logback.xml,就会破坏spring boot原本的日志切割+日志压缩功能(虽然手写一个脚本也不难),所以直接在yml中修改
2020-11-07 17:13:22
3505
原创 使用函数接口实现一个简单的缓存处理器
场景简介解析一个有10000条数据的excel,假设一行数据包含若干办公设备的基础信息和设备负责人的信息,但是数据入库之前,需要校验负责人是否存在,不存在需要单独创建负责人信息。数据中,设备信息有10000条,我们假设一个负责人负责1000个设备,那么实际的负责人只有10个。如果我们只是简单的遍历查询,需要和数据库有10000次交互,为了提高性能,需要减少数据库交互,所以我们考虑应用缓存技术来提高性能。(实际上,查询之前聚合负责人信息,并单独校验这10个负责人的信息也不错,但是上述场景是我为了便于理解简化
2020-11-05 22:05:03
276
原创 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
532
原创 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
14057
原创 SpringBoot启动时HikariCP不创建连接池问题解决方案
我们直接进入主题。通常情况下,我们SpringBoot项目启动完成时,HikariCP都会创建连接池。我们在控制台的日志中就能直接看到这个信息:com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...com.zaxxer.hikari.HikariDataSource : HikariPool-1...
2020-01-16 17:45:30
11908
12
原创 vertx实现简单的反向代理
一提到反向代理,我们首先想到的或许是nginx,但某些场景,我们不能随意的去搭建一个NG。如果我们此时只有一个JavaWeb项目可用,或许最好的办法,就是在已有项目中集成一个反向代理服务。所以我们就需要用Java手写一个简单的反向代理。语言:Java技术框架:Vert.x代理:TCP反向代理例子描述本机暴露8088端口,外部客户端访问该端口的连接,都映射到xxx.xxx.xxx.x...
2020-01-14 11:44:23
2385
原创 Java使用groupingBy分组数据乱序问题解决方案
业务背景假设当前有一个对学生进行各方面评价的对象,评价包括考察模块、考察点、评价备注。字段关系为,同一模块包含多个考察点,每个考察点有一个评价备注。对象代码如下/** * 评价信息对象 */@Data@AllArgsConstructorclass Evaluation { /** * 考查模块 */ private String inspec...
2019-08-29 20:21:01
2949
原创 Linux下批量备份日志以及清空日志
这仅仅是一个例子而已,请大家结合自身场景灵活使用Linux的命令这里我找来几个log文件,模拟nginx的日志,并且实现批量备份并且清空备份过的日志备份日志我们进入到日志文件夹,用“ll”命令查看一下,如我的截图这里就假装是nginx按照域名分开统计的访问日志调用tar命令进行备份,路径请随意tar -zcvf /apps/log/logs_bk_$(date +%Y-%m-%d)....
2019-03-28 15:42:38
1832
原创 Gradle和Maven修改缓存路径和代理配置
本示例是Windows系统上的示例Maven缓存路径修改:先找到maven的配置文件在maven的路径下"apache-maven/conf/settings.xml"打开该文件,找到"localRepository"标签,修改成想要的路径即可,如下图修改代理:还是在这个配置文件中,找到"proxies"标签,在注释代码中,有配置示例,我们放开一段配置,改为自己的代理地址即可,如图...
2019-02-24 19:39:32
4058
3
原创 使用自定义注解加密实体中手机号码字段
通常我们数据库中带有用户手机号的数据,在展示给前端的时候,都需要进行部分加密,也就是真实手机号为15066668888的数据在加密返回给前端之后,应为150****8888关于这个问题,解决方案很多很灵活,这里我写一个使用自定义注解来加密手机号码字段的小栗子基本思路:1.首先我们把数据从数据库中查询出来,放到实体对象中,在实体对象中需要被加密的字段上面加上我们自定义的注解2.在业务层中,我...
2019-02-22 11:23:53
3760
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人