自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LeoHan

工作学习笔记、心得

  • 博客(249)
  • 资源 (12)
  • 收藏
  • 关注

原创 redis源码浅析-hash表实现

redis中的hash扩容采用的是一种渐进式hash的策略, 我们都知道,redis执行线程是单线程,如果一个hash表数据量比较大,那么扩容就比较耗费时间,redis采取是的一种渐进式hash策略,采用。可以看到,在向hash桶中进行插入的时候,处于同一个hash桶上的链表,新插入的元素在在链表的头部进行插入的。hash表在初始创建的时候,就是建了一个空的dict ,在添加元素的时候,去进行实际节点的新增。hash表的查找相对来说比较简单,就是通过key的hash找到对应的桶上的链表,然后遍历即可。

2023-06-05 19:40:11 209

原创 redis中quicklist浅析

前面我们分析了redis中的ziplist相关实现,在结构上一个链表结构,但是在底层用的是一整块内存,在数据量较小的时候,其查找和分配都比较快,但是当数据量比较大的时候,查找和分配就比较慢了。quicklist底层是基于ziplist的,其中。表示的是quicklist中所有的ziplist的。默认情况下,quicklist的容量大小为。数量之和,而len表示的。因此,redis提供了。

2023-05-31 19:09:44 276

原创 redis源码浅析-ziplist实现

redis中的list是有多种实现的,其中一种是ziplist,其介绍如下ziplist 是一个经过特殊编码的双向链表,旨在提高内存效率。 它存储字符串和整数值,其中整数被编码为实际整数而不是一系列字符。 它允许在 O(1) 时间内在列表的任一侧进行推送和弹出操作。 但是,由于每个操作都需要重新分配 ziplist 使用的内存,因此实际复杂性与 ziplist 使用的内存量有关。ziplist是一个双向链表结构,是一整块紧凑的内存块,当大小不足需要重新扩展,底层使用je_realloc进行扩展。t

2023-05-22 20:21:47 634

原创 redis源码解析- sds实现

redis的sds实现浅析

2023-05-17 20:20:48 77

原创 查询mysql各个库的大小

查询mysql各个库的使用量

2023-02-01 10:03:10 119

原创 win10设置同时代理连接多个机房设置

win10设置同时代理连接多个机房设置

2022-11-06 19:26:44 1421

原创 git回滚reset到指定分支

git回滚到指定分支,reset 分支

2022-10-17 16:20:51 1179

原创 springcloud openfeign通过map传递form表单参数

oepnfeign通过map传递form参数

2022-10-11 19:24:11 2384

原创 elasticsearh中查询类型,term、match、match_all、multi_match、range、bool、boosting等

elasticsearch查询类型

2022-08-19 22:59:50 3894

原创 elasticsearch中数据类型,字符、数字、日期、地理位置、符合数据类型等

elasticsearch中数据类型

2022-08-19 22:57:19 713

原创 elasticsearch中文档操作,索引导入数据、批量导入、删除文档

elasticsearh相关操作

2022-08-19 22:52:09 800

原创 elasticsearch索引操作,索引创建、索引更新、索引删除

elastic中索引相关操作

2022-08-19 22:48:47 3038

原创 elasticsearch7.8安装

elasticsearch 集群安装

2022-08-19 22:47:56 488

原创 使用debezium、kafka-connect将postgres数据实时同步到kafka中,表topic重新路由

使用debezium和kafka-connect实现postgres数据库实时同步到kafka中

2022-08-10 16:03:11 2258

原创 从底层了解JVM的volatile实现,CPU Cache、缓存一致性MESI、Store BufferI、nvalidate Queue等知识

JAVA中volatile底层原理

2022-07-16 17:57:22 517

原创 java中String,StringBuilder,StringBuffer实现原理,优化

java中String,StringBuilder,StringBuffer实现原理

2022-06-28 18:35:44 391

原创 golang项目依赖管理工具go vendor,go mod

go项目依赖管理工具 go vendor go mod

2022-06-21 19:45:42 1079 1

原创 java中异步调用,Callable,Future,FutureTask,CompletableFuture如何使用

我们知道,在java中一般多线程编程时经常会使用Thread或者Runnable来进行自定义的线程运行逻辑,但是如果我们需要在一个线程运行结束时返回给另外一个线程结果,上面两个实现都不是很容易实现,一般可能需要另外的实现,比如通过一个临时变量共享。在java中,提供了Callable能够返回结果的线程方法调用。我们看一下下面这个实现: ExecutorService executor = Executors.newFixedThreadPool(2); Callable<Stri

2022-05-19 15:52:45 1054

原创 java中wait,notify,notifyAll,sleep方法的作用和区别

在进行多线程编程时,进程会遇到多线程之前的同步已经等待场景。在java中,Object类提供了wait、nofity、notifyAll用来进行线程间的同步。一般如果我们调用wait、nofity、notifyAll都是结合synchronized同步关键字来使用: new Thread(()->{ synchronized (monitor){ try { System.out.println("1

2022-05-17 19:26:42 298

原创 golang中指针,new和make函数作用

我们知道golang中的传递都是基于值传递,如果一个结构体比较大,这时候值传递需要复制的内容就比较多同时由于是基于值复制,耗费空间和时间,另外,基于值传递我们在调用的函数中对传入的参数进行修改,对于原值是没有任何影响的,也就是我们无法在函数中对传入的参数的原值进行修改因此golang中提供了指针,和c、c++中的指针的概念类似,这时候传递的是指针,也是值复制,但是复制的是指针(指针比较小),这样我们既能够快速的将参数传递过去,同事也能够对原值进行修改。需要注意的是,golang中存在另种内存模块,即我们

2022-05-13 15:28:07 438

原创 golang中生成随机数

golang中生成随机数可以使用rand提供的相关接口,但是需要注意的是,rand必须要指定一个种子,一般采用当前时间的纳秒。func New(src Source) *Rand { s64, _ := src.(Source64) return &Rand{src: src, s64: s64}}func NewSource(seed int64) Source { var rng rngSource rng.Seed(seed) return &rng}通过上述两

2022-05-12 14:11:53 1754

原创 golang中定时器实现,Ticker,Timer

在golang中,我们可以通过time包的Sleep、Ticker、Timer来实现定时效果。Sleep先看Sleep如何实现一个定时:func main() { var flag chan int go func() { for { time.Sleep(time.Duration(time.Second*5)) fmt.Println(time.Now().Format("2006-01-02 15:04:05")) } }() <-flag}Ticker

2022-05-11 17:02:30 865

原创 golang中日期操作,日期格式化,日期转换

golang中并没有像java一样提供类似yyyy-MM-dd HH:mm:ss格式的操作,而是将其定义为golang的诞生时间:2006-01-02 15:04:05 -0700 MST注意这在golang的日期格式化里不是一个具体日期,而是格式,这样如果我们需要格式化日期,可以如下操作timeNow := time.Now()fmt.Println("yyyy-MM-dd HH:mm:ss" ,timeNow.Format("2006-01-02 15:04:05"))// 打印: yyyy-

2022-05-11 14:53:28 3684 1

原创 golang中连接mysql数据库,操作数据库

golang中连接数据库需要首先下载对应数据库的客户端驱动,我们以mysql为例:首先下载mysql客户端驱动:go get github.com/go-sql-driver/mysql然后通过sql.Open获取一个数据库连接:url :="root:123456@tcp(127.0.01)/golang"con,err := sql.Open("mysql",url)接下来我们看看怎么操作数据库:package modelimport ( "database/sql" "f

2022-05-11 14:07:36 1508

原创 golang中内存管理、分配

我们知道传统C/C++编程,程序员是需要自己来手动管理内存的,一般通过malloc来申请内存,通过free、delete来释放内存,而这两个函数操作的对象一般都是指针。而对于高级语言(Java、Golang、Python等),程序员在编写代码时,则无需关系内存的申请和释放,能够从内存的管理中解脱出来。一般程序运行都有所谓的堆区和栈区。栈区是方法运行的区域,当调用一个方法的时候,该方法入栈,然后一些局部变量在栈上分配,当函数执行完之后,栈上对应函数空间出栈销毁。如果我们需要将函数执行过程中的一些数据返回,一

2022-05-06 17:42:38 2105

原创 golang中并发、gorutine

我们知道golang的一个重要特性就是能够支持极高的并发。而实现这个特性则是golang中的rorutine机制。在说goroutine之前,我们先说明几个概念:进程、线程、协程进程:程序运行的基本单位,一个运行的程序就是一个进程,进程之间相互隔离,拥有不同的内存空间,无法共享内存数据。线程:线程也可以说是轻量级的进程,一般一个程序(或者说一个进程)包含若干个线程,线程依赖于进程,一般进程是作为分配资源的基本单位,而把线程作为独立运行和调度基本单位。同一个进程下的不同线程拥有同一个内存空间,可以共享内存

2022-05-04 23:01:36 450

原创 golang中异常处理

程序在运行过程中如果出现了问题,可以通过抛出异常、捕获异常来进行异常的处理,在golang中,异常的接口为error:type error interface { Error() string}因此,只要一个结构体实现了Error() string方法,就是实现了error接口:type MyError struct {}func (err *MyError)Error() string{ return "this is MyError"}golang中可以通过panic来抛出异常

2022-05-03 17:27:17 2512

原创 golang中结构体

golang其实并不是一个完全意义上的面向对象语言,其实现面向对象的多态主要基于接口和结构体实现。在golang中结构体与c/c++中的结构体类似,用来定义复杂的数据类型,一般结构体定义如下:type StructName struct{ fieldName1 type1 fidldName2 type2 ...}需要注意的是:结构体的包名在同一个包内必须唯一,不能重复结构体的字段必须唯一,不能重复同类型的结构体字段可以放在一行定义一般结构体实例化可以通过如下方

2022-05-02 23:01:32 1532

原创 golang中接口、继承

在面向对象编程中(OOP)接口定义对象的一系列行为,具体对象实现接口的行为。在golang中,接口就是一组方法签名,如果某个类型实现了该接口的全部方法,这个类型就实现了该接口,是该接口的实现。在golang中接口定义示例如下:type MyInterface interface { SayHello() GetAge() int}这样我们就定义了一个MyInterface类型的接口,如果我们想要实现这个接口,只要一个类型实现MyInterface的两个方法:SayHello、GetAge:t

2022-05-01 23:08:14 2887

原创 golang中函数与方法

函数是golang中的`一等公民,可以作为普通变量、方法参数、方法返回值等,一般golang中函数定义如下:func name(arg1 type1,args2 type2)(result1 type1,result2 type2){ ....}也可以省略返回列表的结果名称:func name(arg1 type1,args2 type2) (type1,type2){ ....}如果返回参数只有一个,可以不用括号:func name(arg1 type1,args2 ty

2022-04-26 17:54:17 1592

原创 golang中条件、循环、控制语句

这个篇幅是学习golang入门记录,方便查找for循环for循环还是golang中的唯一循环语句,golang中没有while循环。for循环形式一:for i:=0;i<10;i++ { fmt.Println(i)}这是标准的for循环格式for循环形式二index := 0for index < 10 { fmt.Println(index) index ++}或者:index := 0for ;index < 10; { fmt.Pr

2022-04-26 17:38:04 851

原创 golang变量定义、数据类型、可见性

golang中主要基础数据类型如下:类型描述uint8无符号 1个字节8位整型 (0 到 255)uint16无符号 2字节16位整型 (0 到 65535)uint32无符号 4字节32位整型 (0 到 4294967295)uint64无符号 8字节64位整型 (0 到 18446744073709551615)int8有符号 1字节8位整型 (-128 到 127)int16有符号 2字节16位整型 (-32768 到 32767)

2022-04-26 17:15:08 1080

原创 Mysql中update select更新数据,insert ignore into

在mysql中我们可以通过使用另外一个表的数据来更新当前表数据:update test001 a INNER JOIN test002 b on a.id=b.idset a.name=b.name ,a.age=b.agewhere b.age > 30

2022-03-22 10:57:23 13857

原创 Postgres中通过update select来进行更新数据

在postgres中我们可以通过关联查询另外一张表来关联当前表的数据:update 待更新表 aset 待更新表_字段一 = b.字段一 ,待更新表_字段二 = b.字段二from 关联表 b where a.关联字段= b.关联字段例如:update test001 a set name= b.name,age=b.agefrom test002 b where a.id= b.id...

2022-03-22 10:07:54 9546 3

原创 数据结构之红黑树,2-3-4树,插入旋转调整

红黑树其实是由2-3树演变来的,如果想要理解红黑树,可以先看看2-3树2-3树插入逻辑:先找插入结点,若结点有空(即2-结点),则直接插入。如结点没空(即3-结点),则插入使其临时容纳这个元素,然后分裂此结点,把中间元素移到其父结点中。对父结点亦如此处理。(中键一直往上移,直到找到空位,在此过程中没有空位就先搞个临时的,再分裂。)2-3树插入算法的根本在于这些变换都是局部的:除了相关的结点和链接之外不必修改或者检查树的其他部分。每次变换中,变更的链接数量不会超过一个很小的常数。所有局部变换都不会影响整

2022-02-28 11:53:51 639

原创 java并发控制类之CountDownLatch、CyclicBarrier、Semaphore

java并发包中提供了CountDownLatch、CyclicBarrier、Semaphore这三个类可以来实现一些线程之间的状态同步。这三个本质上都是基于java并发包的AQS来实现的。CountDownLatch首先来看CountDownLatch,其可可以让一个线程等待其他线程都执行完之后才开始执行。其典型用法如下: CountDownLatch countDownLatch = new CountDownLatch(3); new Thread(new Runnable()

2022-02-23 14:50:43 301

原创 Linux下常用java问题排查命令、工具

java常用性能诊断工具、命令

2022-02-21 11:30:03 6195

原创 java中指令重排、内存可见性

由于现在多核计算机的发展,以及硬件性能的快速发展,CPU的运行速度也越来越快,而内存的速度与CPU的速度差了几个量级,基于成本和性能的考虑,现代计算机在CPU和内存之间都会增加一个缓存层,一般分为L1,L2,L3 cache。因此cpu在计算的时候首先会将数据从内存加载到缓存,然后通过读取缓存中的数据进行计算,当计算完之后,在一定时机写回到内存中去(并不是立马写回)。这样就会导致一个问题,在多线程环境下,多个线程都读取了一个数据,然后修改,这时候就发生了数据不一致问题。另外,在我们编写的代码编译完之后,

2022-02-17 17:18:55 564

原创 redis 主从同步、集群、持久化

redis有两种方式实现持久化:RDB和AOFAOF:类似数据库WAL 机制,但是redis是先执行命令,然后在记录AOF日志,是一种写后日志而不是咱们常说的写前日志(这样做主要是为了redis在写入日志之前不会对命令进行语法检查,只记录成功的命令,避免了出现记录错误命令的情况,并且命令执行完之后在记录不会阻塞当前的写操作,但是这样也会带来风险:数据可能丢失(执行完命令宕机)、可能阻塞其他他操作(AOF日志需要写磁盘))另外,如果运行时间较长,AOF日志比较快,在重启恢复的时候,较大的AOF会导致恢复较

2022-02-13 22:35:39 1232

原创 MySql中InnoDB锁注意事项

通过前面分析,Mysql事务级别,锁的级别分类,redo log和undo log,事务实现机制我们知道MySQL中有多中锁类型,那么这些锁是怎么作用的呢?总结下来如下(在InnoDB RR级别下):1. mysql中锁都是基于数据的,RR级别上默认就是使用next-key lock2. 在数据查找过程中访问到的对象就会加锁1. 原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭 区间。2. 原则 2:查找过程中访问到的对象才会加锁。

2022-02-10 21:56:56 715

conntrack-tools_offline_dependency.tar

conntrack-tools离线安装包和其依赖

2021-08-14

kubeadm-init-list.zip

kudeadm init需要的依赖镜像包

2021-08-10

conntrack-tools离线宝及其依赖.zip

conntrack-tools离线宝及其依赖

2021-08-09

elrepo-release-6-12.el6.elrepo.noarch.rpm

centos6内核升级,elrepo原,docker安装centos6升级centos7

2021-03-23

keepalived-2.0.19.tar.gz

keepalived安装包,keepalived-2.0.19.tar.gz,省的去官网下载,太慢,可以试试这个,

2020-10-14

mysql-5.6.46-leo.tar

mysql-5.6.46安装包,不用安装,直接部署配置即可,省去了编译的步骤mysql-5.6.46安装包,不用安装,直接部署配置即可,省去了编译的步骤

2020-07-13

postgresql-9.6.9.tar.gz

postgresql9.6安装包

2020-07-09

gcc-4.9.4.包含依赖tar.gz

gcc 4.9.4安装包,包含了 mpc,mpfr,gmp依赖,直接编译就行,不用下载依赖,redis6需要gcc>=4.9

2020-05-14

gcc-4.8.2.tar.gz包含依赖

gcc满足c11,unrecognized command line option "-std=c11",更新gcc版本到新版本,包含了需要的依赖不需要再去下载依赖

2020-05-12

Posgresql主从流复制相关配置

Postgresql9.6基于主从流复制的配置,包含主节点: postgresql.conf, pg_hba.conf,从节点: postgresql.conf,pg_hba.conf,recovery.conf

2019-03-14

tomcat8开启apr需要相关的组件,包含jdk,apr,apr,util,tomcat8,openssl

tomcat8开启apr需要相关的组件,包含jdk,apr,apr,util,tomcat8,openssl-1.0.2o1.2里面的都在,想要Linux下的jdk都在里面

2018-08-16

人工智能的未来

人工智能,深度学习的介绍和相关的未来趋势人工智能,深度学习的介绍和相关的未来趋势人工智能,深度学习的介绍和相关的未来趋势

2018-08-15

空空如也

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

TA关注的人

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