自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 Redis是否存在线程安全问题

关于这个问题,从两个方面回答第一个,从Redisd的服务端层面,Redis Server本身是一个线程安全的K-V数据库,也就是说在Redis Server端去执行指令的时候,不需要任何的同步机制,它不会存在任何线程安全的一个问题,虽然Redis 6.0里面增加了多线程的模型,但是增加了多线程模型呢只是去处理网络的IO事件,对于指令的执行过程,仍然是采用主线程来处理的,所以它并不会存在多个线程同时去执行操作指令的一个情况,为什么Redis没有采用多线程来执行指令,我认为呢,有几个方面的原因,首先呢Redi

2022-04-25 09:10:30 2968

转载 Java 如何重写对象的 equals 方法和 hashCode 方法

一、需求:对比两个对象是否相等。对于下面的 User 对象,只需姓名和年龄相等则认为是同一个对象。二、解决方案:需要重写对象的 equals 方法和 hashCode 方法package com.yule.user.entity;import org.springframework.util.StringUtils;/** * 用户实体 * * @author yule * @date 2018/8/6 21:51 */public class User { privat

2021-11-16 16:48:47 316

转载 MySQL定时备份数据库方案

一、MySQL数据备份1.1、 mysqldump命令备份数据在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump,首先我们简单了解一下mysqldump命令用法:#MySQLdump常用mysqldump -u root -p --databases 数据库1 数据库2 > xxx.sql1.2、 mysqldump常用操作示例1.备份全部数据库的数据和结构mysqldump -uroot -p1234

2021-09-29 11:44:20 111

原创 MySQL深分页问题

以下文章来源于公众号捡田螺的小男孩 ,作者捡田螺的小男孩前言我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下。本文将分四个方案,讨论如何优化MySQL百万数据的深分页问题,并附上最近优化生产慢SQL的实战案例。limit深分页为什么会变慢?先看下表结构哈:CREATE TABLE account ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', name varchar(255) DEF.

2021-09-29 10:31:32 126

原创 使用Arrays.asList{}遇到的坑

有一次,在项目中,使用Arrays.asList{…}实现集合数据添加,代码如下List<String> kVal=cardMap.get(dto.getIdCard());if(kVal!=null && kVal.size()>0){//一个人可能有多个岗位 kVal.add(dto.getVal()); cardMap.put(dto.getIdCard(),kVal);}else { List<String> val=Arr

2021-09-28 10:42:42 137

原创 远程服务调用feign,传递参数list

class Configuration { @Bean Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> converters) { return new SpringFormEncoder(new SpringEncoder(converters)); }}

2021-09-28 10:28:04 869

原创 你不知道的GET与POST请求

1.get请求,它的数据是放在url当中的,所以get有长度限制,而post请求呢它的数据是放在请求体body当中,所以没有长度限制2.get请求的安全性不如post,但是传输速度呢比post快3.get请求可以少产生一个tcp包,相当于一次性到货,但是呢post需要两个4.get请求可以被缓存,但是post不能5.get请求是可以被反复刷新的,但是呢,post如果反复刷新的话就会重新提交数据...

2021-08-19 08:40:08 45

原创 缓存雪崩、击穿、穿透,面试无压力

今天讲点Redis安全相关,同时也是面试中经常会问到的知识点.**缓存穿透**产生背景: 缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次查询都会穿透到后端数据库查询,使得数据库的压力非常大。解决方案:1.接口实现api的限流、防御ddos攻击、网关实现黑名单2.在数据库和Redis都查询不到的情况下,将数据库的空值写入到缓存中,加上短时间的有效性(只适合单个key,不适合随机产生不同的key,假如过段时间生成的key就是空的key,会影响正常的使用)3.布隆过滤器

2021-08-14 15:56:19 68

转载 SpringCloud确保服务只能通过gateway转发访问,禁止直接调用接口访问【转载】

前言在微服务体系架构中,网关承担着重要的角色,在网关中可以添加各种过滤器,过滤请求,保证请求参数安全,限流等等。如果请求绕过了网关,那就等于绕过了重重关卡,直捣黄龙,所以,在分布式架构中,我们需要有一定的防范,来确保各个服务相互之间安全调用。正文思路1、在网关中给所有请求加上一个请求密钥2、在服务添加过滤器,验证密钥首先在网关服务(gateway)中添加过滤器,给放行的请求头上加上判断package com.hpsyche.hpsychegatewayserver.filter;impor

2021-02-22 09:19:05 1024 3

原创 ArrayList线程安全处理

//1.Collections.synchronizedListList<Object> list1= Collections.synchronizedList(new ArrayList<>());//2. 使用线程安全的 CopyOnWriteArrayList 代替线程不安全的 ArrayList。List<Object> list2=new CopyOnWriteArrayList<>();//3.使用ThreadLocal 推荐Threa

2021-02-01 11:23:43 117

转载 MySQL按照汉字拼音首字母排序

按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序;如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了)。直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序;如果存储姓名的字段采用的是 utf8字符集,需要在排序的时候对字段进行转码;对应的代码是 order by

2021-01-15 08:48:10 177

原创 SpringBoot2+mybatisPlus3+activiti6整合,踩的坑

本文参考自原文博客MybatisPlus+Activiti6用MybatisPlus和activiti整合也出现了问题,真的是头大。刚开始以为版本冲突,还了好多版本都不行,最后得出的结论是因为mybatisplus,要求用mybatis3.4.6,而activiti用的是mybatis3.4.2,两边有冲突。解决办法:将activiti中排除掉<dependency> <groupId>org.activiti</groupId>

2020-09-08 22:15:25 151

原创 RAS公钥私钥

后端工具类package com.xx.auth.utils.encrypt;/** * @Author:zhao-baolin * @Description: * @Date:Created in 2018/7/4 * @Modified By: */public class HexUtil { private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '

2020-09-03 21:58:48 578

原创 微服务之业务模块抛出的异常无法被公共代码模块的自定义全局捕获异常捕获到

项目经理某天对我说,我上一任程序员之前在业务模块抛出的异常无法被公共代码模块的自定义全局捕获异常捕获到,现在是在业务模块内添加了跟公共模块相同的全局捕获异常代码文件,让我排查下是什么原因导致失效的。我人为的制造了异常让代码抛出异常,结果正如项目经理所言,假如业务模块内没有写全局捕获,那么异常将自己抛出,不走公共模块的自定义全局异常捕获。其实刚开始我也是挺困惑的,以为是使用了springsecurity的原因,百度了下,发现**@CtrollerAdvice必须要让spring扫描到才生效**,于是我检查了

2020-09-03 21:34:28 617

原创 MyBatis一级缓存详解

什么是缓存缓存就是内存中的一个对象,用于对数据库查询结果的保存,用于减少与数据库的交互次数从而降低数据库的压力,进而提高响应速度。什么是MyBatis中的缓存MyBatis 中的缓存就是说 MyBatis 在执行一次SQL查询或者SQL更新之后,这条SQL语句并不会消失,而是被MyBatis 缓存起来,当再次执行相同SQL语句的时候,就会直接从缓存中进行提取,而不是再次执行SQL命令。MyBatis中的缓存分为一级缓存和二级缓存,一级缓存又被称为 SqlSession 级别的缓存,二级缓存又被称为表

2020-08-14 11:25:23 151

原创 静态方法上加上synchronized,用的是什么锁?

public class Test {public synchronized void sale{xxx}}等价于public class Test {public static void sale{synchronized(this){}}}public class Test {public static synchronized void sale{xxx}}等价于public class Test {public static void sale{synchr

2020-08-06 20:37:44 473

原创 通俗易懂理解数据库三范式

第一范式就是属性不可分割,每个字段都应该是不可再拆分的。比如一个字段是姓名(NAME),在国内的话通常理解都是姓名是一个不可再拆分的单位,这时候就符合第一范式;但是在国外的话还要分为FIRST NAME和LAST NAME,这时候姓名这个字段就是还可以拆分为更小的单位的字段,就不符合第一范式了。第二范式就是要求表中要有主键,表中其他其他字段都依赖于主键,因此第二范式只要记住主键约束就好了。比如说有一个表是学生表,学生表中有一个值唯一的字段学号,那么学生表中的其他所有字段都可以根据这个学号字段去获取,依赖主

2020-08-06 15:33:41 131

原创 总结最好的序列化与反序列化概述

序列化:把对象转化成字节的过程,成为对象序列化反系列化:把字节恢复成对象的过程,成为反序列化1.对象的持久化概念:将对象转化成字节,保存在硬盘上永久存放2.网络传输对象的概念:客户端将对象序列化为字节的形式(序列化),变成二进制的的形式发送到服务端,服务端接收到字节对象后,反序列化成对象注意:序列化的类必须要实现Serializable接口 transient修饰对象不被序列化...

2020-08-05 17:38:56 109

原创 简述Java8新特性

1.Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。2.方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。3.默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。4.新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。5.tream API −新添加的Stream API(java.util.

2020-08-04 23:26:22 152

原创 简单概述下拦截器与过滤器之间有哪些区别

相同点:拦截器与过滤器都是基于AOP技术,对方法实现增强,都可以拦截请求方法不同点:1.过滤器属于servlet自己研发的,而拦截器技术是属于springMVC自己研发的2.过滤器属于拦截web请求,而拦截器不仅可以拦截请求还可以拦截普通方法3.过滤器会比拦截器先执行,拦截器封装的方法会比过滤器拦截使用起来更加简单实际开发中绝大多数情况下,都会使用拦截器拦截器:权限控制、日志打印、参数验证、会话过滤器:编码转换、跨域解决、xss攻击...

2020-08-04 15:46:19 148

原创 使用LinkedList实现1.7版本HashMap

public interface YouthMap<K,V> { /** * 集合的大小 * @return */ int size(); /** * 添加元素 * @param key * @param val * @return */ V put(K key,V val); /** * 根据key查询 * @param key * @re

2020-08-03 23:44:29 125

原创 测试了很久的redis分布式锁

前言:分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁组件依赖首先我们要通过Maven引入Jedis开源组件,在pom.xml文件加入下面的代码:<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId>

2020-08-03 15:36:56 185

原创 简单描述下SpringMVC执行流程

SpringMVC工作流程描述1.用户向服务器发送请求,请求被前端控制器DispatcherServlet捕获;2.DispatcherServlet对请求uri进行解析,得到请求资源标识符(uri),然后根据该uri,调用HandlerMapping获得该Handler配置的相关对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;3.DispatcherServlet根据获得的Handler,选择一个适合的Handler.

2020-08-02 22:04:27 224

原创 简单描述下SpringBean的生命周期

1.Spring对Bean进行实例化(相当于程序中的new Xx())2.Spring将值和Bean的引用注入进Bean对应的属性中3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法(实现BeanNameAware主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory

2020-08-02 20:53:50 229

原创 Spring核心技术之事物

事物的概述1.原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。2.一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。3.隔离性:隔离性是当多个用户并发访

2020-08-01 17:28:21 77

原创 Spring核心技术之IOC与AOP

Spring的核心技术:IOC、DI、AOP与事物管理、事物传播行为Spring的核心原理:反射技术+解析xml(dom4J)什么是Spring:管理每个bean(对象)与bean(对象)之间的关系,使用Spring进行管理Spring的好处:解耦、单例(节约内存,不过线程不安全)什么是IOC:控制反转,将bean对象的创建交给Spring容器进行管理什么是ID:依赖注入,解决对象之间的依赖关系...

2020-08-01 17:13:28 93

原创 详解@Resource与@Autowired区别

1.@Resource与@Autowired都可以用来装配bean,都可以写在字段上,或者写在setter方法上。2.@Autowired默认按照类型进行装备(属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如@Autowired(required=false),如果我们想使用名称装配可以结合@Qualifier注解进行使用,如1. @Autowired() @Qualifier("baseDao") 2. priv

2020-08-01 17:05:34 125

原创 ThreadLocal的使用与思考

一、什么是ThreadLocal:ThreadLocal提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存了一个变量副本,每个线程的变量都不同。ThreadLocal相当于提供了一种线程隔离,将变量与线程相绑定。ThreadLocal适用于在多线程的情况下,可是实现传递数据,实现线程隔离二、Threadlocal 核心API:1.set 设置当前线程绑定的局部变量2.get 获取当前线程绑定的局部变量3.remove 移除当前线程绑定的变量Threadlocal简单用

2020-07-31 17:37:11 109

原创 简单描述强引用 、弱引用的概念

强引用:被引用关联的对象永远不会被垃圾回收机制回收弱引用:只要被弱引用关联的对象,当垃圾回收机制触发时,就会清理改内存例子: User user1=new User("Youth",25); //强引用 User user2=user1; user1=null; System.out.println(user2); System.gc(); System.out.println(user2);输出结果:name=Youth,age=25name=Youth,age=25User

2020-07-31 16:29:33 159

原创 FutureTask原理回顾与手写FutureTask

平时大家使用FutureTask主要有以下4个步骤:1.先创建一个Callable子类,在call方法写线程需要执行的代码2.new FutureTask()在构造函数中传递Callable子类3.将该FutureTask交给线程运行4.调用get()方法阻塞等待,一直等到获取到结果为止。public class Test implements Callable<String>{ public static void main(String[] args) throws Execu

2020-07-30 18:00:37 101

原创 将jar包打入本地maven仓库

org.lionsoul ip2region 1.0mvn install:install-file -Dfile=“C:\Users\JF\Desktop\ip2region.jar” -DgroupId=org.lionsoul -DartifactId=ip2region -Dversion=1.0 -Dpackaging=jar

2020-07-29 11:18:18 184

原创 记一次没使用线程池挨批往事

事情是这样的,之前公司项目的一个功能涉及到查询大数据量统计操作,因为大数据量统计操作需要的时间比较长,如果在业务中同步操作该统计操作的话,耗时长,将对用户体验很差,所以呢就需要异步开启多一个线程去执行该统计操作了,这里有两种方案,一种是使用多线程,一种是使用消息队列,我选择的是使用多线程,类似代码如下:Thread thread=new Thread(new Runnable() { @Override public void run() { doXXX(a1,a2); } });

2020-07-28 10:25:05 138

原创 简单描述内存泄漏与内存溢出的区别

内存溢出: 程序在申请内存前的时候,没有足够的内存空间提供 抛出一个异常。内存泄漏: 程序申请内存后,无法被我们垃圾回收机制回收,永远无法释放该内存,造成我们系统的内存浪费。要想解决问题,首先我们先要了解背景,对于内存溢出没有什么好说的,最有效的办法就是加服务器内存。而对于内存泄漏,产生的原因多种多样,有些是程序中写了死循环,导致内存一直增加,对于这问题,找出死循环的代码改掉就好了。有些是定时任务和业务代码放到以一快,我们要知道定时任务的底层实际上就是死循环,加了休眠而已,死循环是很占用内存,所以呢个人

2020-07-26 22:54:50 169

原创 简单描述session共享问题

我这里提供两种解决方案一、使用spring-session框架二、使用token代替session两种方案开展起来都比较容易,个人推荐第二种。不过今天我要讲解的是第一种。1.引入pom <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-red

2020-07-26 16:31:35 78

原创 工具代码

String equid="[“1”,“2”]";List equidList= ArrayJoToList.arrayJoToList(equid);

2020-07-26 16:07:18 76

原创 简简单单自我介绍下

我是一名90后青年18年参加工作,至今已经工作2年多了。希望通过写博客的方式记录自己工作中的成长。 --城市猿

2020-07-26 16:00:22 244

空空如也

空空如也

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

TA关注的人

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