自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 资源 (1)
  • 收藏
  • 关注

原创 关于 mysql not in 是否走索引的问题, mysql版本5.7

mysql 语句中的 not in 是否会走索引,使用explain关键字测试mysql 5.7 发现not in 并不走索隐。

2020-07-27 21:58:50 18550 14

原创 数据库设计之冗余、索引以及查询优化

我们在开始一个项目之前, 一般先进行需求分析, 根据项目需求建立对应的数据库, 再进行代码编写. 而数据库建立的好坏也会影响到系统的运行, 因此在设计数据库的时候就应该考虑进行优化.本人才疏学浅, 在设计数据库中用到的优化方式主要有以下几种:适当设置冗余创建索引利用 explain 分析优化查询适当设置冗余设置冗余是指在一个数据表中添加另一个数据表的关联字段, 减少join连接查...

2019-07-15 23:22:19 3148

原创 KafkaConsumer 消费逻辑

版本:kafka-clients-2.0.1.jarkafkaConsumer 拉取消息的 offset 是存本地的,根据 offset 拉取消息。开启自动提交时,会自动提交 offset 到 broker(在一些场景下会手动检查是否需要提交),防止重启或reblance时 offset 丢失。而本地保存的 offset 是本地拉取到消息时就更新的,所以自动提交的场景下,在消费前过滤掉消息没有影响。

2023-11-10 20:14:12 1650

原创 Java snakeyaml 修改yaml文件保留注释工具类封装

snakeyaml 读取 yaml 文件后会丢失文件中的注释,于是写了个工具类用于保留yaml修改前后的注释。

2023-06-30 20:11:10 1639 2

原创 lambda 实现原理及实现获取引用方法

平时写代码经常用到 lambda 表达式,在 mybatis-plus 的动态查询接口中,更是通过 lambda 方式来获取字段名。那么 lambda 到底是怎么实现的呢?mybatis-plus 又是怎么通过 lambda 获取到对应的字段名的?

2022-10-31 22:04:25 1014 1

原创 MybatisPlus 原理学习:一张图了解 mybatisplus 查询流程

`MybatisMapperProxy`:mapper 接口的代理类,创建并缓存每个方法的 mapperMethod 对象,并调用其 execute 方法实现 mapper 方法3. `MybatisMapperMethod`:mapper方法对象,维护对应 mapper 方法的信息(sql 信息,方法参数返回等签名信息),根据 sql 类型调用 sqlSession 不同的方法。 (MP 在这里加了一点分页的处理逻辑,如果返回的是 PageList,则设置 total字段)

2022-09-16 15:54:02 967

原创 使用 bash 脚本实现本地快捷连接 k8s 容器命令行

由于经常需要连到k8s上pod容器命令行中,但是在rancher上执行命令行经常容易断,而且效率低。于是写了个脚本,用于本地直接连到k8spod上。用法`k8sPod [options] [container]`- options: - -c 选择连接的 k8s 集群, 需在 ~/.kube/config 中配置- namespace:指定命名空间- deployment:指定连接应用名.........

2022-07-15 20:41:40 769

原创 单例模式静态内部类实现遇到的类加载失败的坑:ExceptionInInitializerError

背景:写一个工具的时候遇到一个需要使用单例模式的场景,由于该实例消耗资源大且不一定会使用到,因此比较适合用懒汉模式实现。然后直接用的简单高效的静态内部类方式实现。然后就遇到问题了,在首次获取单例对象加载内部类时,会初始化类的静态属性,于是初始化单例对象时如果创建失败(构造方法抛出异常)就会导致内加载失败。并且由于类只会加载一次(加载失败了后面貌似也不会重新加载了),所以后面就一直抛异常,而且异常类型变为 `NoClassDefFoundError`。...

2022-07-03 15:03:35 758

原创 MybatisPlus 原理学习:springboot 中 mybatisplus 初始化流程

mybatisPlus 的整个加载过程概括如下:1. `MapperScannerConfigurer` 扫描 mapper 接口,并在 spring 中注册 deanDefinition,类型为 `MapperFactoryBean`2. `SqlSessionFactory` 解析 mapper.xml 和 mapper 接口 中的 sql 语句保存到 Configuration 中,同时加入 mybatisPlus 提供的动态 sql。 最后注册对应 mapper 的 `MybatisMappe.

2022-06-19 13:11:40 2572

原创 RabbitMQ 延时消息实现方式

rabbitmq实现延时消息主要有两种方式:死信消息(队列ttl+死信exchange),延时插件;

2022-01-03 20:15:22 8899

原创 TiDB分布式数据库学习笔记

TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。

2022-01-03 20:06:10 1916

原创 SpringBoot 配置多数据源并支持事务

在项目中,有时会遇到使用多个数据源的情况,并且需要支持事务。解决方式可以有以下几种:- 对每个数据源手动配置orm框架(mybatis、jpa等)及事务管理器- 使用 dynamic-datasource-spring-boot-starter 配置动态数据源这里以同时使用jpa和mybatis-plus两种orm框架操作不同数据源为例,分别介绍两种实现方式。

2021-11-06 21:00:37 7876

原创 RabbitMQ 实现固定延时等级的延时消息

文章目录rabbitmq 实现固定延时等级的延时消息大概介绍代码实现简单分析rabbitmq 实现固定延时等级的延时消息通过学习rocketmq延时消息的实现,我们了解到rocketmq将不同延时等级的消息放入不同queue中,然后转发到目标topic。对于未使用rocketmq的团队来说,如果只是为了实现固定延时时间而引入一个新的中间件,成本可能比较大,包括学习使用、运维成本等。但我们也可以仿照rocketmq的方式,结合前面的rabbitmq死信队列,使用rabbitmq实现一个类似rocketm

2021-10-07 17:47:59 1422

原创 Redisson 延迟队列实现原理探究

redis也可以用来实现延时消息的功能。理论上也有两种方式订阅 key 过期事件(pub/sub)使用 sorted-set 存储消息,score为消息的过期时间然而实际上订阅过期事件存在诸多问题,所以并不合适:过期事件的不准确,过期时间只在key被删除时才触发,并不是在key过期后就马上删除的pub/sub 不支持持久化,服务器宕机期间的事件会丢失pub/sub 存在丢失的可能,线上使用的redis pub/sub 有丢失过消息(非过期时间)所有的key过期都会发送过期事件,对redi

2021-10-04 22:52:58 4221 3

原创 RocketMQ延时消息实现原理探究

由于日常开发中遇到几次使用延时消息的场景,而且目前业务中使用到的消息中间件有rabbitmq和kafka,对延时消息的支持都不太理想。其中rabbitmq 延时消息是通过 设置队列ttl+死信exchange实现缺点嘛:每次都得设置两个队列,一个用来实现延时,过期后经死信exchange转到对应的业务队列提供消费。另:rabbitmq有提供延时插件,但缺点较多,如:1. 启动插件要么重启,要么引入一个新的集群;2. 不支持高可用,延时消息发送前只存储在当前broker节点的内部数据库Mnesia

2021-10-03 19:48:40 2245

原创 idea,chrome 高效生产力 插件、软件 推荐

推荐一些好用的软件everything:文件搜索工具,超快!snipaste:截图软件,可以把截图贴在屏幕上xshell:一个终端模拟器,可以用来连接服务器啥的火绒安全卫士:拦截弹窗贼六git-bash:命令行工具,git自带,有这个还要xshell做什么switchhost:管理host文件,很方便bandizip:压缩工具......

2021-08-20 14:51:12 322

原创 设计模式基本原则的理解

单一职责原则记一下英文名 Single Responsibility Principle (srp),防止以后看到不认识。定义:应该有且仅有一个原因引起类的变更。即一个类只负责一个职责。理解因为如果一个类负责太多的职责的话:不易维护,当其中一个职责变化而修改这个类时,可能会影响到其他职责的功能。可读性差,将大量的职责放在一个类里面,导致代码不易理解。反过来,单一职责的优点就是:降低类的复杂度提高类的可读性,提供系统的可维护性变更引起的风险降低,如果单一职责划分的好,修改一个功

2021-07-11 18:17:28 135

原创 常见设计模式的理解

文章目录复习下设计模式的几个原则单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则合成复用原则挑一些设计模式复习下创建型工厂方法模式建造者模式结构型代理模式装饰者模式桥接模式行为型策略模式责任链命令模式*参考文章设计模式,是前人对代码开发经验的总结,解决特定问题的一系列套路。合理地使用设计模式能够提高代码可复用性、可维护性、可读性、稳健性以及安全性。这里主要是分享自己对设计模式的理解与运用,由于本身开发经验不多,可能有些不对的地方,希望可以指出。模式较多,这里选取部分常用的进行分享。复

2021-07-11 18:09:53 211

原创 docker学习笔记:镜像和容器的使用

个人学习笔记,摘抄自 https://yeasy.gitbook.io/docker_practice文章目录docker 简介基本概念使用镜像修改国内镜像源使用镜像获取镜像运行列出镜像删除镜像commitDockerfileDockerfile 指令操作容器新建并启动后台运行终止容器进入容器导入和导出删除访问仓库拉取镜像推送镜像docker 简介Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 Overlay.

2021-03-14 19:58:04 378

原创 反射在项目中的使用:根据字段名动态过滤,以及一点点优化

反射是Java中比较重要的一个知识点,但平时可能用的有点少。最近刚好用到了,就记下来。需求首先简要描述一下需求:有一个对象需要投递到消息队列中,但需要根据配置文件中的过滤条件进行过滤。目前只有两个条件,后期可能会增加。过滤条件为消息字段。实现例如有一个User类, 目前只根据userId过滤public class User implement Serializable { private Integer userId; private String name; priva

2021-03-13 16:33:56 265 1

原创 Redis zset 实现排行榜, 并定时增量刷新缓存, 以及防止缓存击穿

文章目录程序设计score 设计 (相同积分的排序)缓存数据定时刷新当心缓存击穿之前有做到一个需求, 需要做一个小的排行榜的功能. 然后发现里面涉及到的东西挺多的, 记录一下. 主要包括 zset 使用, 缓存的定时刷新保证数据准确性, 预防缓存击穿.大概需求就是: 排行榜上显示前n个积分最高的用户. 并且相同积分先完成的排在前面. 并且还要能看到自己当前的积分.看到这个需求的时候就想到可以用redis zset来实现. 但是还是假装分析一下:首先排行榜明显是一个热点数据, 访问频率大, 且计算复

2020-12-23 23:04:19 6457 1

原创 日常踩坑中遇到的cookie问题: 跨域,特殊字符

这篇文章主要用于记录自己平时遇到的cookie相关的问题. 如跨域设置cookie, cookie特殊字符被截断, 中文cookie导致报错.文章目录跨域设置cookiecookie 包含特殊字符导致被截断cookie 中有中文导致后端报错跨域设置cookie这个场景一般是在账号打通中会遇到,两个系统使用同一个账号体系,但是不同的域名。登陆一个系统的时候自动登陆到另一个系统。例如在 a.com 下同时把 cookie 设置到 b.com 下。一般的处理方式是:在登陆完成之后,返回另一个域的setCo

2020-12-19 19:25:47 2202 3

原创 mvn compile 编译失败,错误: 不再支持源选项 6 请使用 7 或更高版本

概述:mac上 mvn compile 失败,提示工程jdk版本低,但之前都可以。原因:jdk版本变成14导致 (mac,最近安装了jdk14,java_home默认选择最高的jdk版本)最近写项目,编译的时候发现使用 mvn clean compile 编译失败。报错信息如下:[ERROR] COMPILATION ERROR : [INFO] ---------------------------------------------------[ERROR] Failure executi.

2020-09-29 20:11:12 7874 1

原创 MongoDB 数据库基础学习笔记

文章目录MongoDB 启动和连接数据库 CURD 操作插入查询查询方法查询返回结果特殊查询 (null 或 字段不存在)游标使用更新更新一条文档更新多条文档替换文档update删除点此查看 mongodb 官方文档MongoDB 启动和连接使用 yum 安装, 相关目录如下:默认端口号: 27017日志文件: /var/log/mongodb/mongod.log配置文件: /etc/mongod.conf数据文件: /var/lib/mongo/远程访问时, 需要将 mongod.

2020-09-21 20:16:17 152

原创 http请求经过nginx,带下划线的header 丢失问题

在最近开发中遇到一个问题,记录一下。有一个http请求,需要携带一个请求头,当时定义的请求头使用的下划线模式,header_name这样。然后神奇的事情就发生了。我自己在postman上测试都没问题,后端能正常接收并响应。移动端请求,后端就读取不到对应的请求头。很奇怪。然后自己这边又拿postman测试,发现也获取不到请求头了。然后就尝试换成其他的请求头,发现只有携带下划线才接收不到,换成 - 短横就可以了。于是又去搜了一下,发现原来是nginx的问题。ngixn默认不支持下划线的header,带下

2020-09-21 15:25:25 859

原创 Java实现验证码,算式验证码,附源码,开箱即用

在登陆或注册的时候,为了防止程序恶意请求,网站一般都会要求输入验证码。之前也写了一篇关于验证码功能的文章 java springboot 使用Kaptcha组件实现验证码功能,但是感觉这个组件只有字符串验证码,功能不太强。于是准备自己写一个验证码,主要是实现算式验证码。所有功能已实现并上传只github,链接:https://github.com/wsJava/verification-code首先是获取算式因为使用 除 会产生小数问题,所以只有+-* 运算符。下面这个方法是生成一个指定运算符数量的算式

2020-09-11 21:15:37 1182

原创 springboot 自定义validation参数校验注解 校验枚举值

在写springboot项目的时候,经常需要对参数进行校验。如果是一个参数还好,写一个if-else就好了。但如果传入的参数是一个对象,那就需要写很多if-else了,而且这个对象可能在很多地方作为参数使用。validation 介绍这个时候就可以考虑使用参数校验注解了,首先是引入依赖。<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</

2020-09-02 21:32:23 3964

原创 基于POI 框架自己封装一个Excel通用读写小工具

在我们日常开发中,经常会遇到读写excel的需求。或者生成一个excel文件给用户,或者读取解析上传的excel文件。在写过几次读写excel的代码后,我发现其实在读写excel的时候,大部分代码都是一样的,只要具体读写某一行的代码有区别。于是,就打算自己写一个Excel通用读写小工具。以后只需要写一个具体读写行的代码就可以了。这里使用策略模式,将具体读/写 excel行 的方法当作一个策略,然后在读写excel的通用方法中调用它。具体代码如下:定一个 读和写 Row(行)的接口读取接口 Reader

2020-08-27 20:32:47 266

原创 Java ImageIO 图片处理后变红 解决办法记录

原因:根据网上搜罗的一大堆文章以及自己的发现,是因为原始图片(jpeg)带有alpha通道才会变红,在mac上直接显示简介的看到。然后发现使用下面这个方式可以解决变红的问题// 把这行换成下面的方式BufferedImage image = ImageIO.read(originFile);// 这里是直接根据url读取图片public static BufferedImage getBufferedImage(String imgUrl) throws MalformedURLExcept

2020-08-25 19:45:42 2090 4

原创 Redis 基本数据结构和常用命令

文章目录redis 概述Redis 常见数据结构和相关命令String 类型相关命令Hash 类型相关命令list 类型set 类型Sorted-Setkeys 的通用操作redis 概述高性能键值对数据库, 运行在内存中, 使用单线程支持的键值数据类型:字符串类型列表类型有序集合类型散列类型结合类型应用场景:缓存任务队列网站访问统计数据过期处理分布式集群架构中的 session 分离Redis 常见数据结构和相关命令String 类型相关命令// 自加 (能转成整

2020-08-16 23:11:07 131

原创 设计模式之单例模式,六种实现,以及反射破解

在介绍设计模式之前,先贴一下设计模式的三种类型,和六大原则。创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。设计模式的六原则开闭原则:对扩展开放,对修改关闭里氏代换原则:任何基类可以出现的地方,子类一定可以出现,(子类

2020-08-15 22:13:38 158

原创 java springboot 使用Kaptcha组件实现验证码功能

Kaptcha组件实现验证码一、pom.xml中引入Kaptcha 的maven依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>二、Kaptch

2020-08-11 15:35:38 368

原创 springboot 使用 slf4j + logback 记录日志

在写项目的时候,对于一些重要的信息,或者程序抛出的异常,我们一般都会用日志记录下来。方便后期排查问题。在springboot项目中,我一般使用 Slf4j+logback 作为日志框架。下面就简单介绍一下他们的使用Slf4jThe Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。使用:yml简单配置 (用了logb

2020-08-10 21:40:45 408

原创 SpringBoot pom.xml 指定jdk版本,打包跳过测试,打包源码,指定UTF-8编码

有时候,我们将写好的springboot代码上传至远程仓库后。再重新拉下来的时候,会发现,之前分明用的java8的语法都报错了。即使在idea project structure 里面设置了java8的版本,但下次拉取的时候,又变成1.5了。因为maven默认使用的1.5的版本。这个时候我们就可以在 pom.xml 的 plugins 中指定1.8的jdk版本。然后顺便记录一下,平时用到的其他 pom 的插件。分别是打包跳过测试,打包源码,指定utf8编码 <properties> &l

2020-08-09 14:56:47 3623

原创 基于SpringBoot Redis Cache,封装一个能够批量操作(查询&保存)的缓存

文章目录准备工作代码展示封装 RedisMultiCache.java配置缓存 RedisCacheConfig使用示例需要注意的问题之前的文章:Spring Cache的使用教程:注解形式和api接口形式Guava 本地缓存使用教程在这前面两篇文章中,分别介绍了Spring Cache 和 Guava Cache 的使用,然后一对比就可以发现,Guava Cache 提供了批量查询的接口,而Spring Cache 只有单个查询的接口。那当我们在使用Spring Cache的时候,需要用到批量查

2020-08-08 18:00:38 2411

原创 Guava 本地缓存使用教程

文章目录准备工作创建缓存使用缓存Cache 读取缓存LoadingCache 读取缓存修改缓存Cache 修改缓存LoadingCache 修改缓存其他方法在前面的文章 Spring Cache的使用教程:注解形式和api接口形式,以及调用内部方法注解失效的原因 中讲到了在程序开发中,在一些需要复杂或耗时的IO或CPU操作中,我们经常会使用缓存,将操作的结果保存起来,方便下次直接从缓存中读取结果。在上篇文章中,我们用的是Spring Cache,使用Redis作为缓存服务器。然而有些情况下,比如程序

2020-08-07 22:59:59 2891

原创 Spring Cache的使用教程:注解形式和api接口形式,以及调用内部方法注解失效的原因

在写程序的时候,对于频繁访问的数据,我们一般会使用缓存,将数据存储在内存中,方便下次直接在内存中读取,而不需要再去查询数据库或者再进行复杂运算得到。Spring Cache 的使用首先介绍一下Spring提供的Cache接口,并且提供了默认的实现 ConcurrentMapCache,看类名就知道,使用的ConcurrentMap实现。这里主要介绍一下注解形式。(另:个人更推荐接口的方式使用缓存,注解使用起来虽然方便,但是控制粒度不够,不能随时随地使用。当然需求简单的话注解就足够了)注解形式的使用首

2020-08-02 20:48:56 3238

原创 java8 四大函数式接口 和 用于数据处理的 stream流 使用详解

在之前一篇博客里面介绍了 java8 中的 lambda 表达式,使用lambda表达式可以大大的简化我们的代码,使代码更加简洁、优雅,敲代码的效率也更高。点击链接可以查看: java8 lambda表达式使用详解然而,除了lambda表达式外,还有一个stream流,也可以极大的提高编码效率,并且能够提高代码的可读性。lambda表达式主要用在实现函数接口的地方,而stream流则主要用于处理数据。以下为相关功能介绍。示例首先给一个示例,(结合lambda使用,效率翻倍)@Datapubli

2020-07-28 22:24:30 733

原创 centos7 安装和启动 RabbitMQ

centos 7 安装和使用安装下载相关软件包erlangsocatrabbitmqwget https://www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpmwget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x...

2020-07-15 19:26:15 261

原创 mvn clean compile 编译正常,idea编译报错的问题

最近在idea 2020中打开项目的时候遇到编译报错的问题,把解决方法分享一下。方法:删掉idea生成的 .iml 文件,然后执行mvn idea:module重新生成以下为过程记录:首先是git clone项目,然后idea打开,等项目加载完后,一堆报错,找不到类,还项目结构也是乱的。然后用命令行执行mvn clean compile ,发现能够正常编译,好吧,又是idea的问题。但前几天在公司电脑上都可以正常编译的。然后尝试解决。invalidate cache/restart,清一下

2020-07-11 20:12:32 3853 4

空空如也

空空如也

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

TA关注的人

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