![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技术杂记
技术砖家--Felix
I'm felix li
展开
-
自从用了checkstyle,代码一天比一天规范
Checkstyle 可以检查源代码的许多方面。它可以发现类设计问题、方法设计问题。它还能够检查代码布局和格式问题。Checkstyle 配置指定要插入哪些模块并将其应用于 Java 源文件。模块以树的形式构建,其根是Checker模块配置 XML 文档中的module元素指定由元素的 name属性标识的模块。以下是典型配置文档的片段:编写checkstyle文件关于checkstyle文件的原理等不过多阐述,这里就给出一个大家一般都会用的一个checkstyle.xml文件,其中定义了很多我们需要去检原创 2022-11-30 14:24:34 · 245 阅读 · 0 评论 -
值得收藏的几个postman特色功能帮你事半功倍!
postman的变量都在{{变量}}中。预发环境定义全局domain开发环境定义全局domainpostman提供了很多随机变量,通过{{符号可以自动引出。随机生成一个int值。原创 2022-08-05 11:57:49 · 1950 阅读 · 0 评论 -
完整的扣减库存方案
查询库存判断是否超出库存开始扣减然后 A 线程更新最终库存数 lastInventory = inventory - 1 = 9,B 线程更新库存数 lastInventory = inventory - 1 = 9。而实际最终的库存应是 8 才对,这样就出现库存超卖的情况,而发不出货。恶意买家下单恶意买家指短时间内大量下单,将库存用完的买家。如果扣减库存后,用户不下单,占用库存名额,但是也要避免某些用户真实需要大量订单。解决超卖现象update的锁可以参考:mysql update锁分析 这篇文章了解一原创 2022-07-13 20:55:44 · 2528 阅读 · 0 评论 -
Windows下使用Kafka的常用命令
安装路径:D:\kafka\kafka_2.13-3.2.0\启动zookeeper启动kafka查看topic列表创建topic删除topic生产消息消费消息查看kafka指定TOPIC的详情查看消费组列表查看消费组详情查看指定消费组消费情况查看查看所有消费组消费情况...原创 2022-06-28 14:15:07 · 886 阅读 · 2 评论 -
docker-compose安装RocketMq教程
端口说明:docker-compose.yml文件内容docker-compose.yml中的配置的文件路径对应如下broker.conf路径:启动:在/opt/docker/compose/rocketmq 下执行命令:访问地址:ip:8180访问成功出现如下:原创 2022-06-20 16:21:08 · 1030 阅读 · 0 评论 -
Docker部署springboot项目全过程
jar包自己通过maven打包在启动module中的pom添加执行package命令文件内容:文件路径Dockerfile和jar包的路径构建镜像在当前jar包文件路径下执行运行镜像完成!!!后续可以自己启动或者停止原创 2022-06-20 11:18:07 · 169 阅读 · 0 评论 -
《雪花算法》的介绍以及实现
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的SnowFlake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。原理Twitter的雪花算法SnowFlake,使用Java原创 2022-03-22 17:54:25 · 344 阅读 · 0 评论 -
记录线上问题,事务和分布式锁之间发生的问题
1,背景我们消费其他系统过来的产品信息,然后插入我们数据库使用,但是对方不知道什么原因总是会重复的发送一些产品,因此做了产品判重。但发现没有作用。经过排查,发现对方会在几乎同时发送同样的产品信息过来。2,问题1:由于几乎同时执行,所以,当线程一进来进行插入,线程2也进来了,这时候线程1还没插入成功,线程2就判断是否存在,存在就不插入,不存在就插入,此时会插入成功。因为线程1还没插入成功。解决方案:在执行判断是否已经插入操作的方法上加锁,保证线程1插入成功后,线程2再进行判断:伪代码如下: @T原创 2021-12-30 19:37:06 · 791 阅读 · 0 评论 -
不要再纠结REST接口的名称该如何命名了
REST资源命名指南在REST中,主数据表示称为资源。拥有强大而一致的REST资源命名策略 - 肯定会证明您是长期最好的设计决策之一。REST中信息的关键抽象是一种资源。可以命名的任何信息都可以是资源:文档或图像,临时服务(例如“洛杉矶的今天天气”),其他资源的集合,非虚拟对象(例如人)等等。换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义。资源是到一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体。罗伊菲尔丁的论文一个资源可以是一个单或集合。例如,“ customers原创 2021-11-29 19:25:18 · 721 阅读 · 1 评论 -
MybatisPlus公共字段填充无效
MybatisMetaHandler配置没有问题如果你配置了SqlSessionFactory,那么问题就来了如果配置了SqlSessionFactory,那么你的MetaHandler就不能单独注入GlobalConfig,必须在这里进行注入,并且设置给sessionFactory原创 2021-11-29 17:09:03 · 369 阅读 · 0 评论 -
秒杀系统设计总结
秒杀总结转载 2021-11-11 15:36:45 · 74 阅读 · 0 评论 -
日志系统(redolog,binlog)一条SQL更新语句是如何执行的?
一条更新语句的执行流程又是怎样的呢?之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c:mysql> create table T(ID int primary key, c int);如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写:mysql> update T set c=c+1翻译 2021-11-09 12:01:31 · 200 阅读 · 0 评论 -
设计一个秒杀系统之削峰填谷
为什么需要削峰?如果你看过秒杀系统的流量监控图的话,你会发现它是一条直线,就在秒杀开始那一秒是一条很 直很直的线,这是因为秒杀请求在时间上高度集中于某一特定的时间点。这样一来,就会导致一 个特别高的流量峰值,它对资源的消耗是瞬时的。但是对秒杀这个场景来说,最终能够抢到商品的人数是固定的,也就是说 100 人和 10000 人发 起请求的结果都是一样的,并发度越高,无效请求也越多,或者说,10000件商品10000个人抢购,但是不要让大家一起去抢,这样谁也受不了,让他们排队抢。这就好比因为存在早高峰和晚翻译 2021-11-08 14:25:57 · 663 阅读 · 0 评论 -
出现 Lock wait timeout exceeded; try restarting transaction报错的几种情况解决方式
1, 查看事务 运行情况select * from information_schema.innodb_trx2,查看结果,直接killtrx_mysql_thread_id为线程id,直接kill 183,如果trx_mysql_thread_id为0,则说明是xa事务XA事务的回滚操作xa recover;如果data为:172.31.128.1:8091:4873088614704820233-4873088614704820235如果formatID:9752如果gtri原创 2021-11-02 11:37:27 · 2515 阅读 · 0 评论 -
mybatis plus模糊查询中文时 有数据但查不到
原因是application.properties中数据库没有配置&characterEncoding=utf-8原创 2021-10-22 11:59:37 · 275 阅读 · 0 评论 -
设计一个秒杀系统之限流得几种方式
为什么需要限流?在了解限流之前,先了解几个相关概念。吞吐量(TPS)、QPS、并发数、响应时间(RT)几个概念做下了解,记录如下:响应时间(RT)响应时间是指系统对请求作出响应的时间。直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间。由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输入数据的情况下响应时间也不相同。所以,在讨论一个系统的响应时间时,人们通常是指该系统所有功能的原创 2021-10-21 11:51:00 · 1614 阅读 · 0 评论 -
spring常见错误:Error creating bean with name ‘xxx‘
spring常见错误原创 2021-10-19 17:37:35 · 328 阅读 · 0 评论 -
Oauth2权限认证系统使用文档
Oauth2权限认证系统需求分析Oauth2权限认证系统基于spring security和spring cloud oauth2实现的为各个业务系统提供认证,权限控制,包括按钮,菜单,接口级别的权限,以及用户,角色,权限资源的管理。业务系统只需求按照要求接入配置,就可以完成系统间授权,联合登陆,并且解决了开发api。详细设计技术分析Spring securitySpring Security为基于J2EE的企业软件应用程序提供全面的安全服务核心功能:认证-授权(访问控制)Oauth2原创 2021-09-17 14:51:15 · 1004 阅读 · 0 评论 -
SpringBoot自动装配原理
自动装配的含义在SpringBoot程序main方法中,添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建的Spring容器中的bean;如图为springboot提供的starter自动配置:springboot应用程序启动类启动类一般通过@SpringBootApplication一个注解即可完成所有启动工作。并且启动类要在项目最原创 2021-09-16 16:46:44 · 346 阅读 · 0 评论 -
is a和has a的理解和对比
is-a has-ais-a( 是 “a” 小明是人类)表示的是属于得关系。比如兔子属于一种动物(继承关系)。has-a( 有 “a” 汽车有轮胎) 表示组合,包含关系。比如兔子包含有腿,头等组件;就不能说兔子腿是属于一种兔子(不能说是继承关系)"is a"关系和"has a"关系假设有两个类:Computer和Employee。明显地,这两个类之间不存在"is a"的关系,即Employee不是计算机,它们之间没有继承关系的必要。因此不可能产生代码重用性。但这两个类之间是"has转载 2021-09-15 15:12:43 · 988 阅读 · 0 评论 -
ThreadLocal 无法解决共享对象和ThreadLocalMap弱引用问题
ThreadLocal 无法解决共享对象的更新问题ThreadLocal 对象建议使用 static修饰。这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,所有此类实例共享 此静态变量 ,也就是说在类第一次被使用时装载,只分配一块存储空间,所有此类的对象(只 要是这个线程内定义的)都可以操控这个变量。关于ThreadLocalMap<ThreadLocal, Object>弱引用问题:当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocal原创 2021-07-01 19:31:43 · 889 阅读 · 0 评论 -
如何设计秒杀系统?
如何设计秒杀系统?转载 2021-06-24 15:35:19 · 66 阅读 · 0 评论 -
cookie和session的详解与区别
cookie和session的详解与区别转载 2021-06-23 19:44:39 · 70 阅读 · 0 评论 -
Mysql事务实现的原理
事务的持久性(redo log)redo log的作用是解决下面的问题:InnoDB作为MySQL的存储引擎,数据是存放在磁盘中的,但如果每次读写数据都需要磁盘IO,效率会很低。为此,InnoDB提供了缓存(Buffer Pool),作为访问数据库的缓冲:当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool;当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中,Bu.原创 2021-06-18 17:39:13 · 165 阅读 · 0 评论 -
关于Java线程池的几个问题?
1. 线程池相关核心线程满了线程放哪里?阻塞队列满了放哪里?基本线程和阻塞队列都满了放哪里?核心参数:int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。 intmaximumPoolSize, // 线程数的上限 long keepAliveTime, TimeUnit unit, //超过corePoolSize的线程的idle时长,超过这个时间,多余的线程会被回收。 BlockingQueueworkQueue, // 任务的排队队原创 2021-06-09 09:35:58 · 446 阅读 · 3 评论 -
利用swing写了一个随机点名小程序,超级实用!!!
利用swing做一个随机点名的小程序,可以添加姓名后点击查找,有一个查找的动态过程渲染的过程,最后停留在随机找到的那个人的框里代码mport javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import java.util.List;import java.util.Random;原创 2021-05-27 15:44:44 · 912 阅读 · 1 评论 -
JVM原理分析
JVM原理jvm虚拟机有Classic VM:JDK1 与 JDK2 的官方默认虚拟机,世界第一种 java 虚拟机。通过纯解释器执行 Java 代码,即时编译器只能通过外挂的形式存在,并且不能与解释器一起运行。(那个时候的 Java 很慢)Exact VM:Sun 公司为了解决 Classic VM 的效率问题而计划研发的,但只在 Solaris 系统上发布过,后来就被 HotSpot 取代了因其使用准确式内存管理而闻名。(知道内存中某一块区域存放的是哪一种数据结构,有利于垃圾收集)HotS原创 2021-04-02 14:42:28 · 140 阅读 · 1 评论 -
动态代理详解
1,jdk动态代理jdk动态代理,需要有顶层接口才能实现,mybatis的mapper文件,使用了动态生成字节码技术package org.lht.boot.lang.proxy;public interface IStudentService { /** * 交学费 */ void pay(); /** * 上课 */ void attendClass();}package org.lht.boot.lang.p原创 2020-08-17 15:28:50 · 182 阅读 · 0 评论 -
Thread.yield( )方法详解
Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!...原创 2020-07-31 13:17:30 · 6722 阅读 · 0 评论 -
springboot启动或打包报 Input length = 1
原创 2021-04-27 17:30:24 · 912 阅读 · 0 评论 -
使用RestTemplate报301 Moved Permanently解决
使用restTemplate时报下面的错误<head><title>301 Moved Permanently</title></head><body bgcolor="white"><center><h1>301 Moved Permanently</h1></center><hr><center>openresty</center></body&原创 2021-04-22 15:23:26 · 1234 阅读 · 1 评论 -
Error resolving template [department/upload], template might not exist or might not be accessible by
1,请求报错"Error resolving template [department/upload], template might not exist or might not be accessible by any of the configured Template Resolvers错误可能:类上面是@Controller,方法上面没有@ResponseBody解决:类上面用@RestController或者,方法上添加@ResponseBody...原创 2021-03-03 11:19:31 · 547 阅读 · 1 评论 -
elementui如何自定义表单校验规则(rules)?
1,在data中定义校验规则变量如图:let checkDetailTable = (rule, value, callback) => { if (this.detailTable.length < 1) { return callback(new Error('详情页字段不能为空')); } else { callback(); } };2,在对应的rules中定义prop属性进行校验 detailTab原创 2021-03-02 14:24:27 · 4503 阅读 · 2 评论 -
RedisTemplate的keys模糊匹配方法为空
应该改为StringRedisTemplate的keys方法,不应该使用RedisTemplate。原创 2020-11-11 22:12:29 · 862 阅读 · 1 评论 -
面经:苏州京东方研发面试
首先自我介绍,然后技术面试官开发提问,然后是一个像是业务的面试官,最后是HR提问,问了家庭成员,有没有女朋友,发展规划等。下面是技术问题:1,介绍一下商城的下单流程?2,如何防止多次请求?3,数据库事务的四大特性?4,final关键字的用法5,redis使用场景,以及雪崩后的处理方式?6,用过springboot监视器吗?7,mysql的编码理解?8,http状态码302是什么含义?9,TCP和UDP的区别?10,websocket长连接的理解?11,你在项目中解决了什么难题?12,原创 2020-07-31 13:56:01 · 1115 阅读 · 2 评论 -
vue路由this.route.push跳转页面不刷新
Vue路由this.route.push跳转页面不刷新一、背景介绍:在vue项目开发中,使用路由进行页面跳转时,路由所跳转的页面不进行刷新。也就是vue生命周期函数没有执行(created、mounted钩子函数)。案例:A页面:B页面:问题:当在A页面第一点击按钮到B页面时,一切正常,当返回到A页面再次点击按钮时,B页面没有执行mounted钩子函数,结果导致mounted函数中查询方法不执行。二、解决方法:1、使用activated:{}周期函数代替mounted:{}函数即可。2、转载 2020-07-26 15:24:55 · 766 阅读 · 0 评论 -
springbootadmin中项目一直处于未开启健康检查状态,但已注册到nacos
1,服务配置了 context-path 这个属性,导致 Spring Boot Admin 一直获取不到这个服务的端点信息2.没有引入下面的依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>查看:https://bl翻译 2020-07-15 14:27:24 · 944 阅读 · 1 评论 -
springboot和vue前后端分离跨域配置
1,后端配置package org.lht.boot.security.server.common.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor;import org原创 2020-07-07 23:14:19 · 330 阅读 · 0 评论 -
spring security跨域问题
1,添加如下代码http.cors().and().csrf().disable().authorizeRequests() //处理跨域请求中的Preflight请求 .requestMatchers(CorsUtils::isPreFlightRequest) .permitAll()注意,加载最前面不能加在anyrequest后面...原创 2020-07-07 23:08:13 · 453 阅读 · 0 评论 -
如何解决mysql插入数据乱码问题?
很多项目都使用mysql数据库,访问数据库进行数据的添加和更新的时候可能会出现乱码现象,解决方法:(1)sql编码,无论是什么方式(jdbc,spring,mybatis,hibernate等)连接,都需要设置连接串,就是url,如图设置,加上characterEncoding=utf-8,给数据库说明,我们的sql语句编码格式。(2)数据表及字段编码将表的存储类型,字段的存储类型都设置成...原创 2019-11-22 10:52:11 · 212 阅读 · 0 评论