自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何优化一条很慢的sql----个人总结

1.通过慢查询日志定位到具体那一条SQL通过配置两个参数来输出慢查询sql:① set global slow_query_log = on (开启慢查询日志)② set global long_query_time = 1000 (设置sql执行时间超过多少就打印日志,以毫秒为单位,所以这里是超过1秒的sql语句都会输出在slow log)默认输出在mysql安装路径的data路径下可以看到具体的查询消耗时间,阻塞时间,扫描行数,返回的行数等2. 分析慢查询的原因分析Explain:&

2020-08-02 00:25:16 2600

原创 线程池大小设置公式

线程池大小设置公式

2022-09-27 02:09:40 218 1

原创 编程路学习书单推荐

Java基础《Java核心技术卷一》《Java编程思想》/ 《On Java 8》《Java并发编程艺术》《Java并发编程之美》《深入理解Java虚拟机》数据库《数据库概论》《MySQL必知必会》《MySQL是怎样运行的》 – 掘金小册(强烈推荐)《高性能MySQL》,可只看重点章节《Redis设计与实现》《Redis深度历险:核心原理和应用实践》 – 掘金小册数据结构与算法《算法图解》《数据结构与算法分析 java语言描述》《算法 第4版》(配合leetcode刷题)

2022-09-07 00:18:59 544

原创 Dubbo订阅发布的实现原理

Dubbo核心模块实现原理阅读笔记

2022-09-06 00:42:41 828

原创 Redis多机模式(1)-主从复制

Redis的复制主要为两部分:同步和命令传播同步:将从服务器的数据库状态与主服务器保持一致.命令传播:用于在主服务器的数据被修改后,让从服务器的数据与主服务器保持一致.以上和本篇内容都参考于《Redis设计与实现》,但我觉得同步和命令传播两者本质都是数据同步,只不过前者是全量同步,后者是增量同步。复制功能的旧版实现同步主服务器接受从服务器的SYNC命令后执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从此刻开始执行的所有写命令主服务器BGSAVE执行完毕后,将生成的

2022-04-14 01:11:08 849

原创 MySQL是如何进行主从同步的?

MySQL主从同步流程图主要步骤:Master接受写请求,数据落磁盘的同时,记录操作到bin-log(binary-log,二进制形式的数据日志文件)当Master存在Slave的连接时,启动一个bin-log dump线程监听bin-log的变化。当bin-log dump线程监听到bin-log的变化时,将变化的数据推送给Slave。Slave的I/O线程接收bin-log的变化通知,并将其写入到本地的relay-log。Slave的SQL线程从relay-log拉取数据,并写入到本地的

2021-12-22 00:02:59 877 2

原创 5958. 股票平滑下跌阶段的数目

给你一个整数数组 prices ,表示一支股票的历史每日股价,其中 prices[i] 是这支股票第 i 天的价格。一个 平滑下降的阶段 定义为:对于 连续一天或者多天 ,每日股价都比 前一日股价恰好少 1 ,这个阶段第一天的股价没有限制。请你返回 平滑下降阶段 的数目。示例 1:输入:prices = [3,2,1,4]输出:7解释:总共有 7 个平滑下降阶段: [3], [2], [1], [4],[3,2], [2,1] 和 [3,2,1] 注意,仅一天按照定义也是平滑下降阶段。示

2021-12-19 22:13:13 333

原创 LeetCode 5394.找到和最大的长度为K的子序列

算法

2021-12-13 00:31:33 433

原创 ES数据类型

ES数据类型

2021-12-11 17:24:20 1842

原创 原码,反码和补码

原码,反码和补码欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markd

2021-09-20 01:24:22 702

原创 内存的物理机制和逻辑模型

物理机制上图中:VCC和GND是电源A0 ~ A9是地址信号的引脚D0 ~ D7是数据信号的引脚RD和WR是控制信号的引脚。将电源连接到VCC和GND后,就可以给其他引脚传递比如0或者1这样的信号。大多数情况下,+5V的直流电表示1,0V表示0。数据信号引脚有八个,表示一次可以输入输出8位(=1字节)的数据。此为,地址信号引脚有十个,表示可以指定0000000000 ~ 1111111111共1024个地址。而地址表示存储数据的场所,因此可以得出这个内存IC可以存储1024个1字节的数据

2021-05-04 00:34:37 547

原创 CPU的组成部分

从功能方面看,CPU的内部由以下四部分组成:寄存器:寄存器用来暂存指令,数据等处理对象,可以看作是内存的一种。控制器:负责把内存上的指令,数据等读入寄存器,并根据指令的执行结果来控制整个计算机。运算器:负责运算从内存读入寄存器的数据。时钟:负责发出CPU开始计时的时钟信号。不过,也有些计算机的时钟位于CPU的外部。时钟信号以Hz(赫兹为单位),代表每秒的频率,时钟信号的频率越高,CPU的运行速度越快。CPU的四个构成部分中,程序员只需要重点了解寄存器即可。不同类型的CPU,其内部寄存器的数量

2021-05-03 16:21:19 9985

原创 五种常见的IO模型

1. 阻塞IO模型应用进程被阻塞,直到数据从内核缓冲区复制到应用进程缓存区中才返回。2. 非阻塞IO模型进程发起IO系统调用后,内核返回一个状态码而不会被阻塞;应用程序可以继续执行,但是需要不断的执行系统调用来获知I/O是否完成。如果内核缓冲区有数据,内核就会把数据返回进程。3. IO复用模型使用(select/poll/epoll…)等待数据,可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回,之后把数据从内核复制到进程中。(在IO多路复用模型中,会有一个线程不断

2021-03-30 01:23:00 177

原创 redis的过期策略

前言:Redis的所有数据结构都可以设置过期时间,而redis内部有一系列策略来回收已经过期的数据结构。过期的key集合redis实现了一套事件触发模型,主要处理两种事件:I/O事件和定时事件。redis会将设了过期时间的key都存入一个独立的字典中。一是启动定时事件去遍历字典,二是当发生I/O事件(如读、写命令)时,就使用惰性策略去删除过期的key定时删除是集中处理,惰性删除是零散处理。扫描策略Redis默认会每秒进行十次过期扫描,每次不会遍历整个字典,而是采用一种贪心策略。从过期字典

2021-03-27 17:39:28 127

原创 僵尸进程-个人总结

文章目录概念产生的原因为什么会有僵尸进程僵尸进程的危害避免的方法概念在Linux中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,用来记载该进程的退出状态等信息供其他进程收集。linux中,使用ps -el命令,可以看到status为Z的进程就是僵尸进程。另外,S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;T代表停止或跟踪状态产生的原因一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁

2021-03-18 00:39:24 148

原创 go的channel实现生产者,消费者模式

package mainimport ( "fmt" "time")/**生产者*/func Producer(queue chan int, message int) { fmt.Printf("send %d\n", message) queue <- message}/**消费者:常驻监听channel,当channel有数据时消费,类似pull的消费模式*/func Consumer(queue chan int) { for { fmt.Printf

2021-03-16 01:01:02 478

原创 go实现set

使用Go的内置类型map,利用其键唯一的特性实现set。因为map的本质是hash表,所以基于map实现的set也就是HashSet。(在Java中的HashSet也是用同样的道理实现)package mainimport "fmt"/**以空结构体作为map的value来实现,空结构体不占内存*/type Empty struct{}var empty Empty// Set类型type Set struct { m map[int]Empty}// 添加元素func

2021-02-13 00:27:47 2444 1

原创 go实现主go程等于其他子go程执行完毕

方法1:channel实现/**1 channel通信实现*/var sync1 = make(chan int)// 实际任务func cal(no int) { fmt.Printf("%d 计算中\n", no) sync1 <- no}func main() { count := 5 for i := 0; i < 5; i++ { go cal(i) } // 在go种,channel未关闭之前,主go程不会结束 for range sync.

2021-02-13 00:03:41 143

原创 浅谈kubernetes基础与架构

kubernetes,简称k8s:是一个基于容器的,可移植,可扩展的运行分布式系统。用于管理容器化的工作负载和服务,可促进声明式配置和自动化。所谓的云就是使用容器构建的一套服务集群网络,云由大量的容器构成,而k8s的职责就是管理云中的容器。kubernetes官方文档:https://kubernetes.io/zh/docs/concepts/overview/components/部署方式的时代变迁可以看到应用的部署到目前为止基本分为三个时代:传统部署时代:这个时代,多个应用运行在同

2021-01-08 14:57:14 287

原创 Win10安装Docker

以下所有操作都以管理员身份下的powershell执行从官网下载正版Docker Desktop:https://www.docker.comwindows上的Docker是基于虚拟机去实现的,所以需要先启动win自带的Hyper-v虚拟机。启动方式:运行powershell,执行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All命令如果不是win10专业版,是没有自带Hyper-v的(专业版可

2021-01-07 18:58:07 285

原创 浅谈Docker基础与架构

容器技术享有虚拟机的好处,但抛弃了虚拟机的一些缺点,如:启动慢,占用内存大(一般为GB级别),这是因为虚拟机就是模拟一个操作系统,而操作系统本身是一个巨型的应用程序。应用部署时一个重要的点就是隔离性,使其在运行时互不干扰。虚拟机通过操作系统层面进行隔离,而容器技术只隔离应用程序的运行时环境而可以共享同一个操作系统。docker就是容器技术的一种实现,它本身不是容器,而是创建容器的工具,是应用容器引擎。Docker官方文档的两句话很好的总结了docker的特性:– Build, Ship A

2021-01-06 01:02:35 239 2

原创 redis事件模型-学习小结

前言:最近写的一个项目用到了redis中的list实现一个简单的队列去异步执行计算任务,开发的过程中想起了redis的线程模型天然保证了list中的消息不会被多次/重复消费,但又有点生疏了,借此复习一下redis的线程模型。redis线程模型概览:① 由多个socket接收来自客户端的各种请求,例如:建立通道,返回data,发送redis指令等。② socket由I/O多路复用程序进行监听,redis中的I/O多路复用机制采用的是非阻塞的epoll模型。③ 将执行命令顺序压入队列,由文件事件分派器

2020-12-29 01:08:52 445

原创 Golang函数重点小结

1. 定义函数属于第一类对象,具备相同签名(参数及返回值)的视作同一类型第一类对象(first-class object)指可在运行期创建,可用作函数参数或返回值,可存入变量的实体。最常见的用法就是匿名函数函数只能判断其是否为nil,不支持其他比较操作从函数返回局部变量指针是安全的,编译器会通过逃逸分析(escape analysis)来决定是否在堆上分配内存函数内联(inline)对内存分配有一定的影响2. 参数参数都是值拷贝,区别在于拷贝目标对象,还是拷贝指针。在函数调用前,会为形参

2020-12-21 22:39:07 311

原创 gRPC--官方文档总结

关键点grpc跟普通rpc一样,在服务端定义一个服务,并且提供可被远程调用的方法,运行一个gRPC服务器处理客户端调用。在客户端拥有一个存根(gRPC Stub)能够向服务端发送请求,存根中拥有跟服务端一样的方法。gRPC客户端和服务端可以在多种环境中运行和交互(跨平台和跨语言)默认使用protocol buffers作为接口定义语言,来描述服务接口和有效载荷消息结构。需要的话,可以使用其他替代方案提供protocol buffers编译插件,能够从一个服务定义的.proto文件生成服务端和客户

2020-12-05 12:17:59 631

原创 Go的声明及执行顺序

声明顺序:在完成包的import之后,开始对常量,变量和类型的定义或声明。如果存在init函数的话,则对函数进行定义(这是一个特殊的函数,每个含有该函数的包都会先执行这个函数)。如果当前包是main包,则定义main函数。然后定义其余的函数,首先是类型的方法,接着是按照main函数中先后调用的顺序来定义相关函数,如果有很多函数,则可以按照字母顺序进行排序。执行顺序:按顺序导入所有被main包引用的其他包,然后再每个包中执行如下②③④流程。如果该包又导入了其他包,则从第一步开始递归执行,但

2020-11-25 22:56:24 562

原创 主流的四种并发实现模型

主流的四种并发实现模型多进程多线程基于回调的非阻塞/异步IO协程多进程多进程是在操作系统层面进行并发的基本模式。同时也是开销最大的模式。在Linux平台上,很多工具链正是采用这种模式在工作。比如某个Web服务器,它会有专门的进程负责网络端口的监听和连接管理,还会有专门的进程负责事务和运算。这种方法的好处在于简单,进程间互不影响,坏处在于系统开销大,因为所有的进程都是由内核管理的,进程间的切换会导致频繁的上下文切换。多线程多线程在大部分操作系统上都属于系统层面的并发模式,也是我们使用最多的最有效的一种

2020-11-15 14:34:27 547

原创 进程里的上下文具体指什么?

前言:在redis相关文章中,经常可以看到这句话:“采用单线程,避免了不必要的线程上下文切换和竞争条件"。在阅读《操作系统概念》时正好看到了,就此记录一下我觉得比较重要的部分。摘自知乎 --vczh每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行。你为了使他们运行,就要给所有的外部变量一个一个写一些值进去。这些值的集合就叫上下文。(基于Linux)大体上,进程属性分为三组:进程标识,进程环境和进程上下文。进程标

2020-10-21 00:45:59 6861

原创 获取offershow发布人ip地址

所用工具:① fiddler (http调试抓包工具)② postman(接口调试工具)步骤:① fiddler 捕获小程序中的数据包。② 查看,分析url以及请求头的数据。③ 使用postman发送post请求,获得返回数据1. fiddler抓包抓包前需要做简单的如下①②③步配置:① 工具->选项->https,勾选https对应选项。② 工具->选项->https->操作->信任根证书,一路点下去即可。③ 避免其他数据包干扰,设置左下方

2020-10-15 16:13:20 1395

原创 Java对象创建的过程----个人总结

Java中对象的创建大致分为以下5步1.类加载检查2.分配内存3.初始化4.设置对象头5.执行<-init->方法1.类加载检查当JVM遇到字节码new指令(如new关键字,对象克隆,对象序列化)时。首先去检查这个指令的参数是否能在class对象常量池中定位到一个类的符号引用,并且检查这个符号引用的类是否被加载,解析和初始化。如果没有,则先执行相应的类加载过程。2.分配内存在类加载检查后,接下来JVM将为新生对象分配内存补充:① 指针碰撞和空闲列表的详细实现,可阅读《深入理解Jav

2020-09-11 11:36:47 229

原创 手撕阻塞队列

package other;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 实现一个阻塞队列 * @author void * */public class BlockQueue<T> { private int size; // 队列长度

2020-07-26 23:48:24 256

原创 HotSpot算法细节实现----个人整理

前言:这一块内容比较晦涩,所以整理出一篇博客帮助自己深入理解。① 根节点枚举目前为止,所有的垃圾收集器(包括CMS,G1,ZGC)在初始标记这一阶段都是需要STW的,而如果这一步耗时过长,就无法满足所谓低延迟垃圾收集器的需求。在HotSpot的解决方案里,使用一个叫做OopMap的数据结构解决上述问题。在类加载动作完成时,HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来,在即时编译过程中,也会在待定为止记录下栈和寄存器里哪些位置是引用。这样收集器在初始标记阶段就不用遍历GC Root了,

2020-07-25 00:43:55 483

原创 Redis持久化--个人总结

RDB补充:bgsave中,父进程对数据进行写操作时,会采用OS的COW机制对数据段页面分离,当父进程对其中一个页面进行修改时,会将被共享的页面复制一份分离出来,然后对这个复制的页面进行修改。AOF前言: AOF持久化以独立日志的方式记录每次写命令,解决了持久化的实时性问题。混合持久化《Redis深度历险》:重启Redis时,我们很少使用RDB来恢复内存,因为会丢失大量数据。我们通常使用AOF日志重放,但是重放AOF日志性能相对RDB来说慢很多,这样在Redis实例很大的时候,启动需要花费很长

2020-07-19 23:05:44 163

原创 Java反射个人总结

反射的使用① Class.forName("packageName")② Person.class(),## 此方法性能最好。③ person.getClass()关于反射的脑图总结注意事项① 反射无法更改类中final修饰的String和基本类型。因为Java在编译时会把对此引用的地方替换成相应常量。② 尽量使用高性能的反射库,如joor,Apache的commons工具类。...

2020-07-19 14:55:22 183

原创 JVM垃圾收集机制概括

JVM垃圾收集机制· 部分前置知识可以阅读《深入理解JVM虚拟机》第三版。我这里从三个方面概述垃圾收集的框架,主要分为**what(哪些内存需要被收集),when(什么时候回收),how**(如何回收)。从这三个方面不断深入,再一层层揭开垃圾收集的面纱。...

2020-07-07 15:05:43 243

原创 MySQL查询优化器----个人整理

MySQL查询优化器基于(成本/规则)的优化基于成本的优化基于成本的优化

2020-07-03 01:36:09 287

原创 PTA 二叉搜索树的删除操作

给出一棵二叉搜索树(没有相同元素), 请输出其删除部分元素之后的层序遍历序列。删除结点的策略如下:① 如果一个结点是叶子结点,则直接删除;② 如果一个结点的左子树不为空, 则将该结点的值设置为其左子树上各结点中的最大值,并继续删除其左子树上拥有最大值的结点;③ 如果一个结点的左子树为空但右子树不为空,则将该结点的值设置为其右子树上各结点中的最小值,并继续删除其右子树上拥有最小值的结点。输入格式:每个输入文件包含一个测试用例。每个测试用例的第一行包含一个整数 N (0<N<=100),

2020-06-25 01:26:48 3188 4

原创 PTA 带头节点的双向循环链表操作

题目要求:读入一系列整数,依次插入到双向循环链表的头部和尾部,然后顺序和逆序输出链表。输入格式:输入一行整数(空格分隔),以-1结束。输出格式:第一行输出链表顺序遍历的结果,第二行输出逆序遍历的结果。输入样例:在这里给出一组输入。例如:1 2 3 4 5 6 -1输出样例:5 3 1 2 4 66 4 2 1 3 5import java.util.Scanner;// 链表节点class Node{ int val; Node pre; Node next; Nod

2020-06-24 13:00:04 3383 4

原创 PTA Sheldon的小本本

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;class Node{ String name; Node next; Node(String name, Node next){ this.name = name; this.next = next; }}public class Main { // 设置一个前置结点,以实现单链表 private

2020-06-23 16:15:58 1369

原创 PTA gg的超市

PTA gg的超市import java.util.ArrayDeque;import java.util.Scanner;class Node{ int date; Node(int date){ this.date = date; }}public class Main { // 题目长的一批,但实际上就是两个栈 public static void main(String[] args) { Scanner cin = new Scanner(System.in

2020-06-23 13:48:12 1976 10

原创 MySQL数据库---四种隔离级别详解

前言· 这几天看了掘金的《从根上理解MySQL》对MySQL的理解像是打开了新世界的大门,强烈推荐给想进一步学习MySQL的兄弟们。大佬轻踩。ps:貌似只有pdf版,需要电子资源的可百度可私信我。pps:本文仅仅是对四大隔离级别及其底层实现做个概括,想详细了解的兄弟还是建议阅读《从根上理解MySQL》。数据库的四大特性在此之前有必要复习一下数据的大四特性:也就是ACID,化学里的酸~·...

2020-04-30 22:09:19 968

空空如也

空空如也

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

TA关注的人

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