自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

宋同学shl

以前的文章:https://www.cnblogs.com/csushl/

  • 博客(79)
  • 资源 (2)
  • 收藏
  • 关注

原创 Linux学习大纲

2021-12-16 15:49:12 218

原创 @RequestBody和@RequestParam区别

@RequestBody和@RequestParam区别@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)RequestParam可以接受简单类型的属性,也可以接受对象类型。实质是Request.getParameter() 中的Key-Value参数Ma

2021-12-08 11:39:23 217

原创 nginx高性能原因

epoll多路复用BIO(堵塞式IO)缺点: client和server一旦建立连接,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成。select模型缺点: 变更触发轮询查找,有1024数量上限epoll模型好处: 变更触发回调函数直接读取,理论无上限master-worker进程模型允许其做平滑重启和平滑重新加载配置且不会断开与客户端连接管理员: 相当于root用户...

2021-12-07 20:50:10 375

原创 MySQL原理篇 - Buffer pool

数据页、缓存页free链表、 flush链表、 LRU链表Chunk

2021-12-03 08:00:00 638 1

原创 MySQL原理篇 - InnoDB数据页

不同类型的页简介它是InnoDB管理存储空间的基本单位,一个页的大小一般是16KB。InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放undo日志信息的页等等等等。当然了,如果我说的这些名词你一个都没有听过,就当我放了个屁吧~ 不过这没有一毛钱关系,我们今儿个也不准备说这些类型的页,我们聚焦的是那些存放我们表中记录的那种类型的页,官方称这种存放记录的页为索引(INDEX)页,鉴于我们还没有了解过索引是个什

2021-12-02 10:00:00 344

原创 MySQL原理篇 - InnoDB存储引擎架构设计

MySQL

2021-12-01 23:00:00 110

原创 MySQL基础 - DQL、DML、DDL、DCL、TCL

DDL

2021-12-01 18:30:21 232

原创 Redis - 主从复制过程

主从复制的方式从节点复制主节点的数据后,就相当于给主从节点备份了,所谓的有备无患就是这个意思。那么主从复制的原理是怎么样的?其实主要就是三种复制方式:持续复制、全量复制、部分复制。持续复制当有客户端的写命令请求到主节点后,主节点会做两件事:命令传播和将写命令写入到复制积压缓冲区。原理图如下: 命令传播:将写命令持续发送给所有从服务器,保持主从数据一致。这个就可以理解为持续复制了。 复制积压缓冲区:其实就是一个有界队列,保存着最近传播的写命令,而队列里面的每个字节都有一个偏

2021-11-30 21:27:45 1320

原创 消息队列 - 重复消费、顺序消费、分布式事务

消息重复消费消息重复消费是使用消息队列之后,必须考虑的一个问题,也是比较严重和常见的问题我在开发过程中,但凡用到了消息队列,我第一时间考虑的就是重复消费的问题。就比如有这样的一个场景,用户下单成功后我需要去一个活动页面给他加GMV(销售总额),最后根据他的GMV去给他发奖励,这是电商活动很常见的玩法。类似累计下单金额到哪个梯度给你返回什么梯度的奖励这样。我只能告诉你这样的活动页面10000%是用异步去加的,不然你想,你一个用户下一单就给他加一下,那就意味着对那张表就要操作一下,你考.

2021-11-29 19:43:59 354

原创 Spring面试题 - WebMvc总结

1. Web基础回顾1.1 MVC与三层架构对于 MVC 与三层架构而言,这是 Web 开发的基础,小伙伴们一定要熟记于心。1.2 Servlet3.0规范的运行时可插拔性Servlet 3.0 规范的这个运行时可插拔性的特性,它里面定义了一个ServletContainerInitializer的东西,这个ServletContainerInitializer会借助 Java 的 SPI 技术,可以从项目或者项目依赖的 jar 包中,找到一个/META-INF/servi...

2021-11-27 12:30:00 266

原创 Spring面试题 - Dao编程总结

1. JdbcTemplate对于 Dao 编程的部分,在基础的 API 使用中并不会涉及到面试的内容,所以这部分相对比较简单轻松。1.1 JdbcTemplate的设计JdbcTemplate只是一个基于原生 jdbc 的简单封装,它提供了 CRUD 的方法,以及直接执行 SQL 的方法。注意它也仅仅是一个简单的封装,无法与那些 ORM 框架类比。如果小伙伴有学过 DbUtils ,则理解起来会更容易,因为它跟QueryRunner基本上是一样的东西,如果说类比的话也是跟它类比。...

2021-11-26 23:30:00 114

原创 Spring面试题 - AOP总结

1. AOP概念与基础与 IOC 一样,咱先回顾一下 AOP 中涉及到的概念。1.1 AOP概述AOP 面向切面编程,全称 Aspect Oriented Programming ,它是 OOP 的补充。OOP 关注的核心是对象,AOP 的核心是切面(Aspect)。AOP 可以在不修改功能代码本身的前提下,使用运行时动态代理的技术对已有代码逻辑增强。AOP 可以实现组件化、可插拔式的功能扩展,通过简单配置即可将功能增强到指定的切入点。学完整个 AOP 部分后,是不是概述中的这些概念就更容

2021-11-26 20:30:00 934

原创 Spring面试题 - IOC总结

面试题】BeanFactory与ApplicationContext的对比BeanFactory接口提供了一个抽象的配置和对象的管理机制,ApplicationContext是BeanFactory的子接口,它简化了与 AOP 的整合、消息机制、事件机制,以及对 Web 环境的扩展(WebApplicationContext等),BeanFactory是没有这些扩展的。ApplicationContext主要扩展了以下功能:AOP 的支持(AnnotationAwareAspe...

2021-11-26 18:30:00 591

转载 消息队列基础

这三个场景也是消息队列的经典场景,大家基本上要烂熟于心那种,就是一说到消息队列你脑子就要想到异步、削峰、解耦,条件反射那种。异步:我们之前的场景里面有很多步骤都是在一个流程里面需要做完的,就比如说我的下单系统吧,本来我们业务简单,下单了付了钱就好了,流程就走完了。但是后面来了个产品经理,搞了个优惠券系统,OK问题不大,流程里面多100ms去扣减优惠券。后来产品经理灵光一闪说我们可以搞个积分系统啊,也行吧,流程里面多了200ms去增减积分。再后来后来隔壁的产品老王说:下单成功后我们要给用户

2021-11-25 22:13:57 66

原创 Redis - 跳跃表

一、跳跃表简介跳跃表(skiplist)是一种随机化的数据结构,由William Pugh在论文《Skip lists: a probabilistic alternative to balanced trees》中提出,是一种可以与平衡树媲美的层次化链表结构——查找、删除、添加等操作都可以在对数期望时间下完成,以下是一个典型的跳跃表例子:我们在上一篇中提到了 Redis 的五种基本结构中,有一个叫做有序列表 zset的数据结构,它类似于 Java 中的SortedSet和Hash...

2021-11-24 23:08:45 104

原创 Redis - 系列-Redis哨兵、持久化、主从、手撕LRU

为啥Redis那么快?Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。它的,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1); 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的; 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线

2021-11-24 23:07:14 150

原创 Spring - IOC基础-依赖查找高级&BeanFactory与ApplicationContext

1. 依赖查找的多种姿势【掌握】1.1 ofType试想,如果一个接口有多个实现,而咱又想一次性把这些都拿出来,那getBean方法显然就不够用了,需要使用额外的方式。回到basic_dl包下,咱新创建一个oftype的包,来测试ofType的查找方式。1.1.1 声明Bean+配置文件声明一个DemoDao,并声明 3 种对应的实现类,分别模拟操作 MySQL 、Oracle 、Postgres 数据库的实现类:对应的配置类,也把这几个 Bean 都注册上:...

2021-11-24 20:30:00 353

原创 JSON Web Token

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。一、跨域认证的问题互联网服务离不开用户认证。一般流程是下面这样。1、用户向服务器发送用户名和密码。2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。3、服务器向用户返回一个 session_id,写入用户的 Cookie。4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。5、服务器收到 ses

2021-11-24 20:07:35 100

原创 Spring - SpringFramework概述与IOC的依赖查找

1. SpringFramework概述【了解】1.1 官方网站主页引用官方网站主页的说明,Spring 官方对 SpringFramework 的描述是这样的:spring.io/projects/sp…The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of

2021-11-24 08:00:00 306

原创 Spring - IOC是怎么来的

1. 原生Servlet时代的三层架构下面咱实际动手搭建一个在原生 Servlet 时代的 MVC 三层架构的工程,以此为背景板。(为方便后续内容演示,使用 IDEA 创建工程前,先创建一个空工程spring-framework-projects,用来存放接下来的所有工程)1.1 构建基于Maven的原生Servlet工程使用 Maven 构建项目那是最基本的能力了,咱使用 IDEA 快速搭建一个原生的 Servlet 工程。pom 依赖中,只需要引入 Servlet 的 api 即..

2021-11-24 02:00:00 435

原创 MySQL进阶 - InnoDB数据页结构

不同类型的页简介前边我们简单提了一下页的概念,它是InnoDB管理存储空间的基本单位,一个页的大小一般是16KB。InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放undo日志信息的页等等等等。当然了,如果我说的这些名词你一个都没有听过,就当我放了个屁吧~ 不过这没有一毛钱关系,我们今儿个也不准备说这些类型的页,我们聚焦的是那些存放我们表中记录的那种类型的页,官方称这种存放记录的页为索引(INDEX)页,

2021-11-23 09:00:00 220

原创 MySQL进阶 - InnoDB记录存储结构

InnoDB页简介InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要一条一条的把记录从磁盘上读出来么?不,那样会慢死,InnoDB采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,Inn

2021-11-22 21:00:00 247

原创 分布式事务方案

文章什么是分布式事务?分布式对应的是单体架构,互联网早起单体架构是非常流行的,好像是一个家族企业,大家在一个家里劳作,单体架构如下图:但是随着业务的复杂度提高,大家族人手不够,此时不得不招人,这样逐渐演变出了分布式服务,互相协作,每个服务负责不同的业务,架构如下图:分布式架构因此需要服务与服务之间的远程协作才能完成事务,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分 事务、创建订单减库存事务,银行转账事务等都是分布式

2021-11-21 19:00:00 254

原创 MyBatis - 基本注解的使用

0. 工程搭建还是一样,我们先来搭建一个新的工程mybatis-04-annotation,从上一个工程中把文件都复制粘贴过来,精简一下。精简的代码,只需要精简一下mybatis-config.xml即可:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://m...

2021-11-21 02:00:00 875

原创 MyBatis - mapper.xml的解析机制

最后一个节点的解析是 mapper ,也就是解析 MyBatis 全局配置文件中,引入的 mapper.xml 的那些路径。而这里面的解析,都是使用一个XMLMapperBuilder的 API 完成的。:private void mapperElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : parent.getChildren()) { ..

2021-11-20 21:00:00 1013 3

原创 MyBatis - mapper动态SQL的设计

1. select我们还是先来说最重要的 select ,这里面编写的都是查询语句,并且编写的 SQL 中可以根据需求,设置需要传入的参数占位符,以及动态 SQL 。下面我们先来举几个例子:1.1 简单SQL之前我们编写的findById,对应的 SQL 就非常简单:select * from tbl_department where id = #{id}这里面唯一一个动态的部分就是#{id},它代表的是从参数中取一个名为id的值(当然如果 parameterType 为...

2021-11-20 11:30:00 806

原创 MyBatis - mapper映射文件详解

0. 工程搭建照例,我们还是先来搭建一个新的工程,前面的configuration工程中已经有点乱了。工程名我们就叫它mybatis-03-mapper吧,导入的依赖跟之前一样,然后精简一下之前的代码。拷贝完成后的工程结构及文件应该是这样的:里面大部分的代码都是不用变的,只需要把 MyBatis 全局配置文件精简一下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration ...

2021-11-20 07:00:00 1407

原创 MyBatis - 全局配置文件的加载机制

代码的调试,我们可以使用上一章的任意一个测试代码作为 Debug 载体,本章我们研究的其实是这两句代码: InputStream xml = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(xml);也就是如何加载 MyBatis 全局配置文件,以及如何由全局配置文件构建出S.

2021-11-19 21:00:00 290

原创 MySQL进阶 - 字符集和比较规则

字符集和比较规则简介字符集简介我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了,建立这个关系最起码要搞清楚两件事儿: 你要把哪些字符映射成二进制数据? 也就是界定清楚字符范围。 怎么映射? 将一个字符映射成一个二进制数据的过程也叫做编码,将一个二进制数据映射到一个字符的过程叫做解码。 人们抽象出一个字符集的概念来描述某个字符范围的编码规则。比方说我们来自定义一个名称为xiaohaizi的字符集,它包含的字符范围和编码规则如

2021-11-19 20:00:00 346

原创 MySQL进阶 - MySQL是怎样运行的

MySQL的客户端/服务器架构以我们平时使用的微信为例,它其实是由两部分组成的,一部分是客户端程序,一部分是服务器程序。客户端可能有很多种形式,比如手机APP,电脑软件或者是网页版微信,每个客户端都有一个唯一的用户名,就是你的微信号,另一方面,腾讯公司在他们的机房里运行着一个服务器软件,我们平时操作微信其实都是用客户端来和这个服务器来打交道。比如狗哥用微信给猫爷发了一条消息的过程其实是这样的: 消息被客户端包装了一下,添加了发送者和接收者信息,然后从狗哥的微信客户端传送给微信服务器; 微

2021-11-19 19:00:00 817

原创 Spring中间件 - 什么是中间件

一、前言在互联网应用开发初期,所有用于支撑系统建设的,框架结构、基础工具、业务逻辑、功能服务包括页面展示等,都是在一个系统中开发完成,最终也只是把系统和数据库部署在同一台服务器上。但随着互联网应用的发展,业务体量逐渐增大,那么原有的系统搭建就很难支撑起现有的业务体量。因此开始陆续出现应用与数据库分离、Nginx 反向代理、缓存组件、分组部署、RPC 分布式应用、网关服务、监控系统等等。在这些系统的架构的演进过程中,不断的出现各类支撑起服务建设升级的系统和中间件。在中间件这一层的建设,基本是来自.

2021-11-19 18:27:54 4731

原创 MyBatis配置-全局配置文件详解

0. 工程搭建我们还是先来搭建一个新的工程吧,跟之前的区分一下。工程名我们就叫它mybatis-02-configuration吧,导入的依赖跟上一章一样,然后把上一章的那些代码原样拷贝下来,我们继续拿来用。拷贝完成后的工程结构及文件应该是这样的:OK ,我们开始学习。全局配置文件一览MyBatis 的全局配置文件,自上而下的编写内容如下:properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器)..

2021-11-19 01:00:00 2933

原创 MySQL基础 - 触发器和事件

触发器我们使用MySQL的过程中可能会有下边这些需求: 在向t1表插入或更新数据之前对自动对数据进行校验,要求m1列的值必须在1~10之间,校验规则如下: 如果插入的记录的m1列的值小于1,则按1插入。 如果m1列的值大于10,则按10插入。 在向t1表中插入记录之后自动把这条记录插入到t2表。 也就是我们在对表中的记录做增、删、改操作前和后都可能需要让MySQL服务器自动执行一些额外的语句,这个就是所谓的触发器的应用场景。创建触发器我们看一下定义触发器的语句:

2021-11-18 10:00:00 1913

原创 MySQL基础 - 游标的使用

游标简介截止到现在为止,我们只能使用SELECT ... INTO ...语句将一条记录的各个列值赋值到多个变量里,比如在前边的get_score_data存储过程里有这样的语句:SELECT MAX(score), MIN(score), AVG(score) FROM student_score WHERE subject = s INTO max_score, min_score, avg_score;但是如果某个查询语句的结果集中有多条记录的话,我们就无法把它们赋值给某些变量了~ 所

2021-11-18 01:00:00 2651 1

原创 MySQL基础 - 自定义变量和语句结束分隔符

存储程序有时候为了完成一个常用的功能需要执行许多条语句,每次都在客户端里一条一条的去输入这么多语句是很烦的。设计MySQL的大叔非常贴心的给我们提供了一种称之为存储程序的东东,这个所谓的存储程序可以封装一些语句,然后给用户提供一种简单的方式来调用这个存储程序,从而间接地执行这些语句。根据调用方式的不同,我们可以把存储程序分为存储例程、触发器和事件这几种类型。其中,存储例程又可以被细分为存储函数和存储过程。我们画个图表示一下:别看出现了很多陌生的概念,别怕,我们后边会各个击破的。不过.

2021-11-17 19:12:40 1326

原创 MySQL基础 - 连接查询

再次认识关系表我们之前一直使用student_info和student_score两个表来分别存储学生的基本信息和学生的成绩信息,其实合并成一张表也不是不可以,假设将两张表合并后的新表名称为student_merge,那它应该长这样:student_merge表number name sex id_number department major enrollment_time subject score 20180101 杜子腾 .

2021-11-14 07:45:00 681

原创 Redis 如何高效实现点赞、取消点赞功能

前言基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储。点赞功能在很多系统中都有,但别看功能小,想要做好需要考虑的东西还挺多的。点赞、取消点赞是高频次的操作,若每次都读写数据库,大量的操作会影响数据库性能,所以需要做缓存。至于多久从 Redis 取一次数据存到数据库中,根据项目的实际情况定吧,我是暂时设了两个小时。项目需求需要查看都谁点赞了,所以要存储每个点赞的点赞人、被点赞人,不能简单的做计数

2021-11-14 00:00:00 963 4

原创 Reids五种数据类型的底层实现

一、Redis的数据结构简单来说,五个基本数据类型在Redis中以这样的数据结构存在,下图所示:二、String2.1 String的底层实现(SDS)String的底层是由一个叫简单动态字符串实现的,Simple Dynamic String,简称SDS,在Redis的数据结构中大概长这个样子:注意:一个String最大容量是512M。看一下Reids中的源码,就和上图对上了len:表示 SDS 的长度,这样获取字符串长度的时间复杂度就是O(1),而不是

2021-11-13 21:32:35 608

原创 Redis的数据类型及其应用场景

Redis是一个支持多语言NoSql数据库,提供多种API,本文会从Redis的命令角度进行讲解。这些命令都是单线程操作的,不用担心线程安全问题,基于内存操作加IO多路复用,存取数据快。以下讲解基于redis-6.2.6实现。不同版本的命令可能稍有差异,大家可以去Redis官网查看。官网地址:https://redis.io/commands一、String简介String底层由int、emstr、raw实现,是Reids最基本的数据类型,一个key对应一个value,可以包含任何数据,每个

2021-11-13 21:32:12 119

原创 MySQL基础 - 子查询

多表查询的需求截止到目前为止我们介绍的查询语句都是作用于单个表的,但是有时候会有从多个表中查询数据的需求,比如我们想查一下名叫'杜琦燕'的学生的各科成绩该怎么办呢?我们只能先从student_info表中根据名称找到对应的学生学号,然后再通过学号到student_score表中找着对应的成绩信息,所以这个问题的解决方案就是书写两个查询语句:mysql> SELECT number FROM student_info WHERE name = '杜琦燕';+----------+| num

2021-11-13 20:00:00 389

OI国家集训队论文集1999~2015.rar

OI国家集训队论文集1999~2015

2021-10-13

BZOJ上面的题目以及数据

BZOJ题目以及数据

2021-10-13

空空如也

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

TA关注的人

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