自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 资源 (3)
  • 收藏
  • 关注

原创 Go 限流器-漏桶 VS 令牌桶 常用包原理解析

本文主要介绍两个包Uber漏桶,time/rate令牌桶 可以了解到: 1. 使用方法 2. 漏桶/令牌桶 两种限流思想 and 实现原理 3. 区别及适用场景 4. 应用Case

2024-03-21 20:45:00 1402 1

原创 Golang Gorm 自动分批查询

如果目标是查询到所有结果。由于该方法每次查询到的结果会丢弃,需要手动将查询到的结果补充到外部大列表中。总共1408条数据,每一批查询500个,查询三次,最后将结果拼接到大列表中。目标查询全量数据,但需要每次Limit分批查询,保护数据库。

2024-03-21 20:30:00 947

原创 Go 空切片 VS nil切片

在 Go 语言中,空切片和 nil 切片是两种不同的概念。

2024-02-19 21:00:00 806

原创 MySQL JSON数据类型

在日常开发中,我们经常会在 MySQL 中使用 JSON 字段,比如很多表中都有 extra 字段,用来记录一些特殊字段,通过这种方式不需要更改表结构,使用相对灵活。目前对于 JSON 字段的实践各个项目不尽相同,MySQL 表结构中使用的字段类型一般为 text、varchar 或者 json。

2024-01-22 22:00:00 1209 2

原创 gorm.PrepareStmt模式使用不当问题查询

直接找到占用内存最大的对象 PreparedStmtDB,查看查询走到的逻辑(图1),prepare方法会优先在db.Stmts这个map中看存不存在对应query(SQL),如果存在就直接返回,如果不存在会创建一个新的放到这个map中。正常来说,dao层查完数据库之后,对象应该会释放,最终被gc回收,但这里 InitUserCacheRefresh 代码里的对象长期持有引用,占用内存达400M+,感觉发生了内存泄露,所以排查下。内存占用10%以内,在QPS无明显变化的前提下,内存占用50%左右。

2024-01-02 22:00:00 1193

原创 Go中interface != nil不一定不是nil

interface{} 值!= nil不一定不是nil,应使用reflect库判断是否是nil。

2024-01-02 19:38:11 674

原创 Git通过rebase合并多个commit

在使用 Git 作为版本控制的时候,我们可能会由于各种各样的原因提交了许多临时的 commit,而这些 commit 拼接起来才是完整的任务。那么我们为了避免太多的 commit 而造成版本控制的混乱,通常我们推荐将这些 commit 合并成一个。

2023-11-15 21:00:00 631

原创 如何使用chorme版本对应的ChromeDriver(不用更改Chrome版本)

下载ChromeDriver的地方,没有对于高版本的下载包,可是我们的浏览器版本是 117.0.5938.88,我又不想降低本地的Chrome版本,因为这样也太蠢了,每次更新后可能老版本就不适用了。不手动下载,而是通过代码全自动下载好ChromeDriver(因为文件不大,下载耗时可以忽略,或者代码初始化的时候即下载好)发现这个老哥写的比较认真,如果还有问题,可以照这个参考一下。

2023-09-21 22:15:00 1309

原创 Go业务开发常用关注点

本文对实际开发场景中面对高频的场景,总结出来的一些处理方案,希望能对业务开发的同学提供帮助!

2023-09-21 17:51:30 761

原创 Mysql Order单条记录出现在两页

同一条记录在上述两种查询中都出现了在有limit的情况下,order by的元素并不能唯一区分一个记录。分页重复数据是否出现与排序字段数据唯一性有关,与排序字段是否有序无关,换句话说,只要排序字段的数据能够保证唯一性(如主键、唯一索引、不重复的普通字段),那么分页就不会存在重复数据,否则会有可能出现重复数据在不同分页中。解析在MySQL 5.6的版本上,优化器在遇到order by x limit m,n语句的时使用priority queue进行了优化。使用优先级队列priority queue的目的

2023-09-20 11:47:45 587

原创 Golang 中如何判断两个结构体相等

DeepEqual函数用来判断两个值是否深度一致。

2023-08-29 16:25:29 1462

转载 多个单列索引和联合索引的区别详解

为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。

2023-08-17 12:52:15 211

原创 Go init 顺序 使用建议

单个包中,执行顺序:**import --> const --> var --> init()**多个包中,如果一个包导入了其他包,则首先初始化导入的包

2023-08-03 14:36:39 225

原创 Golang 浮点数运算 避免精度损失 Decimal包

Golang小数计算存在精度损失Decimal由于golang中默认没有decimal类型,如果想使用decimal类型需要通过第三方包

2022-06-07 21:45:00 2014 3

原创 Mysql查询数据库字段枚举的类型有哪些

例:查询table_example表中,group_type=2的情况下,status一共有几种枚举的类型返回结果:即返回的结果中一共有两种值type,分别是begin,end

2022-06-06 21:45:00 1016

原创 依赖注入(DI):对比Java,Go实现方式

熟悉Java语言的同学一定不陌生,依赖注入(Dependency Injection)是Spring框架中的设计基石,有开发经验的同学一定会熟知它的概念(当然也是面试常考问题)。然而在Golang中,我发现很多项目的代码缺少了这一部分,这也是由于Golang并不是严格意义上的面向对象的编程语言。本文将从Java与Go常用框架的DI实现方式分析,详细介绍他们之间的区别。

2022-05-03 16:31:08 818

原创 golang init顺序

init 顺序1、在同一个 package 中,可以多个文件中定义 init 方法2、在同一个 go 文件中,可以重复定义 init 方法3、在同一个 package 中,不同文件中的 init 方法的执行按照文件名先后执行各个文件中的 init 方法4、在同一个文件中的多个 init 方法,按照在代码中编写的顺序依次执行不同的 init 方法5、对于不同的 package,如果不相互依赖的话,按照 main 包中 import 的顺序调用其包中的 init() 函数6、如果 package 存

2022-04-13 22:00:00 3296 2

原创 git revert 之后 找回原来的代码

git revert如果需要回退线上的代码,一般会通过git revert ${commit hash} 新添加一个提交,返回之前的版本。相比 reset ,revert 会在提交历史中增加一个新的提交,而不会对之前的提交进行任何更改。 默认情况下 revert 会自动执行如下步骤:将反转指定提交的更改合并到工作区将更改添加到暂存区创建新的提交git revert b1hvh3u撤销 git revert如果后续,需要把这份代码找回并合并到master,只需要把之前revert的那条c

2022-04-11 22:00:00 8460 2

原创 Go 排序 sort.Slice 及其他方法

自定义排序[最常用]sort.Slice 不稳定排序sort.SliceStable 稳定排序family := []struct { Name string Age int}{ {"Alice", 23}, {"David", 2}, {"Eve", 2}, {"Bob", 25},}// Sort by age, keeping original order or equal elements.sort.SliceStable(fa

2022-04-11 21:30:00 3672

原创 回滚代码 git revert 用法

代码因为种种原因需要回滚时,除了部署平台要回退,代码也一定要回退成之前的版本,不然多人协作的情况下,其他同学很可能会直接把自己的代码协同一起发布。git revertgit revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交 git revert HEAD //撤销前一次 commit git revert HEAD^ //撤销前前一次 commit git r.

2022-04-07 20:00:11 759

原创 MySql 分组后获取距离时间最近的第一条数据

按照user_id 分组,取每组中update_time 最大的那一条记录。本质有两种方法,目前推荐采用第二种// 低版本5.7以下可以生效SELECT *FROM (select * from tabletable where xxx order by update_time DESC) b GROUP BY b.user_id;// 所有版本均适用SELECT t.*FROM ( SELECT user_id, MAX(update_time) as update_tim

2022-03-18 22:00:00 5354 4

原创 Go 单引号 双引号 反引号

单引号int32类型,获得值得unicode值双引号字符串字面量,不支持多行,支持转义反引号原生的字符串字面量,可以多行,不支持转义,多用于多行消息等package mainimport "fmt"func main() { a := 'q' fmt.Printf("value=%v; type=%T\n", a, a) // output: value=113; type=int32 b := "you are beautiful\n" fmt.Println(b) //

2022-03-08 22:30:00 235

原创 Goland goimport格式规范

一般要求先导入公共资源包,再导入自己需要的特殊资源包作用效果标准库、当前工程包、golang官方包、初始化包和github.com仓库的引入进行分类、排序,在不容分类间使用空行进行区分。方法Preferences–Editor–Code Style–Go–Imports勾选Move all imports in a single declarationGroup stdlib imports Move allstdlib imports in a single group...

2022-03-07 14:51:05 791

原创 MySQL binlog format主从复制各模式区别

名词释义STATEMENT causes logging to be statement based. 不安全,快速ROW causes logging to be row based. 安全,有可能执行缓慢,效率不高MIXED causes logging to use mixed format. 根据情况选择合适的解决方案:判断陈述是否是不确定性。有可能造成不安全结果使用方式mysql> SET GLOBAL binlog_format = 'STATEMENT';mysql>

2022-03-06 21:40:03 449

原创 用户-粉丝关注表设计与实现

一、数据结构分析 用户关注粉丝是一个多对多的数据模型,分析对象的数据特征,我们给每个用户设计一个关注者属性和粉丝属性,用于存储用户的关注者id和粉丝id,如用户1: $arr1 = [ 'follow' => '[2,3,4], 'fans' => [4,5,6],]二、用户逻辑关系梳理 在用户关注粉丝模型中,有两种常见场景: 查看自己的粉丝或者关注列表: 这种情况下最多会出现三种关系: 其中1表示仅为本人所关注的人,2表示仅为本人的粉丝,3表示互粉 查看别人的粉丝或者关注

2021-09-17 21:31:32 4109

转载 linux 抓包tcp

tcpdump是linux下的网络数据包截获分析工具。在linux的日常网络管理中,tcpdump的使用频率很高,熟练掌握对提高工作效率很有帮助。 支持针对网络层、协议、主机、网络或端口的过滤。并提供and、or、not等逻辑语句帮助去除无用的信息。简介网络数据包截获分析工具。支持针对网络层、协议、主机、网络或端口的过滤。并提供and、or、not等逻辑语句帮助去除无用的信息。tcpdump - dump traffic on a network例子不指定任何参数监听第一块网卡上经过的数据

2021-09-16 15:47:31 1058

转载 golang 基本数据类型占用大小

int8: 8位,就是一个字节int16: 2个字节int32: 4个字节int64:8个字节float32: 4个字节float64: 8 个字节int 比较特殊,占用多大取决于你的cpu32位cpu 就是 4个字节64位 就是 8 个字节float32: 4个字节float64:8个字节string英文的ascii的string 1个英文字符或英文标点占1byte中文的string 一个文字占用 3 byte要搞清楚这个问题先要了解几个常用的存储单位的转换1.bit(位)

2021-09-16 09:50:03 3098

原创 golang heap堆写法 大顶堆排序结构体

leetcode 23 合并K个升序链表给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。核心:heap堆新建的需要是slice形式的才可以排序,即需要包装两层需要注意结构体slice中元素是否是指针/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ import

2021-09-15 17:34:01 476

原创 输入两个数字a,b k自增,从a到b最小移动次数

两个正整数a,b,让a变为b,每次对a进行加k或者减k操作,每次k进行一次自增k=k+1(k初始值1)求自增多少次可以让a变为b,求最小操作次数输入第一行t,接下来t行,每行有两个正整数a,b1<=t<=100, 0<=a,b<=10^9,0<=|a-b|<=100输出为t行,每一行为一组答案,表示最小操作次数参考:https://blog.csdn.net/weixin_33796177/article/details/91957124package main

2021-09-10 20:42:06 290 1

原创 Golang前序遍历+后序遍历(N叉树)中序遍历(二叉树) 统一规范化写法 迭代法

前序遍历:采用stack(先进后出),从子节点反序灌入/** * Definition for a Node. * type Node struct { * Val int * Children []*Node * } */func preorder(root *Node) []int { stack := make([]*Node, 0) res := make([]int, 0) if root == nil{ return

2021-09-09 21:12:46 396

转载 Go 大顶堆 小顶堆 Heap使用方法

Go 提供了 container/heap 这个包来实现堆的操作。堆实际上是一个树的结构,每个元素的值都是它的子树中最小的,因此根节点 index = 0 的值是最小的,即最小堆。堆也是实现优先队列 Priority Queue 的常用方式。堆中元素的类型需要实现 heap.Interface 这个接口:type Interface interface { sort.Interface Push(x interface{}) // add x as element Len()

2021-09-08 12:35:15 2647 5

转载 Git Diff 算法——Myers算法

diff 是我们每天都要使用的一个功能,每次提交时,我都习惯先用 git diff --cached 看看这次提交更改了些什么,确定没问题,然后再 git commit。git 生成的 diff 非常直观,直观到我从来都没有去思考过 diff 是怎么生成的,觉得这应该是很简单的一件事,两个文件做个对比,不就行了。什么是直观的 diff我们先简单定义一下什么是 diff:diff 就是目标文本和源文本之间的区别,也就是将源文本变成目标文本所需要的操作。git 为我们生成的 di...

2021-09-06 23:28:30 2743 2

原创 缓存及对应解决方案

为什么用缓存使用缓存的目的,就是提升读写性能。而实际业务场景下,更多的是为了提升读性能,带来更好的性能,更高的并发量。日常业务中,我们使用比较多的数据库是 MySQL,缓存是 Redis 。Redis 比 MySQL 的读写性能好很多。那么,我们将 MySQL 的热点数据,缓存到 Redis 中,提升读取性能,也减小 MySQL 的读取压力。例如说:论坛帖子的访问频率比较高,且要实时更新阅读量,使用 Redis 记录帖子的阅读量,可以提升性能和并发商品信息,数据更新的频率不高,但是读取的频率很高,

2021-08-17 10:56:03 164

转载 数组实现循环队列

循环队列优势:避免定长数组前面有数据弹出后的空间浪费定义:1、队列是一个有序列表,可以用数组或是链表来表示 2、遵循先进先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出数组模拟队列思路:1、定义三个变量maxSize:队列的最大长度front:指向对列的头部,随着数列的输出而改变,初始值为-1rear:指向队列的尾部,随着队列的输入而改变,初始值为-1 2、将数据添加到队列里面(addQueue方法)添加数据时将尾指针rear+1,front == rear时队列为空rear == maxSi

2021-07-23 21:01:31 534

转载 Go内存模型

前言这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。Go这门语言抛弃了C/C++中的开发者管理内存的方式,实现了主动申请与主动释放管理,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为高生产力语言的原因之一。我们不需要精通内存的管理,因为它确实很复杂,但掌握内存的管理,可以让你写出更高质量的代码,另外,还能助

2021-07-23 10:11:14 313

原创 Linux grep和find的区别

Linux grep和find的区别这是两个不同的命令,关于grep:Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。而linux下的find功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。语法:find 起始目录 寻找条件 操作说明:find命令从指定的起始目录开始,递归地

2021-06-24 13:15:29 345

原创 RPC-API访问过程流图

2021-04-13 11:03:09 168

转载 堆排序

预备知识堆排序  堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆  堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:大.

2021-04-07 10:56:08 397

原创 Ajax 应用场景 & Jquery实践

Ajax不是万能的,在适合的场合使用Ajax,才能充分发挥它的长处,改善系统性能和用户体验,绝不可以为了技术而滥用。Ajax的特点在于异步交互,动态更新web页面,因此它的适用范围是交互较多,频繁读取数据的web应用。现在来看几个Ajax的应用实例,读者可以了解如何使用Ajax技术改进现有的web应用系统。 场景1. 用Ajax进行数据验证 在填写表单内容时,需要保证数据的唯一性(例如新用户注册填写的用户名),因此必须对用户输入的内容进行数据验证。 ...

2021-03-16 15:37:25 175

转载 Redis的单线程与多线程

Redis是目前广为人知的一个内存数据库,在各个场景中都有着非常丰富的应用,前段时间Redis推出了6.0的版本,在新版本中采用了多线程模型。 因为我们公司使用的内存数据库是自研的,按理说我对Redis的关注其实并不算多,但是因为Redis用的比较广泛,所以我需要了解一下这样方便我...

2021-03-16 15:15:41 497

CatalogCrossSell.xls

CatalogCrossSell.xls

2021-04-12

【中国大学MOOC】算法设计与分析-课件

中国大学MOOC-算法设计与分析-课件【北航】 代码实现:见本人博客 链接:https://www.icourse163.org/course/BUAA-1449777166

2020-11-07

【中国大学MOOC】java程序设计-week11-编写一个具有图形用户界面的应用程序

个人收支记账本--应用程序 功能: 读取txt文件中记录的用户的收支情况并显示; 插入收支情况记录表,系统自动计算该用户的结余金额。 配置&使用方法: 将homework11压缩包解压缩,添加到项目src文件夹下,直接点击运行; 点击“选择文本文件载入”,(默认路径为D盘)选择本文件夹下的file.txt,即可显示收支情况; 点击"插入收支记录",填写收入,支出(均为Double类型),系统自动更新计算结余金额。 文件说明: homework11.java:项目代码; file.txt: 用户的收支情况txt记录文件; image.jpg: 用户的头像; 采用技术:

2020-10-08

空空如也

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

TA关注的人

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