自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(170)
  • 资源 (2)
  • 收藏
  • 关注

原创 当事务遇上分布式锁

innodb 可重复读遇上分布式锁

2022-07-25 00:13:51 1194

原创 从AOP到分布式链路追踪

三个基础概念:2、分布式链路追踪Dapper故障快速定位:可以通过调用链结合业务日志快速定位错误信息。链路性能可视化:各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来。链路分析:通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。https://pics2.baidu.com/feed/7af40ad162d9f2d3fd977039b26b8a1a6127ccf6.png?token=30fa37fc2fd2aef6c3d0274b2b3fc173主要记录Tra

2022-06-26 20:49:09 218 1

原创 大数据入门 - 基础概念

文章目录1. 发展历史2. MapReduce3.1. 发展历史如今说的大数据其实起源于谷歌在2004年发表的三篇论文:分布式文件系统 GFS、大数据分布式计算框架 MapReduce 和 NoSQL 数据库系统 BigTable。同时,在焦聚单机性能的同时,Google 开始考虑部署一个大规模的服务器集群来满足海量的数据存储以及计算的需求。Lucene 开源项目的创始人 Doug Cutting 再开发开源搜索引擎 Nutch之后的2006 年,Doug Cutting 将大数据相关的功能从 Nu

2022-02-28 22:27:25 62

原创 算法 - 链表相关

文章目录链表定义反转链表迭代迭代栈寻找链表的中点合并链表重排链表环形链表链表定义/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) {

2022-02-21 22:35:47 290

原创 算法 - 加油站

leetcode_134在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。示例 1:输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]输出:

2022-02-17 23:10:07 149

原创 算法 - 神奇的异或

文章目录什么是异或?使用经验1.数组中的单一元素2.数组中的单一元素(进阶)3.有序数组中的单一元素什么是异或?同0异1。在java内就是X^Y。任何数异或0为任何数 0 ^ n = n任何数异或1,n为奇数,n^ 1 = n-1;n为偶数 n^1=n+1相同的数异或为0: n ^ n = 0使用经验1.数组中的单一元素给你一个仅由整数数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。1 <= nums.length <= 10^

2022-02-14 22:27:47 339

原创 MySql - 如何确定一个字段适合构建索引?

基数某个列唯一键的数量叫作基数。某个列唯一键的数量叫作基数。当查询结果是返回表中5%以内的数据时,应该走索引;当查询结果返回的是超过表中5%的数据时,应该走全表扫描。选择性当查询结果是返回表中5%以内的数据时,应该走索引;当查询结果返回的是超过表中5%的数据时,应该走全表扫描。当一个列选择性大于20%,说明该列的数据分布就比较均衡了。当某个列基数很低,该列数据分布就会不均衡。数据分布不均衡会导致在查询该列的时候,要么走全表扫描,要么走索引扫描,这个时候很容易走错执行计划。回表概念:当对一个列

2022-02-08 21:55:32 437

原创 logback自定义MessageConverter

import ch.qos.logback.classic.pattern.MessageConverter;import ch.qos.logback.classic.spi.ILoggingEvent;import com.alibaba.fastjson.JSON;import com.didi.utils.log.LogUtils;import org.apache.commons.lang3.StringUtils;import org.slf4j.helpers.MessageForm

2022-01-18 11:34:35 855

原创 java - 锁粒度

最近工作有个需求,需要加锁保证操作的原子性,但在一定程度上我想着可以根据业务类型对锁进行细化,于是简单的写了一个demo进行验证:import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public cla

2021-09-23 22:02:12 442

原创 动态数据源实现原理-SpringBoot

文章目录动态数据源学会注解的使用方式核心概念@Retention@Target@Documented@Inherited@Repeatable注解的本质获取注解属性切面实现数据源原理 *动态数据源源码解析过程动态数据源 无注解动态数据源 注解(方法级)动态数据源构想使用方法加注解模式就可以切换该方法所使用的数据库源。通过spring切面进行方法的增强。故我们的搭建步骤为 注解 -》切面-》数据源原理-》实现 (顺序不分先后,仅为本文逻辑)学会注解的使用方式核心概念@RetentionRe

2021-09-21 12:16:23 2509

原创 动态数据源-SpringManagedTransaction&&AbstractRoutingDataSource 源码解析过程

动态数据源-源码解析过程这其中需要mybatis的一些知识,进行一次debug调试,来查看过程。在我们需要决定的地方打上断点,发送一次请求,我们先不要着急查看往下执行,先看一下调用栈已经调用了哪些方法并处于哪些类中。如果看过mybatis源码,那么对上面的流程其实有一定的了解。接着进行断点的执行:这里回到了DynamicDataSource ,因为我们的 DynamicDataSource 是继承AbstractRoutingDataSource 的,并重写了AbstractRoutingDat

2021-09-21 00:25:21 516

原创 RocketMq原理入门

文章目录消费Group名称支持延迟消息&循环消息RocketMq 消费者DefaultMQPushConsumer使用DefaultMQPushConsumer 的处理流程DefaultMQPushConsumer 的流量控制DefaultMQPullConsumerConsumer 的启动、关闭流程RocketMq 生产者DefaultMQProducer发送延迟消息自定义消息发送规则ConsumeQueue:消息消费队列,消息到达 CommitLog 文件后,将异步转发到消息 消费队列,供消息消

2021-07-13 10:49:39 123 1

原创 SpringBoot实现IDEA热部署是否有启动速率提升?

1. maven依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.

2021-07-05 21:21:21 143 1

原创 MYSQL分表DDL操作(存储过程)

drop procedure if exists useCursor; CREATE PROCEDURE useCursor() BEGIN DECLARE oneAddr varchar(36) default ''; DECLARE allAddr varchar(40) default ''; DECLARE done INT DEFAULT 0; DECLARE curl CURSOR FOR select table_name from

2021-07-01 16:36:20 144

原创 Git操作小手册

1.创建本地分支git branch 分支名,例如:git branch 2.0.1.20120806注: 2.0.1.20120806是分支名称,可以随便定义。2.切换本地分支git checkout 分支名,例如从master切换到分支:git checkout 2.0.1.201208063.远程分支就是本地分支push到服务器上。比如master就是一个最典型的远程分支(默认)。git push origin 2.0.1.201208064.远程分支和本地分支需要区分好,所以,在从服务

2021-07-01 16:36:02 44

原创 EffectiveJava - 出师之路

Github免费阅读链接阿里巴巴开发者手册文章目录Item 1: Consider static factory methods instead of constructors(考虑以静态工厂方法代替构造函数)Item 2: Consider a builder when faced with many constructor parameters(当构造函数有多个参数时,考虑改用构建器)Enforce the singleton property with a private constructor

2021-06-18 16:25:37 99

原创 Win10 docker安装及遇到问题解决

win10 安装docker可参考:链接问题 WSL linux虚拟机过老参考直接下载链接即可。下载链接基于WSL2 的 Docker Desktop 启动时 Failed to set version to docker-desktop: exit code: -1的解决方法…参考cmd 下重置socket链接netsh winsock reset 镜像服务参考右边搜索服务:容器镜像服务。填入对应位置。建议注册账号测试(其实win10 本就是可视化的)docker可

2021-06-13 01:27:43 189

原创 Golang切片make与new的区别

the way to go chapter 7new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于 &T{}。make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel在上图中:var p *[]int = new([]int) // *p == nil; with len and cap 0p :=

2021-04-20 20:27:11 723 1

转载 深入理解Golang - 闭包

文章链接 - golang内核系列–深入理解函数闭包 - buptbill220的文章 - 知乎–问题闭包 是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。比如下面“斐波那契数列”闭包:func fib() func() int { a, b := 0, 1 return func() int { a, b = b, a+b r

2021-04-17 21:46:58 225

原创 计算机网络 - 三次握手&四次挥手

文章目录1.TCP 和 UDP 的区别2. 三次握手为什么不是两次?三次握手过程中可以携带数据么?3. 四次挥手等待2MSL的意义为什么是四次挥手而不是三次?1.TCP 和 UDP 的区别TCP是一个面向连接的、可靠的、基于字节流的传输层协议。而UDP是一个面向无连接的传输层协议。(就这么简单,其它TCP的特性也就没有了)。具体来分析,和 UDP 相比,TCP 有三大核心特性:面向连接。所谓的连接,指的是客户端和服务器的连接,在双方互相通信之前,TCP 需要三次握手建立连接,而 UDP 没有相应

2021-03-27 12:53:49 105

原创 算法 - 众数(摩尔投票)

找出数组中大于出现频率大于n/2的数方法一:hashmap,排序等,这种常规思路就不概述方法二:摩尔投票不同的两数相互抵消,最后剩下的肯定是多于一半的那个数。当count为0时,选举当前为最多的数,并++,不为选举最多的数的使count–。最终一定是candidate是最多的数,但条件是出现频率必须大于数组长度的一半。 public int majorityElement(int[] nums) { int count = 0; Integer candidate

2021-03-26 15:11:18 110

原创 算法 - 二分查找

基础二分 /** * 要求数组有序 ,二分法 * @param arr * @param * @return */ private static int binarySearch(int[] arr, int left, int right, int findVal) { //给一个出口 if (left >= right) { return -1; }

2021-03-26 13:53:10 44

原创 算法 - 链表与图的深拷贝

链表深拷贝leetcode 138给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.ran

2021-03-25 16:18:18 164

原创 算法 - 回文相关

文章目录1.判断是否回文2.最长回文子串3.分割回文串4.最短回文串Manacher 算法 O(n)KMP算法1.判断是否回文双指针做法的时间复杂度是 O(N),优化的解法是,先采用动态规划,把回文子串的结果记录在一个表格里。 /** * * @param charArray * @param left 子串的左边界,可以取到 * @param right 子串的右边界,可以取到 * @return */

2021-03-24 16:44:58 76

原创 设计模式 - 单例模式的7种实现

文章目录1.饿汉式2.懒汉式3.同步懒汉式4.Double Check5.Volatile Double Check6.Holder方式7. 枚举1.饿汉式//不允许被继承public final class SingletonHungry { private static SingletonHungry instance = new SingletonHungry(); private SingletonHungry() { } public static Sin

2021-03-02 21:41:24 64

原创 深入理解并发编程 - StampedLock

文章目录1. 概述2. 使用案例1. 概述JDK1.8版本引入了StampedLock,该锁由一个long型的数据戳(stamp)和三种模型构成,当获取锁(比如调用readLock(),writeLock())的时候会返回一个long型的数据戳(stamp),该数据戳将被用于进行稍后的锁释放参数。如果返回的数据戳为0(比如调用tryWriteLock()),则表示获取锁失败,同时StampedLock还提供了一种乐观读的操作方式。为什么还需要引入StampedLock?ReentrantReadW

2021-03-01 20:47:24 112 2

原创 深入理解并发编程 - sun.misc.Unsafe

文章目录1. TODO1. TODO

2021-01-31 15:51:17 123

原创 数据结构 - lru&lfu实现(Java)

文章目录1. LRU 基于哈希表和双向链表的LRU算法实现2. LFU(LinkedHashSet)LRU与LFU的区别1. LRU 基于哈希表和双向链表的LRU算法实现缓存看这篇LinkedHashMap的LRUCache实现设计思路是,使用哈希表存储 key,值为链表中的节点,节点中存储值,双向链表来记录节点的顺序,头部为最近访问节点。LRU算法中有两种基本操作:get(key):查询key对应的节点,如果key存在,将节点移动至链表头部。set(key, value): 设置key对

2020-12-08 18:31:38 555

原创 排序算法 - 归并&快排

文章目录1. 归并排序借助额外空间和并空间优化2. 快速排序递归写法非递归写法性能改进1. 归并排序平均时间复杂度:O(nlogn)最佳时间复杂度:O(n)最差时间复杂度:O(nlogn)空间复杂度:O(n)排序方式:In-place稳定性:稳定归并排序的思想就是将问题细分成小问题,最后将容易的小问题汇集就解决了全局的问题。一句话来说,局部有序 ·合并· 成全局有序。借助额外空间和并写归并排序建议先从合并写起,我们的基础条件就是将两个有序的数组合并成一个大数组,且这个大数组在合并过程

2020-12-03 22:16:04 306

原创 数据结构 - 两个栈实现一个队列

实现原理栈的特性是先进后出,队列的特性是先进先出。那么,我们使用两个栈,对同一个元素进行先进后出两次栈就形成了先进先出的顺序。即一个元素需要入栈两次,才能被取出来。我们将put,get定义为存放元素,与取元素。使用命名为in,out的栈,in代表往队列里面put元素第一次入栈是进入in,out代表get元素是从out这个栈里取。第一次,get时out为空,需要从in中取元素,以形成正序取。其内部实现细节如下:put(){ in.put;}get(){//如果out为空,则从in

2020-12-03 14:06:46 135

原创 Redis - 事件&客户端&服务端

文章目录1.Redis将事件分为两大类:文件事件与时间事件。文件事件即socket的读写事件,时间事件用于处理一些需要周期性执行的定时任务。1.

2020-11-23 15:46:40 116

原创 Redis - 事务&频道

文章目录1. 事务2. WATCH命令3. 判断事务是否安全4. 发布与订阅4. 发布与订阅的实现原理5. 消息处理1. 事务Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。当Redis重新启动加载AOF文件时也会保证事务命令的完整性。一个事务从开始到结束通常会经历以下三个阶段:1)事务开始MULTI。2)命令入队。3)事务执行EXEC。multiincr counter1incr counter2 exec事务开始MULTIMULT

2020-11-21 19:32:23 243 1

原创 Redis - Sentinel(哨兵)

文章目录1. 初始化Sentinel1.1 初始化服务器1.2 使用Sentinel专用代码1.3 初始化Sentinel状态1.4 初始化Sentinel状态的masters属性1.5 创建连向主服务器的网络连接2. Sentinel获取信息3. 检测下线leader选举规则4. 故障转移主服务器挑选过程5. 相关问题1)主从切换完成之后,客户端和其他哨兵如何知道现在提供服务的Redis Master是哪一个呢?2)执行切换的哨兵发生了故障,切换操作是否会由其他哨兵继续完成呢?3)故障Master恢复之

2020-11-20 22:58:03 86

原创 Redis - 集群,主从复制

文章目录1. 为什么需要主从复制?2. 主从复制2.1 同步2.2 命令传播2.3 复制的缺陷2.4 Redis2.8的优化2.5 实现原理2.5.1 复制偏移量2.5.2 复制积压缓冲区2.5.3 服务器运行ID2.5.4 执行流程如下todo1. 为什么需要主从复制?1)读写分离,单台服务器能支撑的QPS是有上限的,我们可以部署一台主服务器、多台从服务器,主服务器只处理写请求,从服务器通过复制功能同步主服务器数据,只处理读请求,以此提升Redis服务能力;另外我们还可以通过复制功能来让主服务器免于执

2020-11-19 23:15:00 68

原创 Redis - 持久化

文章目录1. RDB持久化1.1 参数配置1.2 dirty计数器和lastsave属性1.3 检查保存条件是否满足2. AOF持久化3. 混合持久化1. RDB持久化Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。Redis提供了RDB持久化功能,可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。有两个Redis命令可以用于生成RDB文件,一个是SA

2020-11-19 21:57:31 48

原创 Redis - 键空间

文章目录1. 键空间简介2. 读写键空间时的维护操作3. 设置键的生存时间或过期时间4. 过期键删除策略4.1 定时删除4.2 惰性删除4.3 定期删除5. AOF、RDB和复制功能对过期键的处理5.1 RDB5.2 AOF5.3 复制模式1. 键空间简介Redis是一个键值对(key-value pair)数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间(key space)

2020-11-19 19:30:29 474

原创 Redis -KV基础

文章目录1. 对象的类型与编码2. 字符串对象编码的转换3. 列表对象4. 哈希对象5. 集合对象6. 有序集合7. 内存回收8. 对象的空转时长1. 对象的类型与编码服务器在执行某些命令之前,会先检查给定键的类型能否执行指定的命令,而检查一个键的类型就是检查键的值对象的类型。每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。Redis中的每个对象都由一个redisObject结构表示:typede

2020-11-14 22:53:00 553

原创 Redis - 整数集合

文章目录1. 基本概念1. 基本概念整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。typedef struct intset{ //编码方式 uint32_t encoding; //集合包含元素数量 uin

2020-11-07 21:41:40 114

原创 Redis - 跳跃表,压缩列表,quicklist

文章目录1. 跳跃表2. 跳跃表的结构3. 压缩列表连锁更新1. 跳跃表跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单。Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(memb

2020-11-06 20:38:27 1461

原创 Redis - 链表与字典的实现

文章目录1. Redis链表的结构2. Redis字典的结构hash表哈希表结点字典hash函数rehash(渐进式)3. 字典的遍历 *3.1 迭代器遍历(全遍历)普通迭代器安全迭代器3.2 间断遍历Redis为单进程单线程模式1. Redis链表的结构基础是双向链表typedef struct listNode{struct listNode *prev;struct listNode *next;void* value;}listNode;外层还有一层封装typedef st

2020-11-05 20:38:24 105

编译原理-SLR分析法设计与实现

SLR分析法设计与实现,后人乘凉,我也是找了很久。

2020-06-18

编译原理--LL1文法.zip

LL(1)语法分析器的设计与实现

2020-05-17

空空如也

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

TA关注的人

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