自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (3)
  • 收藏
  • 关注

原创 从原理到代码一步步教你手写实现自定义迷你版SpringBoot

文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结一、需求及实现原理SpringBoot简而言之就是为了简化Spring应用开发而出现的一种框架(基于Spring4.0开发)。其约定优于配置的思想大大减少了XML配置项。我们实现自定义的SpringBoot需求很简单,就是完成Tomcat的启动,整合SpringMVC(注册DispatcherServlet前端控制器,自动扫描Bean组件)。我们抽取出两个问题进行具体分析:...

2021-03-09 12:58:44 644 4

原创 为什么三次异或可以交换两个数?一文教你明白【异或】操作

异或,英文为exclusive OR,缩写成xor,用符号⊕表示百度百科有具体介绍:异或_百度百科如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。这个运算属于二进制中的运算规则。最重要的一点是可以把异或操作认为是不带进位的二进制加法。例如:0 0 1 0 1 1 0 0^ 0 1 0 0 0 1 1 1 = 0 1 1 0 1 0 1 1...

2022-01-14 16:00:32 2588 1

原创 基于MyBatis插件开发SQL日志记录功能

在新项目中有个需求,需要记录下增删改的SQL并落表。一般考虑到的是需要利用Spring的AOP,抽取日志记录的功能,在持久层操作的时候进行统一增强。项目用到的持久层框架是MyBatis,那么直接想到的就是利用MyBatis的插件机制对执行的SQL进行记录。那么具体如何实现呢?原理又是什么?读了这篇文章的小伙伴就可以搞清楚啦。一、MyBatis插件介绍MyBatis大家都比较熟悉,实际使用也非常广泛,其内部提供了插件扩展机制来拦截SQL的执行。其执行原理如下图所示:SQL执行...

2021-09-17 17:33:41 879

原创 高并发系统三大利器之缓存(原理到应用场景)

一、高并发系统三大利器保护高并发系统的三大利器:限流、熔断降级、缓存。限流是指在面临瞬时巨大流量访问系统时(商品秒杀等)为了保证系统的可用性的一个限制手段。熔断降级一般一起使用,是为了在某些大流量业务场景(双11双12等)下保证核心业务可用的解决方案。(降级是主动的,熔断是被动的。熔断是指当上游服务调用下游服务出现不可用时,暂时切断请求,防止系统雪崩;降级是指某些情况下保证核心业务,将边缘业务服务暂时关闭。)缓存是为了缓解数据库的查询压力,对某些热点数据和核心业务数据添加缓存层进行访问...

2021-09-02 10:34:55 1185

原创 TCP的三次握手和四次挥手你真的明白了吗

图片来源:百度百科一、OSI七层模型、TCP/IP四层模型、五层体系结构之间的联系1.1 OSI七层模型OSI七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。1.2 TCP/IP四层模型TCP/IP是一个四层的体系结构,主要包括:应用层、运输层、网际层和网络接口层。从实质上...

2021-08-04 10:52:44 289

原创 讲讲Redis中的分布式一致性协议

Redis是什么

2021-07-15 11:10:39 1731

原创 基于Java实现LRU算法

目录一、什么是LRU二、 选用LinkedHashMap实现一、什么是LRULRU是指最近最少使用,是一种缓存淘汰算法。根据数据的历史访问记录来进行淘汰数据,把最近一次使用时间离现在时间最远的数据删除掉,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。以下摘自百度百科:LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问...

2021-07-08 16:31:41 1534 1

原创 高并发系统三大利器之限流

目录一、高并发系统三大利器二、限流算法2.1 固定窗口算法(Fixed Window)2.2 滑动窗口算法(Sliding Window)2.3 漏桶算法(Leaky Bucket)2.4 令牌桶算法(Token Bucket)2.5 漏桶和令牌桶算法的对比三、限流算法应用场景3.1 Google Guava3.2 SpringCloudGateway3.3 Alibab Sentinel一、高并发系统三大利器保护高并发系统的三大利器:限流、熔...

2021-06-23 12:14:50 735

原创 从BIO到NIO到Netty,从阻塞IO到Reactor模型深度剖析Netty核心原理(干货)

很想写一篇关于Netty的剖析,但是只写Netty有些童鞋可能会一脸懵,这篇文章从浅入深,从BIO到NIO讲了个透彻,最后再讲到Netty底层原理,期间也是翻阅资料,也算是自己对相关知识的总结和复习吧~~1、什么是I/O模型?什么是BIO NIO AIO?三者有什么区别?2、AIO性能更好,为什么Netty不使用AIO?3、Redis、Nginx等为什么这么快?4、Netty相比NIO有何优势?底层如何实现?这些问题希望看完这篇文章之后都能找到答案~~目录一、I/O模型1..

2021-06-21 17:49:32 221

原创 MongoDB和MySQL底层索引实现原理分析及比较

一、索引类型创建索引是为了提高数据的检索速度。这里只针对类似的索引类型做一个比较,并不包含所有的索引类型。MongoDB MySQL 单键索引:单个字段建立索引。(过期索引TTL,必须是日期类型,类似Redis中的过期key) db.集合名.createIndex({"字段名":排序方式}) 普通索引:普通字段建立索引,没有任何约束。 CREATE INDEX ON tablename (字段名); 复合索引:基于多个字段的索引 db.集合名.create...

2021-06-15 15:02:41 1309 2

原创 MySQL多维度性能优化

一、四个优化维度既然谈到优化,一定想到要从多个纬度进行优化,作为一个合格的程序员或者DBA,问题一定要多方位进行考虑。这里总结了四个维度,当然SQL语句相关的优化手段一定是最为重要的。这里的优化维度有四个:SQL语句及索引、表结构设计、系统配置、硬件配置。二、硬件配置硬件方面的优化可以对磁盘进行扩容、将机械硬盘换为SSD。这个优化手段成本最高,带来的成本却是最高的。这个不再作过多的赘述。三、系统配置3.1 系统选择系统通常使用Linux作为服务端的系统,本地开发的话可以随..

2021-06-02 09:15:25 360

原创 一篇文章深度剖析Nginx(安装、配置、底层机制)

目录一、Nginx基础1.1 什么是Nginx1.2 Nginx的安装二、Nginx核心配置解读2.1 全局块2.2events块2.3 http块三、反向代理3.1 反向代理与正向代理的区别3.2 Nginx反向代理服务配置四、负载均衡4.1 轮询(默认)4.2 权重(weight)4.3 IP哈希(ip_hash)五、动静分离六、Nginx底层进程机制6.1 Master和Worker线程6.2 reload热加载原理6...

2021-05-20 15:46:40 388

原创 从原理到代码教你使用BIO(ServerSocket)手写Tomcat

一、Tomcat介绍1. 概念Tomcat 是一个实现了Servlet规范的、开源的轻量级Web应用服务器。Servlet规范:Java Applet(Java服务端小程序),是JavaEE的一套用于处理Web请求的规范(接口),位于 javax.servlet.Servlet。简单来说Tomcat实现了Servlet规范,2. Tomcat结构3....

2021-05-17 14:47:56 244

原创 记录一次SpringBoot跨域的踩坑经历——SpringSecurity跨域解决方案(/oauth/token 401)

项目场景:目前在重构一个导购后端系统,我负责用户的模块和登录鉴权的整个业务的架构设计和代码编写利用SpringBoot + SpringSecurity + Oauth2完成了简单的登录和鉴权登录功能:首先需要调用/oauth/token接口,根据用户名密码获取toke,拿到token后将token放入请求头Header中再去请求其它接口。接口开发完成并使用Postman测试通过,再由前端去画页面联调接口。问题描述:问题就出现在了前端接口联调这里,前端是用Vue完成的,安装好Node

2021-04-23 13:10:52 2346 3

原创 从传统单体架构定时任务到分布式调度任务的演进之路(从Quartz到Elastic-Job代码实现)

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工...

2021-03-25 15:31:31 344 1

原创 Spring中AOP源码浅析③

结合Spring中AOP源码浅析①Spring中AOP源码浅析②这两篇文章我们知道AOP的实现其实是通过引入AnnotationAwareAspectJAutoProxyCreator这个类(注解感知AspectJ自动代理创建器 BeanName:org.springframework.aop.config.internalAutoProxyCreator)去实现的。实际他的底层也是一个InstantiationAwareBeanPostProcessor后置处理器。结合两篇文章,简单画一下它的实现过...

2020-12-31 11:27:02 106

原创 Spring中AOP源码浅析②

上一篇文章Spring中AOP源码浅析①讲到AOP中实际是通过BeanPostProcesser后置处理器实现的。后置处理器就是在Bean初始化前后进行拦截调用。那么我们的后置处理器是如何加载和初始化呢?(后置处理器是一类特殊的Bean)猜想一下,肯定是在普通单例Bean之前进行加载和初始化操作,只有先加载了处理器才能通过处理器去拦截Bean。那么我们就从Bean的加载这一步看源码是如何实现的。还是使用Spring中AOP的使用这篇文章的代码运行调试。(测试类、配置类MainConfig、业务类

2020-12-29 16:45:53 108

原创 Spring中AOP源码浅析①

上篇文章Spring中AOP的使用讲到@EnableAspectJAutoProxy这个注解开启AOP,这个注解里面又引入了AspectJAutoProxyRegistrar(AspectJ自动代理注册类)这个类。继续跟进源码,AspectJAutoProxyRegistrar是实现了ImportBeanDefinitionRegistrar这个接口,这个接口在Spring注入Bean的四种方式,看这一篇就够了这篇文章有提到,使用RootBeanDefinition创建Bean的定义,然后通过BeanD

2020-12-28 16:07:23 103 1

原创 Spring中AOP的使用

AOP是面向切面编程。是指通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。简单来讲就是不改变原来业务代码的情况下给程序动态的添加功能的一种技术。例如通过AOP进行 日志记录、异常处理、事务处理等。引入依赖包:spring-aspects<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId>

2020-12-28 14:09:01 102

原创 Spring装配注解@Autowired@Resource@Qualifier@Inject@Primary傻傻分不清

@Controller、@Service、@Repository、和 @Component 的效果是一样的,都是为了让Spring容器统一管理,主要是为了业务区分。跟进源码看,其实都是@Component@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Controller { /** * The value may indicat

2020-12-24 18:49:28 123 1

原创 聊一聊SpringBean的生命周期——创建、初始化、销毁。

Bean的生命周期是指Bean的创建、初始化、销毁的过程。Bean的生命周期是由Spring的Ioc容器进行管理的。Bean的创建详细过程请看我之前的文章:Spring注入Bean的四种方式,看这一篇就够了

2020-12-24 10:50:49 360

原创 Spring注入Bean的四种方式,看这一篇就够了

1.通过xml配置注入bean

2020-10-22 10:29:51 2614 2

原创 多线程相关基础

什么是进程(Process)和线程(Thread)?进程是资源分配的最小单位,线程是CPU调度的最小单位。这个回答大家都知道,但是过于抽象。如果面试中问到,面试官并不是想让你重复这句话,他想要的是结合自己的理解进行解释说明。进程(Process),从英文角度来讲Process不仅是进程,也是过程,拿到计算机里面来解释就是一段程序的执行过程。例如,当我们打开计算机,运行QQ的时候,是把QQ.exe这个程序从外存拿到了内存去运行,此时就会产生一个进程。当启动一个进程的时候,至少会启动一个主线程(Main

2020-09-24 16:24:11 49

原创 记录一次本地开发环境JWT生成失效导致无法登陆的问题

首先确保所有相关的服务都启动成功,在启动Nginx后打开登录页,发现登陆失败,登录后出现操作失败的提示,重新登陆还是这个问题,F12->Network查看网络请求http://localhost/oauth2-channel/oauth2/code2token这个请求返回{"code":"9999","msg":"失败","data":"426 "}...

2020-09-08 14:56:49 449

转载 MySQL循环存储过程的写法

创建 MySQL 存储过程的简单语法为:CREATE PROCEDURE 存储过程名称( [in | out | inout] 参数 ) BEGIN Mysql 语句 END几个循环语句的格式如下:WHILE……DO……END WHILEREPEAT……UNTIL END REPEATLOOP……END LOOPGOTO。1.while 循环:delimiter $$    // ...

2018-02-24 10:06:12 2193

原创 MySQL和Oracle关于重复数据的操作(查找、删除)

假设有employee这张表,其中emp_name可能有重复,以下是MySQL和Oracle中关于重复数据的删除查找操作查询重复数据:Oracle、MySQLselect * from employee group by emp_name having count (*)>1;查询可以删除的重复数据:Oracle:select t1.* from

2017-11-03 10:08:32 566

原创 Centos7安装MariaDB

Centos7将默认的数据库换成了MariaDB。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。 过去一年中,大型互联网用户以及Linux发行商纷纷抛弃MySQL,转投MariaDB阵营

2017-11-03 08:19:40 293

原创 SQL优化

1.对查询进行优化,要尽量避免全表扫描,在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样

2017-11-02 14:30:43 163

原创 Linux常用命令

最近都在和Linux打交道,面试中也经常会问到,我这里总结了一些常用的命令。系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm

2017-10-27 16:07:16 190

原创 Java操作MongoDB

MongoDB中常用的增删改查操作1.查询集合中的文档//创建MongoDB连接,ip+端口Mongo mongo = new Mongo("localhost",27017);//使用test库DB db = mongo.getDB("test");//使用persion集合DBCollection collection = db.getCollection("pers

2017-10-16 20:30:52 375

转载 HashMap、HashSet和HashTable的区别与联系

HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 HashMap 来实现的。 实际上,Ha

2017-09-22 07:38:24 925

转载 Java中Jedis操作Redis

一、常用数据类型简介:      Redis常用五种数据类型:string,hash,list,set,zset(sorted set).1.String类型String是最简单的类型,一个key对应一个valueString类型的数据最大1G。String类型的值可以被视作integer,从而可以让“INCR”命令族操作(incrby、decr、decrby)

2017-09-18 21:18:00 827

转载 Hibernate的缓存机制

Hibernate缓存的作用:Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据Hibernate缓存分类:Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存H

2017-09-14 16:51:11 150

转载 Hibernate中的三种状态

1.瞬时状态 (Transient)也被称作临时态。当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下: Customer customer=new Customer(“zx”,27,images);这时customer对象就处于自由状态,为什么说customer对象处于自由状态呢?这是因为,此时customer只是通过JVM获得了一块内

2017-09-13 07:56:45 145

转载 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?

转自知乎@唐思只讲原理,不讲过程。大多数面向对象编程语言,在调用一个类的时候,先要实例化这个类,生成一个对象。如果你在写一个类,过程中要调用到很多其它类,甚至这里的其它类,也要“依赖”于更多其它的类,那么可以想象,你要进行多少次实例化。这就是“依赖”的意思。依赖注入,全称是“依赖注入到容器”, 容器(IOC容器)是一个设计模式,它也是个对象,你把某个类(不管有多少依赖关系)放入这个容器

2017-09-12 19:27:36 1113

mongo-2.10.1.jar

mongo-2.10.1.jar mongodb 2.10.1版本的jar包,用于操作MongoDB

2017-10-16

冰枫_进程保护

冰枫_进程保护

2015-04-05

易幽模块Vc2.7

易幽模块Vc2.7

2015-04-05

空空如也

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

TA关注的人

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