自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 session和cookie

web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。

2023-08-01 21:47:25 229

原创 对比 Exception 和 Error,运行时异常与一般异常有什么区别?

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

2023-02-13 22:11:01 228 1

原创 MySQL——如何正确的显示随机消息

在之前的文章中有介绍order by语句的几种执行模式。考虑如下场景:有一个APP,有一个随机显示英语单词的功能,也就是根据每个用户的级别有一个单词表,然后这个用户每次访问首页的时候,都会随机滚动显示三个单词。会发现随着单词表变大,选单词这个逻辑变得越来越慢,甚至影响到了首页的打开速度。如果要我们来设计这个SQL语句要怎么设计呢?对这个例子进行了简化:去掉每个级别的用户都有一个对应的单词表这个逻辑,直接就是从一个单词表中随机选出三个单词。在这个表里面插入了 10000 行记录。

2023-01-14 20:58:38 653

原创 MySQL——SQL逻辑语句相同但是性能相差巨大?

在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。

2023-01-13 18:00:40 616

原创 MySQL——“order by”是如何工作的

假设目前有这么一个表业务要求是要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄,那么SQL语句可以这么写这个语句用到了order by 这个关键词,那么接下里看看这个语句是如何执行的,以及有什么参数会影响执行的行为。

2023-01-12 20:53:52 497

原创 MySQL——幻读是什么,有什么问题,怎么解决。

这个语句会命中 d=5 的这一行,对应的主键 id=5,因此在 select 语句执行完成后,id=5 这一行会加一个写锁,而且由于两阶段锁协议,这个写锁会在执行 commit 语句的时候释放。由于字段 d 上没有索引,因此这条查询语句会做全表扫描。那么,其他被扫描到的,但是不满足条件的 5 行记录上,会不会被加锁呢?

2022-12-21 21:19:14 487 1

原创 MySQL——保证主从一致

binlog 可以用来归档,也可以用来做主备同步,备库执行了 binlog 就可以跟主库保持一致。

2022-12-16 22:53:00 560

原创 MySQL——count(*)的底层实现以及相关优化

在开发系统的时候,可能需要需要计算一个表的行数这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?但是,会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后可能就想了,MySQL 怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。

2022-12-15 22:35:51 1431 1

原创 网络协议——基于JSON的RESTful接口协议

关于基于 XML 的 SOAP 协议其实使用起来并不简单。对于 SOAP 来讲,无论 XML 中调用的是什么函数,的。但是咱们原来学 HTTP 的时候,我们知道 HTTP 除了 POST,还有 PUT、DELETE、GET 等方法,这些,而且基本满足增、删、查、改的需求,比如增是 POST,删是 DELETE,查是 GET,改是 PUT。

2022-12-15 18:38:46 1363

原创 网络协议——基于xml的SOAP协议

ONC RPC 将客户端要发送的参数,以及服务端要发送的回复,都压缩为一个二进制串,这样固然能够解决双方的协议约定问题,但是存在一定的不方便。首先,需要双方的压缩格式完全一致,一点都不能差。一旦有少许的差错,多一位,少一位或者错一位,都可能造成无法解压缩。当然,我们可以用传输层的可靠性以及加入校验值等方式,来减少传输过程中的差错。其次,协议修改不灵活。如果不是传输过程中造成的差错,而是客户端因为业务逻辑的改变,添加或者删除了字段,或者服务端添加或者删除了字段,而双方没有及时通知,或者线上系统没有及时升级,就

2022-12-15 18:12:40 260

原创 网络协议——RPC协议综述

拿最简单的场景,客户端调用一个加法函数,将两个整数加起来,返回它们的和。如果放在本地调用,那是简单的不能再简单了,。但是一旦变成了远程调用,门槛一下子就上去了。

2022-12-15 17:53:33 753

原创 MySQL——表数据删了一半了,表文件大小还是不变

本篇文章针对 InnoDB 引擎展开讨论。一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,是存在以。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以今天主要讨论的是表数据。

2022-12-15 12:10:38 855

原创 Linux物理内存管理——会议室管理员如何分配会议室

之前学习了站在内存的角度去看内存,看到的都是虚拟内存,这些虚拟内存总是要映射到物理页面的,这一篇文章来学习物理内存是如何管理的。之前学习虚拟内存的时候,当涉及物理内存的映射的时候,总是把内存想象成它是由连续的一页一页的块组成的。我们可以从0开始对物理页编号,这样每个物理页都会有个号。整个物理内存的布局就非常简单、易管理,这就是最经典的平坦内存模型(Flat Memory Model): 由于物理地址是连续的,页也是连续的,每个页大小也是一样的。因而对于任何一个地址,只要直接除一下每页的大小,很容易直接算出在

2022-12-14 18:43:33 304

原创 MySQL——MySQL的flush

有时候会出现这么一种情况:一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。

2022-12-14 12:12:07 830

原创 MySQL——怎么给字符串字段加索引

字符串字段创建索引的场景可以使用的方式有:直接创建完整索引,这样可能比较占用空间;创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引;倒序存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题;创建 hash 字段索引,查询性能稳定,有额外的存储和计算消耗,跟第三种方式一样,都不支持范围扫描。

2022-12-13 22:40:08 408

原创 MySQL全局锁、表锁以及行锁

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。。

2022-12-13 21:44:08 695

原创 Linux的进程空间管理

进程的虚拟地址空间,其实就是站在项目组的角度来看内存,所以我们就从task_struct出发来看。这里面有一个struct mm_struct结构来管理内存。整个虚拟内存空间要一分为二,一部分是用户态地址空间,一部分是内核态地址空间,那这在哪里呢?这就要task_size来定义。对于32位系统,最大能够寻址2^32=4G,其中用户态虚拟地址空间是3G,内核态是1G。对于64位系统,虚拟地址只使用了48位。

2022-12-13 20:45:20 446

原创 网络协议—应用层的HTTPS协议

用 HTTP 协议,看个新闻还没有问题,但是换到更加严肃的场景中,就存在很多的安全风险。例如,你要下单做一次支付,如果还是使用普通的 HTTP 协议,那你很可能会被黑客盯上。例如在点外卖的环境中,发送的网络包可能会被黑客截获,获取到你的银行卡账号以及密码。解决这个问题的思路是加密,分为两种,一种是对称加密(加密和解密用同一个密钥,效率会更高),一种是非对称加密(公钥加密,私钥解密)。

2022-12-13 11:21:11 288

原创 网络协议—应用层的HTTP协议

URL,叫作统一资源定位符。之所以叫统一,是因为它是有格式的。HTTP 称为协议,www.163.com 是一个域名,表示互联网上的一个位置。正是因为这个东西是统一的,所以当你把这样一个字符串输入到浏览器的框里的时候,浏览器才知道如何进 行统一处理。

2022-12-12 20:29:06 564 1

原创 Linux内存管理

平时我们说计算机的“计算”两个字,其实说的就是两方面,第一,进程和线程对于CPU的使用;第二,对于内存的管理。——这个是对计算机的理解的两个大方面,面试中问到的场景设计题可以尝试从这两个角度出发。可以把内存比作是每个公司里面独立封闭的会议室,因为如果不隔离,就会不安全、存在泄露,因而每个进程都应该有自己的进程空间,内存空间都是独立的,相互隔离的,对每个进程来讲看起来应该都是独占的。

2022-12-10 16:12:26 527 1

原创 Linux线程的创建

创建进程的话,调用的系统调用是fork,在copy_process函数里面,会将五大结构 files_struct、fs_struct、sighand_struct、signal_struct、mm_struct都复制一遍,从此父进程 和子进程各用各的数据结构。而创建线程的话,调用的是系统调用clone,在copy_process函数 里面, 五大结构仅仅是引用计数加一,也即线程共享进程的数据结构。

2022-12-10 11:44:23 1735

原创 Linux进程的数据结构

在用户态,应用程序进行了至少一次函数调用。32位和64的传递参数的方式稍有不同,32位的就是用函数栈,64位的前6个参数用寄存器,其他的用函数栈。在内核态,32位和64位都使用内核栈,格式也稍有不同,主要集中在pt_regs结构上。在内核态,32位和64位的内核栈和task_struct的关联关系不同。32位主要靠thread_info, 64位主要靠Per-CPU变量。

2022-12-09 16:34:18 689

原创 Linux进程的创建

fork是一个系统调用,系统调用的流程,流程的最后会在sys_call_table中找到相应的系统调用sys_fork。,sys_fork的定义如下:sys_fork会调用_do_fork,_do_fork的定义如下:复制结构_do_fork里面做的第一件大事就是copy_process,如果所有数据结构都从头创建一份太麻烦了,还不如使用惯用“伎俩”,Ctrl C + Ctrl V。task_struct的结构图如下:copy_process代码具体实现如下:在dup_task_str

2022-12-08 12:10:50 605

原创 Linux进程的调度

目录调度策略与调度类实时调度策略普通调度策略调度类sched_class有几种实现:完全公平调度算法调度队列与调度实体调度类是如何工作的?在Linux里面,进程大概可以分成两种。 一种称为实时进程,也就是需要尽快执行返回结果的那种。另一种是普通进程,大部分的进程其实都是这种。在task_struct数据结论里面有一个成员变量,叫做调度策略:他有以下的几个定义:配合调度策略的,还有优先级,也在task_struct中:优先级其实就是一个数值,对于实时进程,优先级的范围是0~99;对于普通进程

2022-12-04 16:06:30 621

原创 Linux:公司这么多项目,怎么管

在Linux下面,对二进制程序有着严格的格式要求,这就是ELF,这个格式可以根据编译的结果不同,分为不同的格式。在编译的时候,先做预处理工作,例如将头文件嵌入到正文中,将定义的宏展开,然后就是真正 的编译过程,最终编译成为.o文件,这就是ELF的第一种类型,可重定位文件,长这样:要想让函数作为库文件被重用,不能以.o的形式存在,而是要形成库文件,最简单的类型是静态链接库.a文件(Archives),仅仅将一系列对象文件(.o)归档为一个文 件,使用命令ar创建虽然这里libstaticprocess.

2022-12-04 12:28:58 389

原创 redis热点key的解决

1、如果热点key的QPS过高,单机是扛不住的,要做一个(主库用来写,从库用来读),再加一个从库。2、但是如果热key本身的数量是比较少的,可以考虑做一个,可以添加一个本地缓存。本地缓存也是一个最常用的解决方案,既然我们的一级缓存扛不住这么大的压力,就再加一个二级缓存吧。由于每个请求都是由service发出的,这个二级缓存加在service端是再合适不过了,因此可以在服务端每次获取到对应热key时,使用本地缓存存储一份,等本地缓存过期后再重新请求,降低redis集群压力。

2022-11-28 10:18:56 1746

原创 JVM——虚拟机类加载机制

加载.class文件的方法 简而言之,为类的静态变量赋予正确的初始值。如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中,此时才会开始执行Java字节码。即:到了初始化阶段,才开始真正的执行类中定义的Java程序代码。 在加载一个类之前,虚拟机总是试图加载该类的父类,因此父类的总是在子类之前被调用,也就是会先执行父类的静态变量赋值和静态代码块。是否生成 static + final修饰字段的显示赋值操作到底是在哪个阶段进行赋值 被动使用的例子

2022-11-18 13:02:24 383

原创 JVM——内存区域与内存溢出

JVM内存区域学习

2022-11-14 15:55:01 324

原创 Mybatis底层实现学习

1.数据库连接创建,释放频繁造成西戎资源的浪费,从而影响系统性能,使用数据库连接池可以解决问题。2.sql语句在代码中硬编码,造成代码的不已维护,实际应用中sql的变化可能较大,sql代码和java代码没有分离开来维护不方便。3.使用preparedStatement向有占位符传递参数存在硬编码问题因为sql中的where子句的条件不确定,同样是修改不方便4.对结果集中解析存在硬编码问题,sql的变化导致解析代码的变化,系统维护不方便。5、JDBC没有提供缓存,增加了数据库压力。

2022-11-02 13:11:53 770

原创 spring MVC执行流程与源码解析

1、(客户端)浏览器发送请求到DispatcherServlet前端控制器,2、DispatcherServlet前端控制器接收到请求后回去找HandlerMapping处理器映射器3、通过HandlerMapping处理器映射器查找合适(根据request对象)的处理器(也就是controller类)

2022-10-28 18:28:18 469

原创 RabbitMQ 高级特性

接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。设置ConnectionFactory的publisher-confirms="true" 开启 确认模式。失败后,如果设置了rabbitTemplate.setMandatory(true)参数,则会将消息退回给。,手动签收,如果出现异常,则调用。

2022-10-17 15:51:25 122

原创 《MySQL》EXPALIN详解与索引最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。

2022-10-15 13:22:07 616

原创 MySQL实战——为什么MySQL有时候会选错索引

已知MySQL中一张表是可以支持多个索引的,但是我们写SQL语句的时候并没有主动指定使用哪个索引,也就是说使用哪个索引是由MySQL来确定的。所以可能会出现这种情况:本来一句可以执行的很快的SQL语句却由于MySQL选错了索引导致执行的很慢。现在有如下的例子:先建一个简单的表,表里有 a、b 两个字段,并分别建上索引:这个语句很简单,a上有索引,使用索引a,而实质上优化器选择的确实也是索引a。扫描的行数是10001行再做如下操作:session A 开启了一个事务。

2022-10-13 13:08:09 159

原创 MySQL实战—普通索引和唯一索引,应该怎么选

唯一索引、普通索引,怎么选?

2022-10-12 16:01:52 121

原创 spring是如何解决循环依赖的

所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。或者是A 依赖B,B依赖C,C 又依赖A。它们之间的依赖关系如下: 就是单例池,作用就是限制bean在beanFactory中只有一份,为单例bean。 当使用getBean()的时候,先去单例池中看有没有对应的实例,第一次没有就去创建一个实例对象,然后放入一级缓存,后续就可以直接从一级缓存单例池中拿。 只有一级缓存会在存在循环依赖的时候造成死循环的问题。在只有一级缓存的情况下对代码进行了调整,在getbean()之后创建了对象之后就

2022-10-09 17:36:55 462

原创 内置后置PostPocess处理器

在执行代码 this.reader = new AnnotatedBeanDefinitionReader(this);的时候就会往BeanDefinitionMap注册ConfiguarationClassPostProcessor(用于注册配置类的处理器),还会去注册很多其他的用于注解的bean定义(例如解析@Autowired)下一句代码的this.scanner = new ClassPathBeanDefinitionScanner(this);

2022-10-07 17:30:02 377

原创 Ioc容器加载过程-bean生命周期源码解析

的类例的bean定义如ConfigurationClassPostProcessor.class(在这个类中负责解析配置类,会解析加了@Configuration\@Component\@Import等注解)、AutowiredAnnotationBeanPostProcessor.class(这个类会去解析@Autowired)等处理器,这个只是注册这些类,真正去把类解析bean定义的是由他注册的后置处理器去完成的。调用我们的bean工厂的后置处理器。创建扫面读取到的配置类的工具。

2022-09-28 15:35:22 614

原创 spring整体脉络

这里的beanFactory用到了工厂模式的设计模式。配置类的方式有xml文件配置以及注解配置,但是这两种方式读取的信息格式是不一致的,所以有不同的类来读取这些信息例如对XML文件用然后把这些信息放到一个类专门存放这些信息(),这些信息包括类名、作用范围、是否单例等所有生成一个bean对象的信息,再把这交给工厂()去生成对应的对象。在类读取信息的过程中,会有以下的类来辅助读取信息:存放类信息的是放在一个里面,对于不同的类都是由注册放进这个Map中。

2022-09-23 12:44:39 222

原创 mybatis源码体系介绍配置文件解析及源码解析

1.数据库连接创建,释放频繁造成西戎资源的浪费,从而影响系统性能,使用数据库连接池可以解决问题。2.sql语句在代码中硬编码,造成代码的不已维护,实际应用中sql的变化可能较大,sql代码和java代码没有分离开来维护不方便。3.使用preparedStatement向有占位符传递参数存在硬编码问题因为sql中的where子句的条件不确定,同样是修改不方便4.对结果集中解析存在硬编码问题,sql的变化导致解析代码的变化,系统维护不方便。5、JDBC没有提供缓存,增加了数据库压力。

2022-09-21 12:23:23 455

原创 MVCC版本并发控制、bufferpool缓存机制

在MySQL中可重复读隔离级别下保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。这个就是靠机制来保证的。MySQL在读已提交和可重复读的隔离级别下实现了MVCC。

2022-09-07 14:46:08 286

空空如也

空空如也

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

TA关注的人

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