自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 Go 语言源码分析——map

哈希表用于存储键值对的映射关系,具有O(1)的读写性能。通过哈希函数可以将不同的键映射到不同索引上,当不同的键映射到同一个索引上时,huich

2021-06-14 13:52:20 283

原创 Go 语言源码分析——channel

Go 语言最常提及的设计模式就是:不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。许多主流编程语言中,多个线程传递数据defangshi

2021-06-13 13:03:04 247

原创 Redis五大数据类型底层实现总结

Redis包含字符串、列表、哈希、集合、有序集合五大数据类型,针对每一类型都给出了多种底层实现,使得Redis在执行命令时,能够针对不同的使用场景,dui

2021-05-30 12:38:26 183

原创 Redis数据结构——压缩列表

压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,且每个列表项要么是小整数值,要么是长度较短的字符串,Redis则使用yasuolieb

2021-05-29 18:14:56 156

原创 Redis数据结构——整数集合

整数集合是集合键的底层实现之一。当一个集合只包含整数值元素,并且这个集合的元素不多时,Redis会用整数集合作为集合键的底层实现。

2021-05-29 17:08:07 73

原创 Redis数据结构——跳跃表

跳跃表是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。tiaoyuebiaoRedis的有序集合的实现之一

2021-05-29 12:36:16 91

原创 Redis数据结构——字典

字典适用于保存键值对的抽象数据结构,一个键可以和一个值进行关联,在字典中,键是唯一的。Redis的数据库是用字典作为底层实现的,字典还是哈希键的

2021-05-28 23:06:41 114

原创 Redis数据结构——链表

Redis构建了自己的链表实现,其中列表键的底层实现之一就是链表,Redis的发布订阅、慢查询、监视器等功能也使用到了链表。Redis服务器还使用链表来保存多个客户端的状态信息,以及使用链表laigo...

2021-05-28 22:21:15 143

原创 Redis数据结构——简单动态字符串

Redis没有直接使用C语言传统的字符串表示,而是构建了一种名为简单动态字符串(SDS)的抽象类型,将其作为Redis的默认字符串表示。在Redis中,C字符串只作为字符串字面量用在无需对字符串进行修改的地方,当Redis需要一个可被修改的字符串时,会使用SDS表示字符串值。1.SDS数据结构struct sdshdr { int len; // buf数组中已使用的字节长度 int free; // buf数组中未使用的字节长度 char buf[]; .

2021-05-26 23:54:10 79

原创 Redis 持久化方式

Redis的数据是保持在内存中的,但当服务器宕机时,内存中的数据会丢失,因此需要将内存中的数据持久化,使得内存数据丢失时能够重新载入。Redis的持久化方式有RDB和AOF两种一、RDB持久化Redis默认采用RDB持久化,可以将Redis在内存中的数据库状态保存到磁盘内,避免数据意外丢失。1.RDB文件的创建(1)当执行save命令或bgsave命令时,会生成RDB文件。两者的区别是,save命令会阻塞Redis服务器进程,此时服务器不能处理任何命令的请求,直至RDB文件创建完成;b..

2021-05-20 23:23:30 84

原创 Redis的过期键删除策略及内存回收机制

一、过期键删除策略1. 设定过期时间Redis有四个不同命令可用于设置键的生存时间或过期时间:expire key ttl:将key的生存时间设置为ttl秒 pexpire key ttl:将key的生存时间设置为ttl毫秒 expireat key timestamp:将key的过期时间设置为timestamp所指定的秒数时间戳 pexpireat key timestamp:将key的过期时间设置为timestamp所指定的毫秒时间戳redisDb结构中的expires字典保存了数据

2021-05-17 23:22:53 197 1

原创 Go 缓存系列 ——go-cache源码分析

go-cache是基于内存的k/v缓存,类似于mencached,适用于单机应用程序。go-cache是线程安全的,支持并发地存取。虽然go-cache是保存在内存,但可以通过SaveFile()方法将缓存中的数据保存到文件。一、数据结构go-cache的逻辑代码主要是在cache.go文件中,首先来看它的数据结构// 整体缓存type Cache struct { *cache}type cache struct { defaultExpiration time.Durati.

2021-05-15 10:31:35 708

原创 Redis 数据类型及常用操作命令介绍

Redis不是简单的键值存储数据库,它实际上是一个支持不同类型值的数据结构服务器。Redis支持的数据类型包括:String字符串、List列表、Set集合、ZSet有序集合、Hash哈希、BitMaps位图、HyperLogLogs、Streams1. String字符串string是Redis最基本的数据类型,一个key对应一个value value可以是每种类型的字符串,其大小不能大于512MB1.1 设置和获取字符串的值其中,如果键对应的值已经设置了,再次调用set命令会将原来的.

2021-05-09 15:26:49 103

原创 Redis报错:Failed opening the RDB file dump.rdb for saving: Permission denied

执行如下语句关闭redis服务:src/redis-cli -h 127.0.0.1 -p 6379 shutdown执行失败返回以下提示:查看日志有以下提示:大概就是说在关闭服务之前需要将数据持久化,但是没有操作的权限,因此首先需要创建一个文件夹用于保存我们的数据,然后修改redis.confdbfilename是持久化数据存放的文件,这个可保持原来的值;dir是持久化数据存放的文件夹,需要修改为我们之前创建的文件夹路径,保存后修改data文件夹权限chmod 77

2021-05-09 14:13:32 4876 3

原创 CentOS7 Linux 安装Redis

1.下载源码压缩包sudo wget https://download.redis.io/releases/redis-6.2.3.tar.gz2.解压sudo tar xzf redis-6.2.3.tar.gz3.编译sudo make编译完后目录如下:4. 进入src文件夹启动Redis服务器src/redis-server服务器启动如下:5. 运行客户端src/redis-cli启动客户端后如下:然后就可以执行命令了..

2021-05-09 10:31:23 67

原创 Go 语言源码分析——slice 切片

Go的slice与数组类似,能够通过下标进行访问,越界访问时会报错。但slice比数组更加灵活,数组的大小是固定的,而slice可进行自动扩容。一、数据结构type slice struct { array unsafe.Pointer len int cap int}可以看到,slice底层包含了一个指向数组的指针,以及slice的长度和容量,可通过len()和cap()获取二、源码分析1. makeSlice首先看创建一个slicepackage m..

2021-04-28 22:41:00 167

原创 DBeaver 远程连接clickhouse失败问题

首次尝试远程连接clickhouse时会报下面的错误,是因为clickhouse默认情况下不允许其他设备进行http连接,需要修改clickhouse配置Unexpected driver error occurred while connecting to the database ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 210, host: 192.168.100.130, por

2021-04-18 08:57:12 7008 1

原创 CentOS7 Linux 安装 clickhouse

1.检查当前CPU是否支持SSE 4.2的命令$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"SSE 4.2 supported2.添加官方存储库sudo yum install yum-utilssudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPGsudo ..

2021-04-17 20:35:59 366

原创 Go 字符串——遍历及切片

一、遍历go的遍历有以下两种方式,但是直接打印输出的为数字,与我们想要的结果不同。这是因为在Go里,字符串存储的是类型为byte的字节切片,而byte实际为uint8类型的值,即存储一个字符串时,存储的不是字符,而是字符对应的字节。那为什么两种遍历输出的数值不一样呢,接着往下看。func main() { str := "hello, 世界" fmt.Println("test 1-------") for i := 0; i < len(str); i++ { fmt.P

2021-04-17 19:44:57 1734

原创 Go 防缓存击穿 —— singleflight

缓存击穿:缓存在某个时间点过期时,突然在这个时间点出现对这个key的大量并发请求,此时缓存已过期,请求会直接落在DB上,使得DB瞬间请求量增大,压力骤增。singleflight能够在同一时间有大量针对同一key的请求这种情况,只让一个请求执行去获取数据,而其他协程阻塞等待结果的返回一、数据结构type Group struct { mu sync.Mutex // 互斥锁 m map[string]*call // 对于每一个要获取的key有一个对应的call}ty..

2021-04-17 16:10:04 213

原创 Go 标准库源码分析 - sync 包的Pool

Pool 实现了对象池的功能,能够保存和复用对象,减轻了垃圾回收的压力,提高了对象的复用率而不必每次都重新分配内存。一、数据结构type Pool struct { noCopy noCopy local unsafe.Pointer // 实际上是poolLocal类型的数组 localSize uintptr // local数组的大小 victim unsafe.Pointer // 存储的是上一个local里的数据,里面的对象随时可能会被回收,.

2021-04-03 18:33:06 131

原创 Go 标准库源码分析 - sync 包的 Map

Go 普通的map是线程不安全的,在并发读写时可能会出现脏数据;sync包中的Map是线程安全的,并发读写时无需额外加锁,适用于多读少写的情况。一、数据结构type Map struct { mu Mutex // 互斥锁,用于锁定dirty map read atomic.Value // 优先读map,支持原子操作 dirty map[interface{}]*entry // dirty是当前最新的map,支持读写 misses int // 记录read读不到数据而.

2021-04-01 23:46:28 229 1

原创 Go 标准库源码分析 - sync包的RWMutex

RWMutex 为读写锁,适用于读多写少的场景,可以同时有多个goroutine对临界区加读锁,此时写操作的goroutine被阻塞;同一时刻仅能有一个goroutine获得写锁,此时其他写操作和读操作的goroutine被阻塞。一、数据结构type RWMutex struct { w Mutex // 互斥锁 writerSem uint32 // 写信号量 readerSem uint32 // 读信号量 readerCount int32 // .

2021-03-29 23:11:15 130

原创 Go 标准库源码分析 - sync包的Mutex

在并发情况下会涉及到资源的互斥,Go通过Mutex互斥锁来保证临界资源的互斥访问一、Mutex的工作模式正常模式:在该模式下,等待的goroutine以FIFO顺序等待。被唤醒的goroutine不会直接拥有锁,而是与新请求锁的goroutine竞争,并且这些新goroutine由于已经在CPU中执行,并且可能有好几个,而在竞争中更具优势。在这种情况下,被唤醒的goroutine会被放进队头。当一个等待的goroutine超过1ms未获得锁,会转入饥饿模式。 饥饿模式:在该模式下,锁的所有...

2021-03-27 18:46:11 127

原创 Go 标准库源码分析 - sync 的 WaitGroup

WaitGroup常用于多个goroutine协作,主要功能是阻塞等待一组goroutine完成。一、数据结构type WaitGroup struct { noCopy noCopy state1 [3]uint32 // 用于存放任务计数器、等待者计数器和信号量}WaitGroup采用64位的值来保存计数器,其中高32位为任务计数器,低32位为等待者计数器,另外用32位的值保存信号量。WaitGroup在使用时需要64位的计数器进行原子操作,这要求计数器的地址是6...

2021-03-23 23:32:58 95

原创 Go标准库源码分析 - sync包的Once

Once能保证程序仅执行一次,与init相似,但init在文件包首次加载时执行,且执行一次;而Once在代码运行需要时执行,且只执行一次。一、数据结构type Once struct { done uint32 // 用于标记函数是否已执行 m Mutex // 并发控制}二、使用方法func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 0 { o.doSlow..

2021-03-16 23:51:05 87

原创 Go 标准库源码分析 - sync包的cond

sync包的cond实现了一种条件变量,当共享的资源未准备好时,多个goroutine挂起等待,直到一个master goroutine通知事件发生。一、数据结构type Cond struct { noCopy noCopy // 实现了Locker接口,使得Cond对象在go vet扫描时能够检测出Cond对象是否被复制 L Locker // 实现了Locker接口,通常使用Mutex或RWMutex notify n.

2021-03-14 18:02:23 101

原创 Go 标准库 - context 源码解析

context 主要用来在goroutine 之间传递上下文信息,包括取消信号、超时时间、截止时间、k-v等。标准库的许多接口加上了 context 参数,来实现并发控制和超时控制。一、源码解析1. 接口(1)Contexttype Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) i..

2021-01-09 19:37:17 171

原创 Java设计模式 - 策略模式

1. 定义定义了一系列算法族,分别被封装起来,可以相互替换,该模式使得算法的变化独立于客户对其的使用。2. 角色Context:环境类,调用算法的用户 Strategy:抽象策略类。 ConcreteStrategy:具体策略类,每个类封装的算法有所不同。3. 特点优点:算法的选择交由用户决定,增加了系统的灵活性。 缺点:用户需要知道所有算法的不同点以便选择合适的算法,...

2020-01-15 20:26:00 68

原创 Java设计模式 - 状态模式

1. 定义允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。2. 角色Context:环境类 State:抽象状态类 ConcreteState:具体状态类3. 特点优点:将所有与某个状态相关的行为放入一个状态类中,可以方便地增加新的状态类,将状态的转换逻辑与状态对象合为一体,封装了转换逻辑,取代了巨大的条件判断块。 缺点:该模式的使用会增加系统类和对象...

2020-01-15 20:06:25 146

原创 Java设计模式 - 观察者模式

1. 定义定义了对象之间一对多的依赖,当一个对象改变状态时,它的依赖者会收到通知并自动更新。2. 角色Subject:目标 ConcreteSubject:具体目标 Observer:观察者 ConcreteObserver:具体观察者3. 特点优点:实现了发布者和订阅者的耦合。 缺点:如果订阅者过多的话,发布通知会花费很多时间。4. 示例Subject:...

2020-01-15 19:44:45 95

原创 Java设计模式 - 中介者模式

1.定义用一个中介对象来封装一系列的对象交互,该中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。2. 角色Mediator:抽象中介者 ConcreteMediator:具体中介者 Colleague:抽象同事类 ConcreteColleague:具体同事类3. 特点优点:可以减少对象之间的交互,使对象解耦,将控制逻辑集中,可以...

2020-01-15 19:04:17 74

原创 Java设计模式 - 命令模式

1. 定义将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。该模式也支持可撤销的操作。2. 角色Command:抽象命令类 ConcreteCommand:具体命令类 Invoker:调用者 Receiver:接收者 Client:客户类3. 特点优点:能实现命令的请求者和执行者的解耦,使系统易于扩展,支持宏命令,可将一组命令组合起来使用,可以方...

2020-01-13 11:44:10 94

原创 Java设计模式 - 责任链模式

1. 定义使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。2. 角色Handler:抽象处理角色者 ConcreteHandler:具体处理角色者3. 特点优点:将请求的发送者和接收者解耦,易于改变链内成员或改动次序,能够动态地新增或修改责任。 缺点:请求不一定会被执行,当没有...

2020-01-13 11:14:39 70

原创 Java设计模式 - 代理模式

1. 定义为另一个对象提供替身或占位符以控制对这个对象的访问。2. 角色Subject:抽象主题类 Proxy:代理主题类 RealSubject:真实主题类3. 特点优点:能够协调调用者和被调用者,降低了系统的耦合度。其中远程代理使得客户端可以访问远程的对象,而远程的服务器可能有更好的计算性能和处理速度,可以加速响应处理客户端请求;虚拟代理可以通过一个小对象代理一个较大...

2020-01-12 15:33:57 76

原创 Java设计模式 - 蝇量模式(享元模式)

1. 定义运用共享技术有效地支持大量的细粒度对象的复用。2. 角色Flyweight:抽象蝇量类 ConcreteFlyweight:具体蝇量类 FlyweightFactory:蝇量工厂 3. 特点优点:减少内存中对象的数量,使得相同或相似的对象在内存中可以集中管理。 缺点:该模式需要分离出内部状态和外部状态,使程序的逻辑变得复杂。4. 示例公园里有许...

2020-01-12 11:47:21 110

原创 Java设计模式 - 外观模式

1. 定义提供一个统一的接口,用来访问子系统中的一群接口,这个高层接口使得子系统更容易使用。2. 角色Facade:外观类 SubSystem:子系统类3. 特点优点:实现了客户和子系统的松耦合关系,客户通过外观类来对子系统进行操作,因此子系统内部的修改不会影响客户的使用。 缺点:该模式对客户访问子系统类增加了许多限制,降低了系统的灵活性,当增加子系统时,可能需要修改外观...

2020-01-11 17:49:27 72

原创 Java设计模式 - 装饰者模式

1. 定义动态地将责任附加到对象上,在扩展功能时,该模式提供了比继承更有弹性的替代方案。2. 角色Component:抽象构件 ConcreteComponent:具体构件 Decorator:抽象装饰类,是抽象构件的子类,内部持有对Component实例的一个引用 ConcreteDecorator:具体装饰类3. 特点优点:用该模式来实现扩展比使用继承灵活,有较好的...

2020-01-11 17:12:07 55

原创 Java设计模式 - 组合模式

1. 定义将对象组合成树形结构来表现整体/部分的层次结构,让用户以一致的方式处理个别对象以及对象组合。2. 角色Component:对象声明接口 Leaf:叶子结点类 Composite:容器对象类3. 特点优点:它定义了一个抽象构件类,既可表示叶子对象,又能表示容器对象,使得用户可以仅针对这个抽象构件类操作而无需知道操作对象是叶子对象还是容器对象,清楚地定义了分层次的复...

2020-01-11 16:42:20 73

原创 Java设计模式 - 桥接模式

1. 定义将抽象部分与它的实现部分分离,使它们都可以独立地变化。2. 角色Abstraction:抽象类 RefinedAbstraction:扩充抽象类 Implementor:实现类接口 ConcreteImplementor:具体实现类3. 特点优点:分离了抽象接口及其实现部分,提高了系统的可扩充性。 缺点:增加了系统的理解与设计难度。4. 示例笔有许多种...

2020-01-11 15:30:04 69

空空如也

空空如也

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

TA关注的人

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