- 博客(87)
- 资源 (1)
- 收藏
- 关注
原创 Spring中Controlle单例和ThreadLocal的使用
结论:controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。 正因为单例所以不是线程安全的。我们下面来简单的验证下:package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import org.springframework.
2022-01-23 09:45:36
2417
原创 数据库索引的原理,为什么要用 B+树,为什么不用二叉树
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不是平衡二叉树,为什么不是 B 树,而偏偏是 B+树呢?为什么不是一般二叉树?如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。为什么不是平衡二叉树呢?我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可
2022-01-17 14:22:03
1164
1
原创 Java8 CompletableFuture supplyAsync runAsync
Java8 CompletableFuture 创建线程 supplyAsync runAsync一、前言二、CompletableFuture创建新线程创建测试用的业务类supplyAsync(有返回值)runAsync(无返回值)一、前言Java8推出了CompletableFuture,它实现了很多功能,用它编写的代码也比较优雅。目前大多数公司用的JDK已经从6升级到8及以上了,那么作为一名合格的Java打工人,除了要掌握之前的FutureTask和CompletionServic
2022-01-11 16:58:55
1876
原创 IT综合运维系统-身份对接记录
问题11.由于该系统原先用的是shiro身份认证框架,现需要部分接口需要完成跟《信息职业技术学院》的系统进行身份对接,问题点怎么再原有的shiro身份认证框架上,又集成身份认证?分析1.查看了《信息职业技术学院》对接文档,和IT综合系统shiro的集合,发现他们都是对/*所有的请求进行拦截2.所以进行分析,只需要对相应接口进行相应的身份认证即可。解决3.故对需要身份对接的接口以/f/*前缀进行区分即可,如下: CASFilter org.jasig.cas.client.authe
2021-12-07 17:09:13
275
原创 身份认证对接Filter过滤器
问题在与深证信息职业学院系统身份认证的时候,该系统默认会在我们的回调地址栏加上;jsessionid=6EEB42B0546A1B057BD37A628CAE646F这个参数,导致我们http://10.10.16.172:8080/csos/f/PCRepairsMobile/getRedict;jsessionid=6EEB42B0546A1B057BD37A628CAE646F 我们的回调地址出现400错误,调用不到http://10.10.16.172:8080/csos/f/PCRepairsM
2021-12-06 10:54:04
486
原创 MyBatis-Plus 使用枚举saveBatch出现问题
一. 枚举类如下@JsonFormat(shape = JsonFormat.Shape.OBJECT)public enum OrderType implements IEnum<Integer>{ /** * LONELY_ORDER = "独立下单" */ LONELY_ORDER(1, "独立下单"), /** * FOLLOW_HARDWARE_ORDER = "随硬件下单" */ FOLLOW_HARDW
2021-11-03 14:10:08
705
原创 Java线程之setDaemon(true)方法的作用
一、线程JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个IllegalThreadStateException异常。不能操作文件、数据库等资源,避免主线程关闭而未能关闭守护线程的资源,并且它会在任何时候甚至在一个操作的中间发生中断。二、优点及使用场景在主线程关闭后无需手动关闭守护线程,因为会自动关闭,避免了麻烦,Java垃圾回收线程就是一个典型的守护线程,简单粗暴的可以理
2021-09-01 16:34:53
4676
转载 IO密集和CPU密集与多线程的联系
IO概念IO是一个通用的概念,即数据从一个地方移动到另一个地方,对一个实体来说,可以看成数据从外部进入,以及从实体输出到外部。具体来说,常见的IO请求有网络IO,磁盘IO。那么因为CPU的工作频率远远快过和其连接的外部硬件,例如磁盘,所以CPU在IO的时候经常会需要等待外部硬件完成当前任务,完成之后,才能进行下一个任务,这种情况常常称为IO阻塞,即CPU直到等待IO操作返回前,不能继续运行。IO阻塞对于CPU强大的运算能力是一个巨大的浪费。所以有了多线程,多线程是同步运行的多个任务。不过由于CPU核
2021-08-26 10:33:52
428
原创 MyBatis-Plus (Lambda)写法
写法一:QueryWrapper<Student> queryWrapper = new QueryWrapper<>();queryWrapper.lambda() .eq(Student::getName, "冯文议") .or() .eq(Student::getName, "1");List<Student> studentList = list(queryWrapper);for (Student stud
2021-07-05 16:44:20
1017
原创 Mysql数据库优化
1.查询条件放到子查询中,子查询只查主键ID,然后使用子查询中确定的主键关联查询其他的属性字段;原理: 减少回表操作;mysql> select * from test where val=4 limit 300000,5;+---------+-----+--------+| id | val | source |+---------+-----+--------+| 3327622 | 4 | 4 || 3327632 | 4 | 4 || 3
2021-06-16 18:46:45
119
原创 记一次Tomcat运行程序优化
1.刚开始tomcat跑起来运行正常,但过了半天,程序跑起来太慢,考虑不是mysql,和网络,和服务器性能问题,就开始分析是否是堆栈,tomcat线程数问题,用jconsole分析了下,进行堆栈内存加大,和增大tomcat线程数。一、加大堆栈内存在tomcat/bin目录下找到catalina.sh,用文本编辑器打开,加上下面一行(位置如图):export CATALINA_OPTS="-Xms1024M -Xmx1536M -XX:PermSize=2048m-XX:MaxPermSize=20
2021-06-16 18:44:34
169
原创 设计模式之管道模式——pipeline与valve
场景在一个比较复杂的大型系统中,假如存在某个对象或数据流需要被进行繁杂的逻辑处理的话,我们可以选择在一个大的组件中进行这些繁杂的逻辑处理,这种方式确实达到了目的,但却是简单粗暴的。或许在某些情况这种简单粗暴的方式将带来一些麻烦,例如我要改动其中某部分处理逻辑、我要添加一些处理逻辑到流程、我要在流程中减少一些处理逻辑时,这里有些看似简单的改动都让我们无从下手,除了对整个组件进行改动。整个系统看起来没有任何可扩展性和可重用性。是否有一种模式可以将整个处理流程进行详细划分,划分出的每个小模块互相独立且各自负责
2021-02-05 09:45:42
1339
原创 Redis主从复制讲解
前提知识:当从服务器连接主服务器的时候,主服务会执行bgsave操作(bgsave就是执行rdb快照命令,会创建一个子进程执行执行快照操作)slaveof host port 和 slaveof no one 命令slaveof host port 开启复制slaveof no one 终止复制主从复制过程:注意:redis不支持主主复制主从链从服务也可以拥有自己的从服务器,因此形成了主从链。如果多个从服务器链接主服务器,主服务会无法快速的响应更新所有的从服务器,或者因为重新.
2021-02-03 16:07:44
132
原创 Redis持久化方式RDB和AOF方式
AOF方式:概念:配置文件appendonly yes打开aof配置appednfsync 同步频率选项推荐使用everysec这个选项aof缺点:解决:使用bgrewriteaof命令auto-aof-rewrite-percentage 100 和 auto-aof-rewrite-min-size 64mb 解释RDB方式概念:它可以将某一时刻的所有数据都写入硬盘里面。配置:rdbcompression yes 开始快照持久化save 60 1000
2021-02-03 15:43:13
129
原创 Redis中雪崩、击穿、穿透
穿透概念缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。解决缓存穿透我会在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等Redis还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生,他的原理
2021-02-03 10:26:20
324
原创 redis互斥锁
redis互斥锁设计方式一: 使用 set(arg1,arg2,arg3,arg4,arg5)//如果不存在就设置,且设置成功60秒后key自动失效,成功会返回字符串"OK ", 如果存在就不设置该keyString ret = jedis.set(key, value, “NX”, “EX”, 60);flag = ret.equals(“OK”) ? true : false;jedis.del(key);方式二: 使用 setnx(arg1,arg2)String ret = jedis
2021-02-03 10:26:07
1047
原创 SpringBoot-操作RedisTemplate拿来即用
1. 引入pom:<!--redis依赖配置--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--连接池--><dependency> <groupId&
2021-01-28 14:40:47
197
原创 SpringCache操作Redis-@EnableCaching,@Cacheable,@CachePut,@CacheEvict使用
概念当Spring Boot 结合Redis来作为缓存使用时,最简单的方式就是使用Spring Cache了,使用它我们无需知道Spring中对Redis的各种操作,仅仅通过它提供的@Cacheable 、@CachePut 、@CacheEvict 、@EnableCaching等注解就可以实现缓存功能。常用注解@EnableCaching开启缓存功能,一般放在启动类上。@Cacheable使用该注解的方法当缓存存在时,会从缓存中获取数据而不执行方法,当缓存不存在时,会执行方法并把返回结果
2021-01-28 14:25:29
964
原创 RabbitMQ实现延迟消息-死信列队
RabbitMQ实现延迟消息的方式有两种,一种是使用死信队列实现,另一种是使用延迟插件实现。这个讲的是死信队列实现使用:添加依赖:<!--消息队列相关依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId></dependency>.
2021-01-27 10:48:12
330
原创 RabbitMQ实现延迟消息-插件版本
RabbitMQ实现延迟消息的方式有两种,一种是使用死信队列实现,另一种是使用延迟插件实现。这个讲的是插件版本首先我们需要下载并安装RabbitMQ的延迟插件。去RabbitMQ的官网下载插件,插件地址:https://www.rabbitmq.com/community-plugins.html直接搜索rabbitmq_delayed_message_exchange即可找到我们需要下载的插件,下载和RabbitMQ配套的版本,不要弄错;将插件文件复制到RabbitMQ安装目录的plugin.
2021-01-27 10:31:33
969
原创 SpringBoot中处理参数校验和自定义参数校验
1. 开启校验功能<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency>2. 常用的注解@Null:被注释的属性必须为null;@NotNull:被注释的属性不能为null;@AssertTrue:被注释的属性
2021-01-26 16:05:01
637
原创 Nginx中的root与alias的差别
格式nginx指定文件路径有两种方式root和alias,指令的使用方法和作用域:[root]语法:root path默认值:root html配置段:http、server、location、if[alias]语法:alias path配置段:locationroot与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。root的处理结果是:root路径 + location路径alias的处理结果是:使用ali
2021-01-25 08:58:45
541
原创 Hutool中那些常用的工具类和方法
Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子。如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有。本文将对Hutool中的常用工具类和方法进行介绍。安装maven项目在pom.xml添加以下依赖即可:<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <v.
2021-01-22 14:53:41
689
原创 RestTemplate get和post使用方式
一 先创建一个可以访问的服务拿来测试:post请求地址:http://127.0.0.1/list?uid=1212&productCode=萨芬萨芬 @ResponseBody @PostMapping("/list") public List<Employee> list(@RequestParam("uid") String uid,@RequestParam("productCode") String productCode) { Sys
2021-01-21 10:47:35
217
原创 SpringBoot - @Configuration和@Bean的使用
Configuration配合@ConfigurationProperties和@EnableConfigurationProperties()实现Bean类自动赋值操作,加深下@Configuration注解使用一 . 创建了一个Hhc Bean类。public class Hhc { private String name; private Integer age; @Override public String toString() { re.
2021-01-20 16:23:31
397
1
原创 Spring Boot - 常用的一些注解
Spring Boot 常用注解@SpringBootApplication@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Configuration@EnableAutoConfiguration@ComponentScanpublic @interface SpringBootApplication { /** * Exclude specific auto-co
2021-01-20 15:55:42
176
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人