自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 资源 (1)
  • 收藏
  • 关注

原创 递归入门-针对小白

递归是很多算法实现的基础,写好递归代码非常有必要。另外一点,递归的实现方式大多都非常简洁,简洁就意味着好维护。先按着技巧做,多写多练,慢慢就理解了。主要原因就是:你会不自觉的陷入到大脑递归的过程,基本2层递归就蒙了。人的大脑擅长创造,并不擅长这种大规模、重复性的工作。我不是很理解,为什么写好这两个东西,就能实现递归了呢?不理解,那就先不理解,先按着做。很多框架,你也不理解,但是你用的也很好。今天用递归实现斐波那契数列的时候,感觉摸到了一些门道,分享一下。递归太基础了,大家应该都知道,但是递归代码并不好写。

2024-05-12 11:38:53 239

原创 ElasticSearch报错解决

最近在学习ES的一些东西,遇到了一些问题,整理一下,希望可以帮助到也在学习ES的小伙伴。

2024-02-24 23:19:37 374

原创 <代码整洁之道>精彩片段整理

最近在读这本,感觉里面有很多内容都很有启发。整理下来,大家一起看下,顺便看看作者说的有没有道理。这本书的作者是:罗伯特丶马丁,大家经常叫他鲍勃大叔,斜体样式。

2024-02-15 17:48:35 707

原创 redis高可用-哨兵模式-源码篇

前段时间写过两篇redis哨兵的文章,一篇是。另外一篇是当时写的原理篇,是手动模拟主节点故障,然后查看主从切换的日志推算哨兵主从切换的流程。但是感觉这样搞出来的流程太粗,忽略了很多细节,真正要搞明白原理,还是要看源码才行。所以,找时间学习了一下C语言的语法,然后梳理哨兵模式主从切换的相关源码。研究了一段时间,算是把主流程基本搞懂了,今天把真正的原理篇补上。下面从源码的角度来分析一下主从切换的流程。

2023-12-24 23:52:19 851

原创 springboot应用,cpu高、内存高问题排查

回顾一下整个排查过程,有几个点说一下1)、写方法一定要注意动态的情况,比如此例中,数据后期增长的情况,不能只考虑当时的数据。2)、有个疑问,就算对象不可达了,正常来说也可以从MAT里看到点相关东西才对,但是翻了很久,啥也没看到,MAT的使用还要再看看,感觉是遗漏了细节3)、还有个疑问,虽然对象确实很大,但是可以回收,那rancher上看到的内存为啥还会这么高呢?这也是一个疑问点,需要找时间了解一下rancher。

2023-12-13 15:31:58 2499

原创 redis一条set命令的执行过程

set命令,在我们看来很简单,set zhangsan lisi,redis给我们返回一个 ok,就完事了。那redis的服务端是怎么处理这条简单的命令的?是不是像我们看起来的这么简单。今天这篇文章就来聊聊这个问题。在上一篇文章中,我们聊了redis IO多路复用的事件驱动框架。我们大致了解了redis是如何接收连接,如何将客户端的连接行为封装成事件并结合IO多路复用实现了对客户端连接的监听这一篇,我们聊聊当内核监听到客户端连接事件后,具体是如何处理连接事件的,我们用set命令来举例子。

2023-11-12 16:56:22 407

原创 redis源码分析之IO多路复用

这是老八股了,IO多路复用,背后依赖的是多路复用的函数,有select、poll、epoll,linux默认使用的是epoll函数,redis把客户端连接通过epoll函数给到内核,内核监听到连接有可读写的事件,就将该事件返回redis进行处理。返回了结果后,下面的逻辑就是处理这个就绪的事件,这个方法是redis IO多路复用的关键所在,redis不停的接收客户端请求,这个方法是主要逻辑,我给每一行代码都加了注释,可以细看一下。aeCreateFileEvent,是一个非常重要的方法,是用来创建事件的。

2023-11-04 21:10:19 288

原创 github下载源码失败(mac)

既然浏览器能从github下载源代码,那证明你的网络和github是通的,那为什么git不能clone代码呢?注意,你的代理地址并不一定是http://127.0.0.1:9977,你需要自己查看一下你的代理地址。前提,你浏览器可以访问github了,如果不能访问,那你得先解决浏览器访问github失败的问题。4、选择"代理"标签页。在代理标签页中,您可以看到代理服务器IP 地址和端口号。3、选择您使用的wifi,点击"详细信息"2、选择“WI-FI”。1、打开系统偏好设置。

2023-10-09 12:45:50 546

原创 springboot解决multi-statement not allow(已部署生产)

看报错的堆栈,是一个叫做WallFilter的过滤器中报出来的。首先来说,解决思路没有问题,就是将这个属性multiStatementAllow的值设置为true,关键是怎么做是有效的?反正我试了网上的思路,不管用,还是报错,要不然就是不报错了,但是。解决思路很简单,首先将我们已经生成的数据源注入到代码中,然后添加MultiStatementAllow=true的配置。我对druid的源码也不熟悉,碰到了这个问题,也是google,第一:很简单,既然是wall引起的,直接把它去掉不就行了。

2023-10-08 20:14:39 1358 2

原创 经纬度相关计算

java,经纬度计算

2023-09-23 03:19:33 283

原创 一种简单实用的灰度切量方案

最终实现了一版灰度方案,虽然看着简单,但经过生产验证,效果不错,实现了快速切量功能以及部分白名单、黑名单功能,这个涉及支付的需求最终也成功上线。下面把这套方案分享一下。说明一下,上述代码经过生产验证,是可用的,但是每个业务的情况不一样,不要直接粘代码到生产上使用,而是吸收方案的思想,进而改造成适合自己业务的方案。遇到了一个重要的需求,需要在支付场景上做一个大的改动,改动量较大,虽然已经对技术方案做了很多的review,大量的自测,QA测试,但还是觉得应该逐步放量,如果有问题,及时回切,避免造成过大的影响。

2023-09-23 02:37:12 195

原创 docker从零部署jenkins保姆级教程(下)

上一篇文章,我们完成了以下工作。1)、docker部署jenkins2)、建立第一个jenkins job3)、通过jenkins job自动编译构建我们的github项目上面所做的3个工作,都是为了这一篇文章打基础,不管是部署docker还是部署jenkins,我们最终的目的还是部署我们的项目,让项目跑起来,让流量进来,这才是一个项目的真正意义所在。这一篇文章,我们就要让我们的项目部署到docker中,跑起来。

2023-09-06 20:06:48 649

原创 docker从零部署jenkins保姆级教程(上)

jenkins,基本是最常用的持续集成工具。在实际的工作中,后端研发一般没有jenkins的操作权限,只有一些查看权限,但是我们的代码是经过这个工具构建出来部署到服务器的,所以我觉着有必要了解一下这个工具的搭建过程以及简单的一些使用。尽可能多的了解公司中和你开发相关的所有东西,不要只是干CRUD的工作,只有这样,你才会有成长。我本地使用的mac充当宿主机,因为最近一直在看docker相关的东西,docker对于搭建测试环境非常方便,所以这次也选择用docker搭建jenkins。

2023-09-04 22:33:55 2721 2

原创 mac docker 卡住解决

通过监听/var/run/docker.sock(不同的操作系统位置可能不同)这个Unix套接字文件来实现,而在mac上,这个文件的位置是:用户目录/.docker/docker.sock,比如:/Users/zhangsan/.docker/docker.sock。如果我们是通过mac的强杀程序挨个删除docker的进程,.docker/docker.sock文件就会保留,我们重装docker后,老的docker.sock文件就会影响到docker的运行,所以必须要重新生成该文件。

2023-08-27 10:20:49 1936 1

原创 mysql使用flashback恢复数据

常在河边走,哪有不湿鞋。如果我们经常操作数据库,很有可能就会造成误操作,假如我们不幸误删了数据,有没有办法快速恢复呢?这里,我们就以用的最多的mysql举例,聊聊如何快速恢复数据。,或者。但是我看了看,都需要搞一些安装包,并且我发现有些工具已经不维护了,不清楚有没有啥问题,所以我的诉求是:1)、工具要权威,并且持续迭代2)、不要装一些和恢复数据没关系的包基于以上想法,我找到了一篇国外老哥写的文章,,能看懂英文的,尽量看英文,原文写的很清晰。

2023-08-24 19:00:06 563

原创 mysql死锁分析show engine innodb status

hex 7fffffff,代表16进制的int最大值,要分析为什么是这个数,得先了解计算机的二进制相关的原码、反码和补码的知识,我搜了一篇文章,讲的挺清晰的。innodb这么搞,据说是节省空间,不用专门搞字段识别一个列是否存储的是有符号数。表t中的列如果没有特殊设置,默认是有符号数,意思是这一列,你可以存负数。innodb的规定是:如果表中的列存储有符号数据,此时数据对应的二进制数首位的0和1要互换。这个数是补码,对应的原码就是-1,(大家补完上面原码、反码、补码的知识后,就知道为什么是-1了)

2023-08-09 22:55:50 344

原创 mysql8查看大事务

所以我们要通过mysql的其他表查询这个大事务的详情,尤其是大事务的sql语句,进而知道是在做什么业务。大事务的特点是执行时间长,长期占有锁不释放,导致其他想操作同一行数据的线程阻塞,如果客户端设置了超时时间,超时后,客户端进行重试,又会申请一个mysql线程,然后再阻塞,最终会造成整个mysql库的线程枯竭,整个mysql库不可用,危害极大。至此,我们就得到了大事务的sql语句,接下来,可以根据sql语句对应一下业务模块,进而得出这个大事务能不能kill。很简单,就搞一张表,一个主键,一个业务字段。

2023-06-11 15:16:58 2211

原创 mac m2停止mysql报错:ERROR! MySQL server PID file could not be found!

执行完之后,会输出几个可能的目录,你可以到各个目录下看看有没有my.cnf文件。出现这个问题的原因有很多,我只说下我是怎么解决的,如果你是我这种情况,按照我说的解决,肯定好使。进入/etc目录,可能需要root权限,使用如下命令切换root用户,需要输入你进入mac的密码。datadir一般是/usr/local/mysql/data,根据你自己的目录情况修改即可。然后在etc目录下新建一个my.cnf文件,复制如下内容到my.cnf文件中。首先看一下,你的mysql服务,有没有指定配置文件。

2023-06-10 07:09:10 1963

原创 Mac M2芯片免安装版mysql

每次登录mysql,还得添加/usr/local/mysql/bin前缀,有点麻烦,我们可以配一个环境变量,编辑.bash_profile文件,增加下面的配置。看这个信息的目的是:你在官网下载mysql的时候,不要再下载x86版本,要现在arm版本,因为苹果的M2芯片是基于arm架构。此时重新打开一个终端,进入/usr/local/mysql/bin,免密码登录mysql。此时,可以进入/usr/local/mysql/bin目录,用以下命令登录mysql。注意下载arm版本,下图中,红框框起来的那个。

2023-05-14 21:39:50 2061 4

原创 mac M2安装Homebrew报错unable to access github.com/Homebrew/brew

Homebrew

2023-05-02 22:54:34 1168

原创 redis高可用-哨兵模式原理篇

选择新的主节点、切换主节点这些操作都是哨兵领导者来完成,所以我们根据哨兵领导者的日志,来串一下整个主从切换的流程。

2023-04-06 16:59:01 416

原创 redis高可用-哨兵模式搭建(1主2从3哨兵)

先下载redis单机版安装包,建立一个/opt/redis_sentinel目录,将tar.gz包上传到该目录。然后进入解压目录的src目录,输入如下命令执行编译。

2023-04-06 10:37:16 1838

转载 编译Springboot源码

Springboot源码编译

2023-03-30 20:12:13 137

原创 mysql “可重复读“ 解决了哪些问题,没有解决哪些问题?

在事务A开启事务,未提交事务时,事务B开启了事务,执行了查询操作,此时事务B读取的就是数据库的一个快照。这说明,事务B读到了事务提交的insert语句,然后将其name字段改为了aaaaaa,所以"可重复读"隔离级别并没有解决insert的幻读问题,同理update、delete也是一样的。但是事务B如果执行update、delete、insert,这就不是快照读了,而是当前读,读取的是表最新的数据。1、事务A,执行begin,然后执行update语句,将name由"张三"改成"李四",此时先别提交。

2023-03-30 16:56:46 1546 1

原创 redis集群-机器重启无法自动加入集群

先交代一下背景,如果想直接看解决方案的话,可以直接翻到问题解决。

2023-03-18 19:02:16 808

原创 linux搭建redis集群

可以看到我们从7001节点上执行的set命令,redis集群给我们重定向到了7003节点上。这个原因是:redis集群是用哈希槽存储数据的,一共16384个哈希槽,分布在6个节点上。每次set数据,redis会使用crc16算法计算key应该被分配到哪个哈希槽上,然后会直接重定向到哈希槽对应的节点上。该报错说明缺少ruby环境,redis集群的安装需要依赖ruby环境。使用阿里云主机搭建,一台阿里云模拟6个节点,3主3从。看到以下输出,即为redis集群开始搭建。看到如下日志,说明redis集群搭建成功。

2023-03-17 23:00:50 695

原创 源码分析Spring解决循环依赖的过程

Spring循环依赖

2023-02-09 11:12:21 309

原创 SpringBoot启动流程源码解析

SpringBoot启动流程

2023-02-06 13:06:33 511

原创 0-1背包问题的回溯算法

0-1背包算法的突破口

2023-01-30 10:31:58 150

原创 Autowired注解的执行原理

Autowired注解

2023-01-29 18:32:10 979 2

原创 java实现二叉树的删除节点操作

java实现二叉树的删除节点操作

2022-06-12 16:24:43 853

原创 一个使用快排结合桶排的排序案例

快排+桶排

2022-06-05 13:27:02 123

原创 mac手把手指导安装whistle

最近在和客户端做联调工作,需要经常抓包分析请求。此时就需要一个抓包工具,windows上比较常用的有charles和fiddler,那mac上有没有好用的抓包软件呢?同事推荐了whistle,上午搞了搞,可以成功抓包了,觉着很方便,所以记录一下,希望可以帮到有抓包需求的小伙伴。我这篇文章主要参考的whistle官方的文档,我觉着它写的不清晰,我重新整理了一下,如果觉着我写的不清晰,可以移步官网whistle官网安装whistle,一共分为以下几步,缺一不可。1.安装node2.安装whistle3

2022-05-14 12:21:39 7638

原创 二分搜索的时间复杂度分析

先贴上二分查找的java代码实现public static int binarySearch(int[] a,int n,int value){ int low = 0; int high = n - 1; while (low <= high) { int mid = (low + high) >> 1; if (a[mid] == value) { retu

2022-05-13 14:10:33 2398

原创 Collections.sort是稳定排序吗?

Collections.sort的实现

2022-05-03 12:21:06 1377

原创 O(n)时间复杂度内,查找数组中第K大元素

这个题目,是《极客时间》的算法专栏中的一个练习题。我觉着这个题挺有意思,而且感觉也有一定的实战意义。把专栏中的解法摘抄了下来,在ide中运行了一下,运行通过。这个题的意思是这样的。假设有一个数组[2,3,1,7,5,6],我们要找它的第3大元素,应该是数字3。但是这个题,还有以一个限制,算法的复杂度是O(n)。这就意味着冒泡、直接排序的算法就不行了。这里借鉴了快速排序算法中的分区算法。看一下代码实现/** * search Nth element in array. */public class S

2022-03-15 13:43:24 873

原创 冒泡排序的执行流程

上学学计算机的时候,最开始学排序的时候,应该都是先学的这个算法吧。很经典。先从字面上了解一波这个算法,我们日常生活中会见到很多冒泡的场景。烧开的水其实就很形象,气泡是一个接着一个冒出来的。冒泡排序的过程其实和这个过程就很相似。我从网上找了一个动图,很直观。动图来源:https://www.cnblogs.com/fivestudy/p/10064969.html看一下java代码的实现public class BubbleSortSolution { public static void m

2022-02-25 13:13:29 672 1

原创 选择排序的执行流程

选择排序,顾名思义,选择然后进行排序,这个算法的核心思想就是从未排序区间中选择较小的元素添加到已排序区间的末尾。我在网上找了一个动图,看着挺直观的,大家可以看一下。动图来源:https://www.cnblogs.com/fivestudy/p/10064969.html可以看到每次排序,都会从未排序区间中找出最小的元素添加到已排序区间的末尾。java实现public class SelectSortSolution { public static void main(String[] a

2022-02-24 21:32:55 661

原创 希尔排序的执行流程

在上一节,我们聊了一下插入排序算法,这种算法每次比较,都需要移动元素,给待插入数据腾位置,如果我们大部分的数据都是有序的,只有一个数据无序且最小并处于数组末端,我们移动这个小元素前面的数据其实没有任何意义。由此,诞生了希尔排序(也叫递减增量排序),希尔排序就是为了解决插入排序大量移动元素的问题。希尔排序的思路是:初始化一个gap变量,每次跳跃gap步长进行元素比较。一轮比较之后,gap下标左边的元素和gap右边的元素大体上都有序了。我们举个例子:8,7,2,9,6,1第一轮比较,gap = (arra

2022-02-21 13:23:37 550

原创 插入排序的执行流程

插入排序,从该算法的名字中也可以看出,这种算法会有插入操作,如果我们用数组作为底层的数据结构实现该算法的话,进行插入操作,需要移动现有元素,空出位置后,才能进行插入操作。插入排序的排序思路,主要就是将未排序的数据和已排序的数据进行比较,找到较小的元素后,移动到已排序区间中。插入排序是原地排序算法,也可以是一种稳定排序算法(如果元素相等,我们将后来的相等元素添加到已排序区间的末尾即可)。插入排序在实战中用的很少,主要原因是这种算法可能会演变成O(n²)。下面,我们看一下java的实现public stati

2022-02-21 12:52:28 572

MemoryAnalyzer.zip

dump日志分析利器

2021-02-02

空空如也

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

TA关注的人

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