- 博客(34)
- 收藏
- 关注
原创 实现分布式锁
Redisson实现分布式锁使用场景原始解决方法整合Redis的客户端RedissonRedissonRedisson的分布式锁和同步器可重入锁读写锁闭锁信号量 使用场景 前一篇文章说过在分布式场景下,高并发的情况下可能出现缓存击穿等缓存失效问题,解决该问题就是给业务加上锁。 提到锁可能第一印象会想到synchronized,但是synchronized只能解决本地服务的线程问题,面对分布式下的集群(一个服务在多台服务器运行),本地锁明显是解决不了问题的,这就引出了分布式锁的概念。 原始解决方法 结合re
2020-08-05 16:18:13
414
原创 高并发下的三个缓存失效问题
缓存失效问题缓存穿透缓存雪崩缓存击穿 缓存穿透 定义:指的是查询一个不存在的数据,由于缓存不命中,到数据库中进行查找,数据库也无记录,而此时刚好也没有将查询的null值写入缓存,导致每次查询都得到存储层进行查询,失去了缓存的意义。 风险:利用不存在的数据进行攻击,高并发下数据库压力增大,最终崩溃。 解决:将返回的null结果(指定一个标志位,只要不是null,不让请求到数据库进行查询)进行缓存,并加入短暂过期时间(避免后续有数据了,但是缓存一直返回null) 缓存雪崩 定义:在高并发下,将
2020-08-03 17:06:15
359
原创 Nginx功能之一:动静分离
背景:以Nginx加Windows搭建域名访问环境时(上篇文章),我们建立项目一般都是将静态资源(包括js,css,img)放在相应的前端模板下,这样,当我们对项目进行多个请求时,Tomcat因为要处理请求数据的动态与静态资源,会承受不住压力,吞吐量很小,导致卡死机的情况发生,或者响应数据很慢。 Nginx为我们提供了一个功能:动静分离。 顾名思义,就是讲动态资源与静态资源分开进行管理,讲渲染页面的静态资源都给分离出来,放在Nginx里,当我们发送请求时,由Nginx来直接返回静态资源,Tomcat只需要处
2020-08-03 15:23:26
480
原创 Elastcisearch使用教程
Elasticsearch使用安装基本语法运用 安装 1、Linux环境下使用docker容器安装Elasticsearch 打开终端,输入指令,此处如果之前没有pull镜像,则会为我们主动下载镜像 docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -v /mydata/elasticsearch/config
2020-08-03 15:01:00
768
原创 Nginx+Windows搭建域名访问环境
Nginx+Windows搭建域名访问环境配置hosts文件配置目标IP地址的nginx配置上游服务器(网关) 配置hosts文件 在下面路径下找到hosts文件 C:\Windows\System32\drivers\etc 在文件最下方配置 “目标IP地址” “本机输入的想跳转到目标IP地址的域名” 如192.168.205.122 www.niubi.com 配置完后,当你本地输入www.niubi.com,就会跳转到指定IP地址192.168.205.122 配置目标IP地址的nginx 在ng
2020-08-01 15:08:46
823
原创 在本地Maven下载jar包的坑人bug,Non-parseable settings
在本地Maven下载jar包的坑人bug,Non-parseable settings
2020-07-08 22:29:22
3541
1
原创 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.athk.eduservice
解决的org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.athk.eduservice最详细的方法。 mapper下的xml文件写sql语句不生效,报错的原因是因为mapper的项xml文件没有被转化成.class文件,导致sql没运行到。 我们查看xml文件是否有被转化到被加载到项目中去,可以到target目录下查看。 此时我们看到我们的src目录下是有xml文件的,但是我们再到tar
2020-07-08 11:01:05
335
1
原创 mybatis-plus最便捷、最常用、最强大的功能
mybatis-plus是一款MyBatis的增强工具包,简化CRUD操作。 最近看到很多项目,朋友说的几家公司,都在开始用mybatis-plus了,可见,作为mybatis的增强工具,mybatis-plus正在一步步的发挥它的作用,在未来,应该会代替mybatis。 在这里,跟大家分享一下,我最近常用的它的功能,也是我目前为止感觉式它最强大的功能。那就是代码生成器,废话不多说,直接上代码,大家看到一大串代码不用慌,这东西直接复制过去用就行了,都是mybatis-plus官方给出来的,我们只需要对一些路
2020-07-06 21:09:40
1451
原创 Required request body is missing: public com.athk.commonutils.R com.athk.eduservice.controller.EduCo
美好的一天,从解决BUG开始!
2020-07-06 17:25:04
4779
1
原创 VUEResponse to preflight request doesn‘t pass access control check: No ‘Access-Control-Allow-Origin‘
Failed to load http://localhost:9001/eduservice/course/addCourseInfo: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http.
2020-07-06 16:54:55
6273
原创 nginx转发请求的实现和nginx启动失败的常见原因
nginx转发请求的实现 nginx(反向代理服务器)常见的功能有 1、转发请求 2、负载均衡 3、动静分离 本文针对转发请求做一丢丢理解 转发请求指的是把我们对其他端口页面进行访问时,都会先经过nginx服务器,然后nginx服务器根据你的请求路径进行路径匹配,当发现你请求地址中有特定值时,帮你访问特定的端口页面。 具体操作 在conf下找到nginx.conf,拉到最底下,在http{ }里面进行配置 server{ listen 9001;//监听端口, server_name
2020-07-04 21:36:30
3833
原创 使用对象存储OSS上传文件到阿里云
1、注册阿里云,搜索找到对象存储OSS,创建Bucket,记住Bucket名称 1、搜索对象存储OSS 2、创建Bucket 2、点击Access Key获取到AccessKey ID和AccessKey Secret 3、点击查看Bucket列表获取地域节点 4、idea中引入相关依赖 <dependencies> <!-- 阿里云oss依赖 --> <dependency> <groupId>com.aliyun.o
2020-07-04 17:01:45
851
1
原创 在线API文档Swagger的具体操作
引入相关依赖 <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <scope>provided </scope> </dependency> <dependency> <groupId>io
2020-07-02 11:59:19
406
原创 MybatisPlus实现乐观锁
首先先介绍一下乐观锁与悲观锁。 乐观锁主要用来解决丢失更新问题。 所谓的丢失更新问题就是当一条数据同时被两个人拿到进行操作时,第一个人将数据实现了更新,紧接着第二个人拿着的数据看起来还是旧数据,实则已经被修改过了,第二个人对该数据再次进行修改。倘若两个人修改的数据不一样,第一个人就会一直以为自己已经修改了数据,并运用着自己以为改了但是被另一个人给改掉而自己却不知道的数据,实际运用场景中可能会引发较大的问题。 运用悲观锁解决问题可以用synchronized或者lock进行解决,但是带来的问题就是当一个人在操
2020-07-02 11:36:22
736
1
原创 mybatisplus的自动填充功能
使用情景:当我们往数据库表中加入一条数据,或者更新一条数据的时候,通常要调用实体类的set方法,运用mybatisplus的自动填充功能则可以帮我们自动设置,不用我们手动调用set()方法。 具体实现 1、在实体类中对需要自动填充的属性加上注解 //对于添加时要填充的 @TableField(fill = FieldFill.INSERT) //对于更新时要填充的 @TableField(fill = FieldFill.INSERT_UPDATE) 2、创建类 类要实现MetaObjectHandler
2020-07-01 11:57:12
2243
原创 主键策略
1、自动增长 AUTO INCREMENT将表中的主键逐渐加1,到一定数量后分表操作,下张表的主键为上张表的最后一个数+1开始增长; 优点:自动排序 缺点:换表的时候得找到上一张表得最后一个主键值 2、UUID 每次会随机生成一个唯一的值优点 :换表的时候不用考虑获取其他值,可以直接随机生成 缺点:排序不方便 3、redis实现 redis的原子操作 优点: 不依赖数据库,性能优于数据库 数字天然排序,对分页或者需要排序的结果很有帮助 缺点:需要编码和配置工作量较大 4、mybatisplus自带策略 运用
2020-07-01 11:09:45
708
原创 使用Lombok插件给实体类代码简洁化,并利用mybatis-plus实现CRUD操作
导入Lombok依赖 以下spring boot版本号2.2.1 IDEA版本2017 <!--lombok用来简化实体类--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--mybatis-plus--> <dependency>
2020-07-01 10:40:52
557
原创 无法解析类 ‘Driver‘ 更少... (Ctrl+F1) Checks Spring Boot application .properties configuration files. High
spring boot版本号 2.2.1 pom文件中已经加入了依赖 <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 但是在application.properties中spring.datasource.driver-class-name=
2020-07-01 10:14:40
2104
原创 获取Class实例的四种方式
类的加载过程 程序在经过javac.exe命令后会生成一个或多个字节码文件(.class结尾的文件),接着使用java.exe命令对字节码文件进行解释运行,这时候就把字节码文件加载到内存中。加载到内存中的类成为运行时类,运行时类是Class的实例。 @Test public void test() throws ClassNotFoundException { //方式1:调用运行时类的属性 .class Class cla1 = person.class; System.out
2020-06-30 20:14:25
827
原创 Java集合JDK8
Java集合可以分为Collection和Map两种体系; Collection接口:单列集合,存储一个个的对象 Collection接口下有两个子接口:List接口和Set接口 List:存储有序、可重复的对象 Set:存储无序、不可重复的对象 List接口的实现类:ArrayList、LinkedList、Vector ArrayList:作为List的主要实现类,线程不安全,效率高;底层使用数组transient Object[] elementData;来存储数据。 /** *当你调用无参构造器时
2020-06-30 15:56:49
280
原创 String,StringBuffer,StringBuilder三者的异同
相同点:>在JDK8中String,StringBuffer,StringBuilder三者的底层存储都是用char[ ]来存储的。 >都是final类,不可被继承。 不同点:>String底层private final char value[];final决定了String的不可变性。 >StringBuffer,StringBuilder是可变的。 >StringBuffer线程安全,但是效率低下。 >StringBuilder线程不安全,但是效率高。 ...
2020-06-30 10:14:43
219
原创 sleep和wait的区别
相同点:都可以使进程进入阻塞状态; 不同点:>声明的父类不一样,Thread声明sleep,Object声明wait >sleep()可以在任何情景调用,wait()只能在同步方法或者同步代码块中被调用; >在同步方法或者同步代码块中,sleep()不会释放同步监视器,wait会释放同步监视器; ...
2020-06-29 21:20:52
219
原创 线程安全的3个基本解决方法
出现线程安全问题的原因:某个线程仔操作共享数据的同时,另外的线程也对它进行操作。 方式1: 同步代码块 >synchronized(同步监视器){ 需要被同步的代码 }; >说明:操作共享数据的代码,即为同步代码; >共享数据:多个线程共同操作的变量。比如卖票问题中的票数; >同步监视器:俗称,锁,任何一个类的对象都可以充当锁; >多个线程要共用同一个锁(保证线程安全)。 class window1 implements Runnable{ private stati
2020-06-29 21:12:56
300
原创 线程的5个生命周期
线程一个完整的生命周期可以看成五个部分,分别是: 1、新建:当一个线程被创建时(详见https://blog.youkuaiyun.com/fighting32/article/details/107022646)此时线程处于新建状态; 2、就绪:当调用start()方法时,就会进入线程队列等待CPU时间片,此时它已经具备了运行的条件,只是没有被CPU分配到执行权力; 3、运行:当就绪的线程被CPU时间片调度并获得CPU资源时,便进入运行状态,开始运行run()方法中的线程操作; 4、阻塞:当被认为挂起,或执行输出输入
2020-06-29 17:27:01
1840
原创 多线程的四种创建方式
方式1: >继承于Thread类 > 创建一个继承于Thead类的子类 >重写Thread类的run方法 >创建Thread的对象 >通过该对象调用start() class A extends Thread{ @Override public void run() { for (int i= 1 ;i<=100; i++){ if(i % 2 != 0){ System.out.pr
2020-06-29 16:37:16
721
原创 单例设计模式(面试题手写)
作用:采取一定方法保证在整个软件系统中,对某个类只存在一个对象实例。 优点:只生成一个实例,减少了系统功能开销。 实现方式1:饿汉式 1.私有化构造器 2.内部创建对象 3.提供公共静态方法,返回对象 特点:加载时间长(坏处) 线程安全(好处) //饿汉式 class Bank{ //私有构造器 private Bank(){}; //内部创建对象 private static Bank instance = new Bank(); //返回对象 public
2020-06-29 11:35:08
498
原创 重载和重写的区别
从定义上看二者区别: 重载:是在同一个类下定义相同名字但是参数不同或者返回类型不同的多个方法 这里所说的参数不同可以分为: 1、参数类型不相同 2、参数个数不相同 重写:是当子类继承父类后,对父类已经存在的方法进行重写覆盖操作,达到子类所想达到的实际运用效果(就比如父亲之前是拿钱做服装行业的,儿子继承父亲的财产后,并不想做服装生意,他有自己的想法,想开IT公司) 这里有几个注意的点: 1、重写的权限修饰符要不小于父类中的权限修饰符(比如父亲盖了一层楼,当你继承父亲后你起来当家了,你只能是往更高楼层盖,再怎么
2020-06-29 10:47:29
291
原创 一维数组的内存解析
当定义一个数组时,会先在栈中建立一个数组名,然后根据定义的数组的大小在堆建立一个内存空间,并给该内存空间第一个空间命名一个地址,将该地址赋给栈里面的数组名。 当要操作到该数组时,会先找到栈中的变量名,再根据该变量名在堆中指定的地址值找到数组在堆中的第一个内存空间开始寻找,找到想做操作的值。 当堆中的内存空间在栈中没有对应的值时,堆的内存空间则会被自动回收(JVM的垃圾自动回收机制),当main方法执行完成后,数组的变量名也会自动弹出栈,此时的堆的内存空间也会被自动回收 ...
2020-06-29 09:51:19
702
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅