自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 K8s入门

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。将这些信息放在 secret 中比放在。PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置。访问:ip + 端口 / 名称.域名空间.svc +端口。pod会自动重启,若机器宕机会在其他机器中启动该pod。Pod里面的配置文件会跟着变。抽取应用配置,并且可以自动更新。),申明需要使用的持久卷规格。yaml形式创建pod。PVC:持久卷申明(创建Pod绑定PVC。

2023-07-16 10:42:42 1315

原创 Docker架构

Docker可以帮助用户在容器内部快速自动化部署应用,并利用Linux内核特性命名空间(namespaces)及控制组(cgroups)等为容器提供隔离的运行环境。Docker借助操作系统层的虚拟化实现资源的隔离,因此Docker容器在运行时与虚拟机(VM)的运行有很大的区别,Docker容器与宿主机共享同一个操作系统,不会有额外的操作系统开销。这样的优势很明显,因而大大提高了资源利用率,并且提升了I/O等方面的性能。

2023-07-14 18:23:48 2690

原创 docker搭建redis集群模式

将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败。–cluster-replicas 1 为每一个master创建一个slave结点。停止redis-node-1发现,从结点变为主结点。重新启动redis-node-1,变为从结点。注释掉 # bind 127.0.0.1。(172.17.48.78)主机ip不行。(127.0.0.1)主机ip。槽位会将之前的分别分给新的结点。先去出从结点的6388。

2023-02-28 21:13:30 837 3

原创 export、import、commit、save、load的区别

③docker export 导出的镜像是不带历史记录的,如果原本的镜像有3层,export 之后只会有1层,这一层为从镜像运行到export之间对文件系统的修改。docker export 比 docker save的包要小,原因是save的是一个分层的文件系统,export导出的只是一层文件系统。docker commit保存镜像文件系统的历史层,docker export保存从镜像运行到export之间对文件系统的修改的最新一层。**适用场景:**主要作用是将配置好的一些容器复用,再生成新的镜像。

2023-02-27 19:59:41 1390

原创 Golang实习蓝湖二面

casbin的策略ACL,RBAB,ABAC 他们的区别和应用JWT的实现JWT和传统的token有什么区别三次握手和四次挥手time_wait (为什么需要等待2MSL)什么是完全二叉树完全二叉树有什么应用吗?

2022-12-25 19:09:54 590 2

原创 Golang边无际一面

简要的说一下go的垃圾回收机制(三色标记+混合写屏障)Redis中的sorted set 底层数据结构(跳表和压缩列表)

2022-12-22 14:55:52 458 2

原创 Golang蓝湖一面

RPC和Ruetful两种调用的区别RPC的优点Web为什么使用Rustful风格而不用RPC呢?MySQL和Redis的异同MySQL和Redis如何保证数据的一致性Redis分布式锁如何实现,为什么要加过期时间,value为什么要用协程id+数字,主要是干什么呢?查询和添加锁是两个分开的命令吗?Redis如何进行扩容(蒙了!!!说了个集群模式,),集群模式如何进行数据查找呢?,如何保证高并发呢?说一下Redis哨兵模式?哨兵是单点的吗?(可以搭建集群)哨兵搭建集群是怎么进行连接的?(蒙了。

2022-12-20 18:00:45 838

原创 边无际笔试

30道选择题1道编程题 -----(用时30分钟)算法题:最后就是一道 算法题(秒)

2022-12-13 21:03:10 423

原创 Golang实习生字节一面

算法题:螺旋矩阵SQL题:用户,和视频的关联,中间表有用户id,视频id,日期,开始时间,结束时间,查询某一天的前5条,用户id。

2022-11-01 19:32:10 1000 1

原创 GoLang之使用sync.pool和sync.cond

Golang的sync包中的Cond实现了一种条件变量,可以使用在多个Reader等待共享资源ready的场景(如果只有一读一写,一个锁或者channel就搞定了)。Cond的汇合点:多个goroutines等待、1个goroutine通知事件发生。每个Cond都会关联一个Lock(*sync.Mutex or *sync.RWMutex),当修改条件或者调用Wait方法时,必须加锁,保护condition。

2022-10-20 16:49:58 1004

原创 如何解决 bin log 与 redo log 的一致性问题

MySQL Server 层拥有的 bin log 只能用于归档,不足以实现崩溃恢复(crash-safe),需要借助 InnoDB 引擎的 redo log 才能拥有崩溃恢复的能力。所谓崩溃恢复就是:即使在数据库宕机的情况下,也不会出现操作一半的情况,至于为什么说 redo log 具有崩溃恢复的能力,而 bin log 没有,我们先来简单看一下这两种日志有哪些不同点:1)2)3)可以看到,redo log 和 bin log 的一个很大的区别就是,一个是循环写,一个是追加写。

2022-10-13 16:00:03 1298

原创 Redis之布隆过滤器(BloomFilter)

你在开发或者面试过程中,有没有遇到过 海量数据需要查重,缓存穿透怎么避免等等这样的问题呢?下面这个东西超屌,好好了解下,面试过关斩将,凸显你的不一样。

2022-10-05 10:26:46 1134

原创 Golang之自旋锁

自旋锁:线程获取锁的时候,如果锁被其他线程持有,则当前线程将循环等待,直到获取到锁。自旋锁等待期间,线程的状态不会改变,线程一直是用户态并且是活动的(active)。自旋锁如果持有锁的时间太长,则会导致其它等待获取锁的线程耗尽CPU。自旋锁本身无法保证公平性,同时也无法保证可重入性。基于自旋锁,可以实现具备公平性和可重入性质的锁。

2022-10-04 11:35:47 1901 1

原创 Golang之CAS算法(compare and swap)

无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。具有三个参数,第一个是变量的地址,第二个是变量当前值,第三个是要修改变量为多少,该函数如果发现传递的old值等于当前变量的值,则使用第三个变量替换变量的值并返回true,否则返回false。当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。

2022-10-04 09:53:40 2668

原创 Redis持久化之写时复制技术

**bgsave:**fork出的子进程开始根据父进程内存数据生成临时的快照文件,然后替换原文件。这里解释一下几个跟 RDB 相关的参数:根据 rdb_bgsave_in_progress 这一项为 0,可以判断在执行 info Persistence 命令时,bgsave 已经执行完成了。除了通过命令的方式触发 RDB 持久化之外,Redis 内部还有自动触发 RDB 的机制。比如以下场景:如果频繁执行全量快照,会带来两方面的开销:当遇到 RDB 所在分区磁盘满了,可以临时修改 RDB 路径,操作如下:R

2022-10-02 19:59:49 1000

原创 GoLang之T和*T的方法集

基于我们之前介绍过的类型元数据相关知识,T和*T是两种类型,分别有着自己的类型元数据,一些元数据相关知识t he兴替是两种类型,分别有着自己的类型元数据,而根据自定义类型的类型元数据可以找得到该类型关联的方法列表。既然T和T各有各的方法集,那为什么还要限制T和T不能定义同名方法,又怎么会有"*T的方法集包含T的方法集合“这种说法?

2022-10-01 16:42:45 1669

原创 Go实现分布式锁

在单机程序并发或并行修改全局变量时,需要对修改行为加锁以创造临界区。为什么需要加锁呢?

2022-09-30 21:37:38 1372 2

原创 Golang之接口底层分析

GoLang之接口的动态类型和动态值【引申1】接口类型和 作比较【引申2】【引申3】如何打印出接口的动态类型和值?GoLang之编译器自动检测类型是否实现接口GoLang之接口的构造过程是怎样的汇编行数操作10-14构造调用 的参数汇编行数操作15调用 【引申1】

2022-09-30 09:02:33 1425

原创 GoLang之iface 和 eface 的区别是什么?

实际上,这里存储的是第一个方法的函数指针,如果有更多的方法,在它之后的内存空间里继续存储。fun 字段放置和接口方法对应的具体数据类型的方法地址,实现接口调用方法的动态分派,一般在每次给接口赋值发生转换时会更新此表,或者直接拿缓存的 itab。这里只会列出实体类型和接口相关的方法,实体类型的其他方法并不会出现在这里。实体, 它表示接口的类型以及赋给这个接口的实体类型。则指向接口具体的值,一般而言是一个指向堆内存的指针。这些数据类型的结构体定义,是反射实现的基础。字段,表示空接口所承载的具体的实体类型。

2022-09-29 09:41:41 1407

原创 GoLang之垃圾回收的认识

GC,全称,即垃圾回收,是一种自动内存管理的机制。当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给操作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收。而负责垃圾回收的程序组件,即为垃圾回收器。垃圾回收其实一个完美的 “Simplicity is Complicated” 的例子。一方面,程序员受益于 GC,无需操心、也不再需要对内存进行手动的申请和释放操作,GC 在程序运行时自动释放残留的内存。

2022-09-27 11:04:10 843

原创 GoLang之并发编程-定时器

Timer:时间到了,执行只执行1次// 1.timer基本使用 timer1 := time . NewTimer(2 * time . Second) t1 := time . Now() fmt . Printf("t1:%v\n" , t1) //t1:2022-09-26 20:00:31.647493 +0800 CST m=+0.024507301 t2 :=

2022-09-26 20:54:49 1780

原创 Golang内存管理之垃圾收集器

如上图所示,其中黑色的部分是上一次垃圾收集后标记的堆大小,绿色部分是上次垃圾收集结束后新分配的内存,因为我们使用并发垃圾收集,所以黄色的部分就是在垃圾收集期间分配的内存,最后的红色部分是垃圾收集结束时与目标的差值,我们希望尽可能减少红色部分内存,降低垃圾收集带来的额外开销以及程序的暂停时间。需要注意的是,增量式的垃圾收集需要与三色标记法一起使用,为了保证垃圾收集的正确性,我们需要在垃圾收集开始前打开写屏障,这样用户程序修改内存都会先经过写屏障的处理,保证了堆内存中对象关系的强三色不变性或者弱三色不变性。

2022-09-26 18:19:00 865

原创 Golang内存管理之内存分配器

程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要区域:栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存会由编译器进行管理;不同编程语言使用不同的方法管理堆区的内存,C++ 等编程语言会由工程师主动申请和释放内存,Go 以及 Java 等编程语言会由工程师和编译器共同管理,堆中的对象由内存分配器分配并由垃圾收集器回收。内存管理一般包含三个不同的组件,分别是用户程序(Mutator)、分配器(Allocator)和收集器(Collec

2022-09-24 10:00:56 747

原创 I/O 多路复用解析

单线程:某个 socket 阻塞,会影响到其他 socket 处理。多线程:当客户端较多时,会造成资源浪费,全部 socket 中可能每个时刻只有几个就绪。同时,线程的调度、上下文切换乃至它们占用的内存,可能都会成为瓶颈。提供了非阻塞调用的方式,从操作系统层面解决了阻塞问题。将 socket 是否就绪检查逻辑下沉到操作系统层面,避免大量系统调用。告诉你有事件就绪,但是没告诉你具体是哪个 FD。跟 select 基本类似,主要优化了监听1024的限制。

2022-09-21 18:30:58 836

原创 Golang之协程和IO多路复用更配

并发处理能力因而大幅提升,但是也并非没有问题,例如一个socket可读了,但是这回只读到了半条请求,也就是说需要再次等待这个socket可读,在继续处理下一个socket之前,需要记录下这个socket的处理状态,下一个这个socket可读时,也需要恢复上次保存的现场,才好继续处理。也就是说,在IO多路复用中实现业务逻辑时,我们需要随着事件的等待和就绪,而频繁的保存和恢复现场,这并不符合常规开发习惯,如果业务逻辑比较简单还好,若是较为复杂的业务场景,就是悲剧了。第二种IO多路复用实现方式:poll。

2022-09-20 11:33:39 1345

原创 GoLang之协程是怎样的存在

每个协程拥有自己的执行栈,可以保存自己的执行现场,所以可以由用户程序按需创建携程,携程主动让出执行权时,会保存执行现场,然后切换到其他协程。协程恢复执行时,会根据之前保存的执行现场,恢复到中断前的状态继续执行。让多线程模型下,内核(态)用户(态)两头忙,却依然疲于应对,协程这种灵活轻量的用户太调度模型便受到了广泛的关注,而真正让协程大放异彩的,是他在io多路复用中的应用。线程可以选择一个执行体来执行,此时cpu中指令指针就会指向这个执行体的执行入口,栈基和栈指针寄存器也会指向线程给他分配的执行栈。

2022-09-20 11:32:04 863

原创 GoLang之进程与线程

如果接下来要执行进程A中的线程a1,CPU的指令指针寄存器就会指向线程的执行入口,当前指向用户空间的程序指令,所以栈基和栈指针寄存器会记录用户栈的位置,可以看到程序执行时,CPU面向的是某个线程,所以才说线程是操作系统执行与调度的基本单位。例如接下来要从线程a1切换到线程a2,而这两个线程属于进程A,那么就只涉及到线程切换,只需要把线程a1的执行现场保存起来,后续再把指令指针,栈指针这些寄存器的值修改为线程a2的信息,修改一下内存中调度相关的数据结构,一次同进程间的线程切换就算完成了。

2022-09-19 16:09:07 790

原创 GoLang之channel的应用

Channel 和 goroutine 的结合是 Go 并发编程的大杀器。而 Channel 的实际应用也经常让人眼前一亮,通过与 select,cancel,timer 等结合,它能实现各种各样的功能。接下来,我们就要梳理一下 channel 的应用。

2022-09-18 15:44:58 941

原创 GoLang之如何优雅地关闭 channel

因此需要增加一个中间人,M 个 receiver 都向它发送关闭 dataCh 的“请求”,中间人收到第一个请求后,就会直接下达关闭 dataCh 的指令(通过关闭 stopCh,这时就不会发生重复关闭的情况,因为 stopCh 的发送方只有中间人一个)。例如,IsClosed 函数返回 true,但这时有另一个 goroutine 关闭了 channel,而你还拿着这个过时的 “channel 未关闭”的信息,向其发送数据,就会导致 panic 的发生。这样,第一个关闭 dataCh 的请求就会丢失。

2022-09-18 15:14:55 1748

原创 GO面试题集锦

负载因子 = 哈希表存储的元素个数 / 桶个数Go 官方发现:装载因子越大,填入的元素越多,空间利用率就越高,但发生哈希冲突的几率就变大。装载因子越小,填入的元素越少,冲突发生的几率减小,但空间浪费也会变得更多,而且还会提高扩容操作的次数Go 官方取了一个相对适中的值,把 Go 中的 map 的负载因子硬编码为 6.5 ,这就是 6.5 的选择缘由。这意味着在 Go 语言中,当 map 存储的元素个数大于或等于 6.5 * 桶个数 时,就会触发扩容行为。

2022-09-18 14:01:32 369

原创 GoLang之详解Go中的Channel源码

go tool compile - N - l - S hello . go - N表示禁用优化 - l禁用内联 - S打印结果。

2022-09-17 08:59:23 452 1

原创 GoLang之channel数据结构及阻塞、非阻塞操作、多路select

需要分别记录读,写 下标的位置,当读和写不能立即完成时,需要能够让当前协程在channel上等待,待到条件满足时,要能够立即唤醒等待的协程,所以要有两个等待队列,分别针对读和写。同样的,常规recv操作,会被编译器转换为对runtime.chanrecv1()的调用,而它内部只是调用了runtime.chanrecv(),comma ok风格的写法会被编译器转换为对runtime.chanrecv2()的调用,它的内部也是调用chanrecv() 只不过比chanrecv1()多了一个返回值。

2022-09-16 09:27:03 1880

原创 GoLang之图解channel之读、写、关闭

非阻塞式的读操作,会被编译器转换为对runtime.selectnbrecv或selectnbrecv2的调用,而它们也仅仅是调用了runtime.chanrecv,只不过在需要等待时会返回false。那么selectnbsend函数就会返回false,对应的协程也就不会进到sendq里等待了。runtime.selectnbsend也仅仅是调用了runtime.chansend,但是会标记上非阻塞。所以,如果缓冲区指望不上,又没有谁在等着recv,又或者channel为nil…sendq里等待的协程,

2022-09-15 11:02:50 229

原创 Golang之Defer必掌握的7知识点

触发panic(“panic”)后defer顺序出栈执行,第一个被执行的defer中 会有panic(“defer panic”)异常语句,这个异常将会覆盖掉main中的异常panic(“panic”),最后这个异常被第二个执行的defer捕获到。

2022-09-13 19:48:17 180

原创 GoLang之unsafe分析

如果接下来需要对b进行修改,那么这样转换就没什么问题,但是如果只是因为类型不合适,并不需要对转换后的变量做任何修改,那这样转换就显得不划算了。我们知道,[]byte和string的内存布局如下图所示:可以看到它们都有一个底层数组来存储变量数据,而类型本身只记录这个数组的起始地址。如果采用强制类型转换的方式把a转换为b,那么就会重新分配b使用的底层数组。然后把a的底层数组内容拷贝到b的底层数组。如果字符串内容很多,多占用这许多字节的内存不说,还要耗费时间做拷贝,所以就显得很不合适了。

2022-09-13 11:06:22 810 1

原创 GoLang之深度剖析channel的底层实现

Go语言有个很出名的话是“以通信的手段来共享内存”,channel就是其最佳的体现,channel提供一种机制,可以同步两个并发执行的函数,还可以让两个函数通过互相传递特定类型的值来通信make(chan int) // 无缓存 chan make(chan int , 10) // 有缓存 chan十分简洁的做到了不同协程的交互。综上分析,在使用channel有这么几点要注意1.确保所有数据发送完后再关闭channel,由发送方来关闭2.不要重复关闭channel。

2022-09-12 19:40:21 208

原创 GoLang之切片并发安全问题

关于切片的,Go语言中的切片原生支持并发吗?

2022-09-12 17:53:32 576

原创 GoLang之并发机制以及它所使用的CSP模型

Golang中channel 是被单独创建并且可以在进程之间传递,它的通信模式类似于 boss-worker 模式的,一个实体通过将消息发送到channel 中,然后又监听这个 channel 的实体处理,两个实体之间是匿名的,这个就实现实体中间的解耦,其中 channel 是同步的一个消息被发送到 channel 中,最终是一定要被另外的实体消费掉的,在实现原理上其实类似一个阻塞的消息队列。当正在运行的G0阻塞的时候(可以需要IO),会再创建一个线程(M1),P转到新的线程中去运行。

2022-09-12 14:44:28 508

原创 GoLang之GMP调度器原理

假定当前除了M3和M4为自旋线程,还有M5和M6为空闲的线程(没有得到P的绑定,注意我们这里最多就只能够存在4个P,所以P的数量应该永远是M>=P, 大部分都是M在抢占需要运行的P),G8创建了G9,G8进行了阻塞的系统调用,M2和P2立即解绑,P2会执行以下判断:如果P2本地队列有G、全局队列有G或有空闲的M,P2都会立马唤醒1个M和它绑定,否则P2则会加入到空闲P列表,等待M来获取可用的p。最关键的是,程序员看不到这些底层的细节,这就降低了编程的难度,提供了更容易的并发。实现了线程M1的复用。

2022-09-12 11:34:56 165

原创 Golang底层原理剖析之内存逃逸

静态分配到栈上,性能一定比动态分配到堆上好。底层分配到堆,还是栈。实际上对你来说是透明的,不需要过度关心。每个 Go 版本的逃逸分析都会有所不同(会改变,会优化)。直接通过 go build -gcflags ‘-m -l’ 就可以看到逃逸分析的过程和结果。到处都用指针传递并不一定是最好的,要用对。栈上分配的内存不需要GC处理堆上分配的内存使用完毕会交给GC处理逃逸分析目的是决定内分配地址是栈还是堆逃逸分析在编译阶段完成。

2022-09-11 16:49:47 260

golang实现多用户通信系统

基于Golang研发,用TCP socket编程进行服务端和客服端通信,将数据序列化用redis数据库存储数据。使用协程(goroutine)和管道(channel)进行并发实现多用户登录。

2022-02-10

空空如也

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

TA关注的人

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