自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java导出请求头

java导出

2022-12-03 13:03:25 561 1

原创 Comparator.comparing 排序

排序

2022-11-05 20:05:52 1219

原创 MySQL的查询访问方式

Mysql查询方式

2022-08-13 13:00:47 447

原创 锁执行的过程

数据库锁详细分析

2022-08-07 17:22:42 367

原创 语句加锁分析

Select锁

2022-08-06 00:14:15 163

原创 Spring事务的传播机制

Spring事务的传播机制

2022-07-31 14:38:55 329

原创 不同的操作加不同的锁详解

不同的操作加不同的锁详解。

2022-07-31 13:40:01 202

原创 Mybatis---动态sql

insert动态sql<insert id="saveUser"> INSERT INTO user_table //表明会在前后自动补上()且结尾是,则会帮我们删除 <trim prefix="(" suffix=")" suffixOverrides=","> <if test="nickname != null"> nickname,

2022-04-29 09:32:33 201

原创 SpringAOP----捕捉异常存进数据库,方便找到问题

在日常开发的时候,有时候会出错,这个时候如果去看日志,会有一大堆日志查找很困难,所以就用spring的Aop来捕捉异常,存进数据库切入点加上一些信息,方便更加快速定位错误信息@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})@Documentedpublic @interface LogAnnotation { /** * 模块 */ public

2022-04-27 09:39:13 1421

原创 SpringAOP----Token校验以及Token续签的操作

首先我们知道在登录状态下要保存Token,当进行操作的时候我们要去判断Token是否存在,所以这里写了一个简单的判断Token的方法定义切入点还是用注解作为切入点,个人认为用注解作为切入点是最好,最方便的一种方法@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})public @interface TokenAnnotation {}具体的方法体 //切入点表达式

2022-04-27 09:08:21 841

原创 力扣70-爬楼梯 DP+滚动数组

因为每次都只能跳两格,所以后面一格等于前面两格之和class Solution { public int climbStairs(int n) { int p1 = 1; int p2 = 1; for(int i = 2 ; i <= n ; i++) { int p = p1; p1 = p2; p2 = p+p1; } return.

2022-04-06 23:08:02 73

原创 用Spring AOP和springboot的全局异常捕捉器写简单的权限认证

AOP//定义一个注解作为切入点,不同角色有不同权限,以此来判断是否用有该权限@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})public @interface PermissionToCheck { UserTypeEnum type() default UserTypeEnum.ALL;}枚举类型public enum UserTypeEnum { AD

2022-03-30 20:57:57 574

原创 操作系统---内存虚拟化

什么是虚拟内存?虚拟内存就是说,让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。虚拟内存使用部分加载的技术,让一个进程或者资源的某些页面加载进内存,从而能够加载更多的进程,甚至能加载比内存大的进程,这样看起来好像内存变大了,这部分内存其实包含了磁盘或者硬盘,并且就叫做虚拟内存。虚拟内存的实现方式有哪些?虚拟内存中,允许将一个作业分多次调入内存。采用连续分配方式时,会使得一部分内存空间都处于暂时或永久的空间状态,早餐内存资源的严重浪费,也无法从逻辑上扩大内存容量。因此,虚拟内存的

2022-03-29 21:57:06 2087

原创 HashMap面试题

HashMap1.HashMap的底层结构是什么?● 在JDK1.7中,底层数据结构是数组+链表● 在JDK1.8中,底层数据结构是数组+链表+红黑树2.JDK1.8中什么情况下,链表会转变为红黑树?● 当数组长度大于64且链表节点个数大于8时才会转变为红黑树,如果链表节点个数小于6则又会退化为链表● 在链表转换为红黑树前面会进行判断,如果数组长度小于64,则会优先选择扩容。3.为什么在解决 hash 冲突的时候,不直接用红黑树?而选择先用链表,再转红黑树?● 因为红黑树需要进行

2022-03-18 16:21:11 576

原创 JDK8--HashMap详解

Java8 HashMapJava8 对 HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+红黑树 组成。根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为 O(n)。为了降低这部分的开销,在 Java8 中,当链表中的元素达到了 8 个时,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(lo

2022-03-18 15:27:05 1071

原创 AQS----tryAcquire和tryRelease(int)详解

独占式同步状态获取与释放独占式同步状态获取● tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false。● tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false。#acquire(int arg) 方法,为 AQS 提供的模板方法。该方法为独占式获取同步状态,但是该方法对中断不敏感。也就是说,由于线程获取同步状态失败而加入到 CLH 同步队列中,后续对该线程进行中断操作时,线程不会从 CLH 同步队列中移除。代码如下

2022-03-11 15:20:51 1396

原创 内存屏障的底层原理

锁在保证可见性的方法:刷新处理器缓存和冲刷处理器缓存。刷新处理器缓存:保证了该锁的当前持有线程能够读取到前一个线程对这些数据所做的更新 冲刷处理器缓存:保证了该锁的持有线程对这些数据所做的更新对该锁的后续持有线程可见。java虚拟机实际上是借助内存屏障来实现上述的两个动作。内存屏障是被插入到两个指令之间进行使用的,其作用是禁止编译器、处理器重排序从而保障有序性。按照可见性保障来划分,内存屏障可分为加载屏障(Load Barrier)和存储屏障(Store Barrier)。 加载屏障的作

2022-03-08 10:49:22 1328 3

原创 AQS底层CLH同步队列的底层----源码解析

队列同步器AQS(AbstractQueuedSynchronizer)源码解析public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { //指向队列中的头节点 private transient volatile Node head; //指向队列中的尾部节点 private tra

2022-03-06 21:47:48 804

原创 synchronized的实现原理与应用---锁升级的过程

synchronized的实现原理与应用synchronized的同步基础:Java中的每一个对象都可以作为锁。对于普通同步方法,锁是当前实例对象 对于静态同步方法,锁是当前类的Class对象对于同步代码块,锁是Synchonized括号里配置的对象 static synchronizedTest instance=new synchronizedTest(); public void run() { synchronized(instance){

2022-03-05 16:37:54 516

原创 IP数据报的格式以及分片细节

IPv4网络数据报格式版本号(4bit):规定了数据报的IP协议版本。通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分。 首部长度(4bit): 因为一个IPv4数据报可包含一些可变数量的选项(这写选项包括在IPV4数据报首部中),故需要用这4bit来确定IP数据报中载荷(例如在这个数据报中被封装的运输层文段)实际开始的地方。服务类型TQS(区分服务)8bit:使不同类型的IP数据包能相互区别开来 总长度(16bit):IP数据报的总长度(首部+数据载荷),最大长度为65535字节。

2022-03-03 16:43:06 5504

原创 TCP三次握手和四次挥手

TCP的连接建立(三次握手)客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不应包含应用层数据。但是在报文段的首部中的一个标志位(SYN比特)置为1。因此这个特殊报文段被称为SYN报文段。另外客户端会随机选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN报文段的序号字段中,并发送给服务器。 一旦包含TCP SYN报文段的IP数据报到达服务器主机,服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TC

2022-03-02 17:15:18 1536

原创 TCP---拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况称之为拥塞。 若出现拥塞而不进行控制,整个网络的吞吐量将随着输入负荷的增大而下降。TCP采用的方法是:让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。TCP的拥塞控制算法( 慢启动,拥塞避免,快重传,快恢复)发送方维护了一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化 拥塞窗口cwnd的维护原则:只要网络没有出现阻塞,拥塞窗口就再增大一些;但只要网

2022-03-02 17:13:34 1598

原创 TCP相关信息

TCPTCP是面向连接的 提供的是全双工服务,两台主机上的进程可以互相传输TCP连接也总是点对点的,单个发送方,单个接收方。 TCP是面向字节流的TCP报文段结构序号字段(32bit): 指出本TCP报文段数据载荷的第一个字节的序号 确认字段(32bit): 指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所以数据的确认。---TCP规定,在连接建立后所有的TCP报文段都必须把ACK置1接收窗口(16bit):指出发送本报文段的一方的.

2022-03-02 17:12:34 878

原创 Redis整型数组Intset升级源码解析

在看Redis设计于实现的时候看到了一句话:由于引发升级的新元素长度总是比整数集合现有的所有元素的长度都大,因此这个新元素的值要么就大于所有现有元素,要么就小于所有现有元素。我的推断是:当插入数字的时候,如果这个数字小于int16那么就会给这个值类型设置为int16,如果大于int 16小于 int32就会设置为int 32,所以才会出现上述情况。但是觉得还是看源码靠谱,所以看看源码吧。//Reids升级的源码static intset *intsetUpgradeAndAdd(intset *is

2022-02-27 13:26:52 202 1

原创 Redis底层数据结构---哈希表底层原理

哈希表结构定义typedef struct dictht{ //哈希表数组 dictEntry **table; //哈希表大小 unsigned long size; //哈希表大小掩码,用于计算索引值 unsigned long sizemask; //该哈希表已有节点的数量 unsigned long used ;}dictht table 属性是一个数组 ,数组中的每个元素都是一个指向dict.h/dictEntry结构的指针,

2022-02-26 21:53:15 768

原创 Redis集群----集群的执行命令底层原理

当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理数据库键属于哪个槽,并检查这个槽是否指派给了自己:如果键所在的槽正好指派给了当前的节点,那么节点直接执行这个命令 如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向至正确的节点,并再次发送之前想要执行的命令。假设现在有节点100和节点200,节点100负责前8192个槽,节点200负责后8192个槽假设键msg 处在槽8192 也就是节点200的第一个槽里面,键name处在槽0号位

2022-02-25 21:52:12 634

原创 Redis集群----槽指派底层原理

Redis集群通过分片的方式来保存数据库的键值对:集群的整个数据库被分为16384个槽,数据库中的每个键都输入这16384个槽其中的一个,集群中的每个节点都可以处理0-16384个槽。当数据库中的16384个槽都有节点在处理时,集群处于上线状态;如果有任何一个槽没有得到处理,那么集群处于下线状态。//通过向节点发送CLUSTER ADDSLOTS 命令,可以将一个或者多个槽指派给节点负责CLUSTER ADDSLOTS <slot><slot...>记录节点的槽指派信

2022-02-24 20:09:02 326

原创 Redis主从复制----心态检测机制

心跳检测当完成同步之后,主从服务器就会进入命令传播阶段,这时主服务器只要一直将自己执行的写命令发送给服务器,而从服务器只要一直接收并执行主服务器发来的写命令,就可以保证主从服务器的数据一致。在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令。REPLCONF ACK <replication_offset>REPLCONF ACK 命令对主从服务器有三个作用:检查主从服务器的网络连接状态 辅助实现min-slaves选项检测命令丢失检测主从服务器的网络

2022-02-24 15:40:19 274

原创 Redis主从复制---部分重同步的底层原理

部分重同步的实现部分重同步功能由以下三个部分构成:主服务器的复制偏移量和从服务器的复制偏移量 主服务器的复制积压缓冲区服务器的运行ID复制偏移量执行复制的主从服务器都会保存一个复制偏移量:主服务器每次向服务器传播N个字节的数据的时候,就将自己的复制偏移量+N 从服务器每次接收到主服务器传过来的N个字节的数据时,就将自己的复制偏移量的值加上N开始状态假设传输了14个字节后的状态通过对比主从服务器的复制偏移量可以判断主从服务器是否处于一致性状态,相同则处于,不同则不处于

2022-02-24 15:09:11 517

原创 Redis主从复制----底层原理

Redis主从复制通过Slaceof选项,让一个服务器去复制另外一个服务器,将被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器。SLAVEOF <IP><PORT>进行复制中的主从服务器双方的数据将会保存相同的数据,称之为数据一致。数据一致性的实现SYNC命令(旧版本)从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令完成。从服务器向主服务器发送SYNC命令 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一

2022-02-24 14:26:10 103

原创 Redis集群---搭建集群的底部原理

Redis集群Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。节点一个Redis集群通常由多个节点组成(运行在集群模式下的Reids服务器)//连接各个节点的工作可以使用CLUSTER MEET <IP><port>向一个节点发送CLUSTER MEET命令,可以让node节点与ip和port所指定的节点进行握手(handshake),如果握手成功,那么node节点会将ip和port所

2022-02-23 21:59:41 254

原创 Redis持久化--AOF

AOF持久化(通过保存Redis服务器所执行的写命令来记录数据库状态)AOF介绍AOF持久化保存数据库状态的方法则是将服务器执行的命令保存到AOF文件中,被写入AOF文件的所有命令都是以redis的命令请求协议保存的。在服务器启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的状态。AOF持久化实现AOF持久化功能的实现可以分为命令追加(append),文件写入,文件同步(sync)三个步骤。1.命令追加在AOF持久化功能处于打开状态时,服务器在执行完一个写命令

2022-02-22 23:20:45 296

原创 Reids持久化---RDB

RDB持久化(通过保存数据库中的键值来记录数据库状态)RDB介绍RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。RDB文件的创建与载入1.SAVE和BGSAVE用来生成RDB文件。SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。 BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令请求。 在BGSAVE

2022-02-22 23:11:10 232

转载 redis底层数据结构---listpack

listpack介绍Redis 在 5.0 新设计一个数据结构叫 listpack,目的是替代压缩列表,它最大特点是 listpack 中每个节点不再包含前一个节点的长度,压缩列表每个节点正因为需要保存前一个节点的长度字段,就会有连锁更新的隐患。listpack结构设计listpack 采用了压缩列表的很多优秀的设计,比如还是用一块连续的内存空间来紧凑地保存数据,并且为了节省内存的开销,listpack 节点会采用不同的编码方式保存不同大小的数据。listpack 有四个参数总字节数 元素数量

2022-02-21 22:06:01 1773 1

转载 Redis底层数据结构-----quickList

quickList介绍在redis3.0以前,List对象的底层数据结构是双向链表或者压缩链表在3.2的时候,List对象的底层改为由quicklist数据结构实现。quickList链表就是双向链表+压缩链表组合,quicklist本身是个链表,链表中的元素是压缩列表。quicklist的数据结构typedef struct quicklist { //quicklist的链表头 quicklistNode *head; //quicklist的链表尾

2022-02-21 21:34:47 856

原创 Redis的底层数据结构---SDS

SDS(redis5.0的SDS结构)参数解释:len :表示字符串的长度,获取字符串长度时,可以直接返回该值,不用像c语言那样便利alloc:分配的空间长度,用alloc-len就可以表示剩余的长度,当需要合并字符串的时候,先判断空间是否足够,这样就不会出现缓冲区溢出的情况flags: 来表示不同类型的 SDS。一共设计了 5 种类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64,后面在说明区别之处。 这 5 种类型的主要区别就在于,它们数据结

2022-02-21 13:59:49 879

原创 算法学习----钱数总和

今天在群里看到了个面试题大致内容为:第一天给一块钱,后面两个每天给两块,在后面三天给三块,问给定一个天数,总和给了多少?1 2 2 3 3 3 4 4 4 4 5 ......没有完整给钱的天数例如11天1 2 2 3 3 3 4 4 4 4 5仔细观察发现问题的本质:总和==完整给钱的天数+后面不能促成平方和公式天数*给的钱 public static int sumMoney(int n) { for (int i = n; i > 0; i--) {

2022-02-16 15:11:45 175

原创 关于mysql5.6版本的索引下推(ICP)

MySQL学习----ICP(索引下推)官网原地址:https://dev.mysql.com/doc/refman/8.0/en/index-condition-pushdown-optimization.html前提工作:创建一个学生成绩表,建立索引create index id_name on student(name); explain SELECT * FROM school.student where name>'z' and name like '%a

2022-02-14 22:36:43 596

原创 String源码解析

好久没有看源码了,这次看看String源码学习知识继承public final class String implements java.io.Serializable, Comparable<String>, CharSequence用final来修饰表示string是个最终类,不可被继承java.io.Serializable, Comparable, CharSequence 实现了这三个接口,依次是序列化,比较,和字符序列基本属性//字符串底层是字符数组pri

2021-12-04 15:58:23 893

原创 11.29 力扣每日刷题

82. 删除排序链表中的重复元素 II存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。小提示:一般链表的删除题最好弄一个虚拟结点,指向头一般设置为0,这样就不会逻辑被扰乱思路:用双指针解法一个前指针和后指针,还有个标记位,前指针用来判断有没有相同的元素,后指针用来删除元素如果没有相同元素,则两个直接指向自己的next这个时候碰到相同的元素则用循环来指向该相同元素的

2021-11-29 23:42:21 288

空空如也

空空如也

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

TA关注的人

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