- 博客(30)
- 收藏
- 关注
原创 IPv6 基础知识介绍--应该很接近最新标准
IPv6(Internet Protocol Version 6)是网络层协议的第二代标准协议,也被称为 IPng(IP Next Generation)相比 IPv4 的地址空间而言,IPv6 可以提供 2^128 个地址空间,几乎不会被耗尽。
2023-01-30 15:55:38
700
原创 011-PHP设计模式之状态模式
十一、状态模式11.1 什么是状态模式当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类11.2 怎么实现状态模式State 抽象状态角色:接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换ConcreteState 具体状态角色:每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理Context 环境角色:定义客户端需要的接口,并且负责具体状态的切换<?phpnamespace state;class Context{ public
2022-05-31 10:14:24
215
原创 010-PHP设计模式之门面模式
十、门面模式10.1 什么是门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用10.2 怎么实现门面模式Facade 门面角色:客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任subsystem 子系统角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在<?phpclass Auth{ public function auth()
2022-05-31 10:13:38
410
原创 009-PHP设计模式之观察者模式
九、观察者模式9.1 什么是观察者模式观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新9.2 怎么实现观察者模式Subject 被观察者:定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者;仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者Observer 观察者:观察者接收到消息后,对接收
2022-05-30 14:24:26
308
原创 008-PHP设计模式之适配器模式
八、适配器模式8.1 什么是适配器模式将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作8.2 怎么实现适配器模式Target 目标角色:该角色定义把其他类转换为何种接口,也就是我们的期望接口Adaptee 源角色:想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新、靓丽的角色Adapter 适配器角色:适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是
2022-05-30 14:16:36
181
原创 007-PHP设计模式之策略模式
七、策略模式7.1 什么是策略模式定义一组算法,将每个算法都封装起来,并且使它们之间可以互换7.2 怎么实现策略模式Context 封装角色:也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化Strategy 抽象策略角色:策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性ConcreteStrategy 具体策略角色:实现抽象策略中的操作,该类含有具体的算法<?phpinterface Strategy{ p
2022-05-20 10:39:56
345
原创 006-PHP设计模式之装饰者模式
六、装饰者模式6.1 什么是装饰者模式动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活6.2 怎么实现装饰者模式Component 抽象构件:一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象ConcreteComponent 具体构件:最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它Decorator 装饰角色:实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个private 变量指向 Component 抽
2022-05-19 10:44:23
133
原创 005-PHP设计模式之责任链模式
五、责任链模式5.1什么是责任链模式使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止5.2怎么实现责任链模式责任链模式的核心在“链”上,“链”是由多个处理者 Handler 组成的抽象的 Handler 类:定义抽象方法,提供注册下一个 Handler 的接口具体的 Handler 类:实现抽象类方法,注册自己能处理的事件级别事件类:定义自己的事件级别<?phpclass Request
2022-05-17 16:10:05
177
原创 004-PHP设计模式之模板方法模式
四、建造者模式4.1什么是建造者模式建造者模式也称为生成器模式,Separate the construction of a complex object from its representation sothat the same constructionprocess can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)。简答来说,就是把不同流程的类的生成单独抽到同一个管理类中。该类只负责调用具
2022-05-16 15:28:57
94
原创 013-Golang1.17源码分析之Context
Golang1.17源码分析之ContextGolang1.17 学习笔记013context 是一种常用额并发控制技术,与 WaitGroup 最大的区别就是 context 对派生的 G 也有控制权。可以控制多级的 goroutinecontext 译为“上下文”,可以控制一组成树状结构的 goroutine,每个 goroutine 都有相同的 context13.1 实现源码位置:src/context/context.go:Contexttype Context interfac
2022-05-13 15:43:30
233
原创 003-PHP设计模式之模板方法模式
三、模板方法模式3.1什么是模板方法模式定义一个操作中的算法的框架,而将一些步骤延时到子类中。使得子类可以不改变一个算法结构即可重定义该算法的某些特定步骤。简单来说,就是定义一个有步骤的父类,然后其中的一些步骤方法允许子类重写,而核心的步骤方法不能被重写。比如定义一个买菜流程。buy(买菜)方法中依次调用了 goOut(出门)、choose(选菜)、pay(付钱)、goBack(回家) 方法。我允许你将除了 buy() 方法外的其他方法给重写。这种形式就叫做模式方法模式。3.2怎么实现模式基础
2022-05-13 15:37:50
118
原创 002-PHP设计模式之工厂模式
二、工厂模式2.1什么是工厂模式Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class deferinstantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)简白来说,就是创建一个方法实例化其他的类,具体实例化那个类,由
2022-05-12 10:45:05
102
原创 001-PHP设计模式之单例模式
一、单例模式1.1什么是单例模式单例模式,顾名思义,就是这个类只存在一个实例;不管有多少 new 操作,都只返回同一个对象;其根本目的就是减少 new 操作,以及在一些场景下保证不同类操作的都是同一个实例,保证数据一致;1.2为什么使用单例模式当应用中存在大量的 sql 请求,需要用到大量 new 操作来创建 mysql 实例;这样会大大增加 mysql 的连接数。造成 too many connections 警告;此时使用单例模式就可以极大减少 mysql 的连接如果系统需要使用一个
2022-05-11 10:45:43
883
2
原创 003-Golang之linux密码算法封装
linux密码算法-0030033.1 linux密码算法粗解linux 密码文件在:/etc/shadow// 示例admin:$6$6swiWjq7$1eai7fYqykh38CUOjSmMBOb60MfIaqJLwADRqjThJpKMlJvabA27NnCsQ4v9MSI74J7.GpNGunnblwi/cG28V1:19097:0:99999:7::上述示例密码为:$6$6swiWjq7$1eai7fYqykh38CUOjSmMBOb60MfIaqJLwADRqjThJpKMlJ
2022-04-26 23:00:00
363
原创 002-Golang之Radius封装
Golang之Radius封装-002002关于一次 go 实现 radius 的 PAP 和 CHAP 连接的坑2.1 插件选择go get -u layeh.com/radius2.2 基础封装PAP协议示例func main() { packet := radius.New(radius.CodeAccessRequest, []byte(`秘钥`)) rfc2865.UserName_SetString(packet, "用户名") rfc2865.UserPassword_
2022-04-19 18:37:31
1333
5
原创 012-Golang1.17源码分析之WaitGroup
Golang1.17源码分析之WaitGroupGolang1.17 学习笔记010WaitGroup,可理解为 Wait-Goroutine-Group,即等待一组 goroutine 结束源码包:sync/waitgroup.gotype WaitGroup struct { noCopy noCopy // 64-bit value: high 32 bits are counter, low 32 bits are waiter count. // 64-bit atomic o
2022-04-08 14:54:35
304
原创 011-Golang1.17源码分析之GC
Golang1.17源码分析之GC-011Golang1.17 学习笔记011GC 目前采用的是三色标记清除法三色:黑、灰、白黑色:被引用,不清理,追踪完成,gcmarkBits 对应的位为 1灰色:可能被引用,需要再次扫描,未追踪完成白色:没有被引用,或尚未追踪,gcmarkBits 对应的位为 011.1 内存标记span 中维护了一个个内存块,并由一个位图 allocBits 表示每个内存块的分配情况。在 span 数据结构中还有另一个位图 gcmarkBits 用于标记内存块被
2022-04-08 14:52:33
484
原创 010-Golang1.17源码分析之内存管理
Golang1.17源码分析之内存管理-010Golang1.17 学习笔记010为了方便自主管理内存,做法便是先向系统申请一块内存,然后将内存切割成小块,通过一定的内存分配算法管理内存预申请的内存划分为 spans、bitmap、arena 三部分。其中 arena 即为所谓的堆区,应用中需要的内存从这里分配spans 和 bitmap 是为了管理 arena 存在的arena 为了方便管理划分成一个一个的 pagespans 区域存放 span 的指针,每个指针对应一个 page,大小由
2022-03-03 21:00:00
730
原创 009-Golang1.17源码分析之goroutine
Golang1.17源码分析之goroutine-009Golang1.17 学习笔记009包位置:runtime/runtime2.go全局变量 g0 主协程、m0 工作线程P 里面只是有个本地 runq,全局的 runq 存储在 sched 中获取任务顺序,先从 m 自身 p 中的 runq 获取,没有就去全局 sched 中获取,没有再去其他 q 中拿一点type g struct { _panic *_panic // innermost panic - offset kno
2022-02-22 19:00:00
490
原创 008-Golang1.17源码分析之rwmutex
Golang1.17源码分析之rwmutex-009Golang1.17 学习笔记009解决的问题:写锁需要阻塞写锁:一个协程拥有写锁时,其他协程写锁定需要阻塞写锁需要阻塞读锁:一个协程拥有写锁时,其他协程读锁定需要阻塞读锁需要阻塞写锁:一个协程拥有读锁时,其他协程写锁定需要阻塞读锁不能阻塞读锁:一个协程拥有读锁时,其他协程也可以拥有读锁源代码:src/sync/rwmutex.go数据结构:type RWMutex struct { w Mutex
2022-02-22 18:45:00
303
原创 007-Golang1.17源码分析之mutex
Golang1.17源码分析之mutex-007Golang1.17 学习笔记007源代码:sync/mutex.go数据结构:const ( // 锁标识位(state的最后一位) // Mutex.state & mutexLocked==1表示已经上锁;Mutex.state & mutexLocked==0表示已经未锁 mutexLocked = 1 << iota // mutex is locked // 是否存在运行中的协程(
2022-02-21 20:00:00
235
原创 006-Golang1.17源码分析之select
Golang1.17源码分析之select-006Golang1.17 学习笔记006源码地址:runtime/select.go数据结构:type scase struct { c *hchan // chan elem unsafe.Pointer // data element}核心函数:selectgo()order0 为一个两倍 cas0 数组长度的 buffer,保存 scase 随机序列 pollorder 和 scase 中 channel 地址
2022-02-21 19:00:00
193
原创 005-Golang1.17源码分析之string
Golang1.17源码分析之string-005Golang1.17 学习笔记005源码包:src/runtime/string.go源代码:type stringStruct struct { str unsafe.Pointer len int}注意的就是:byte 和 string 互转是需要重新开辟空间的string 被分配到只读内存中utf-8 编码:变长形式,根据 unicode 值进行编码规则:1-127 占用一个字节,用 0 开头, 0xxxxxx
2022-02-19 10:45:00
290
原创 004-Golang1.17源码分析之struct
Golang1.17源码分析之struct-004Golang1.17 学习笔记004源代码地址:reflect/type.go数据结构:// A StructField describes a single field in a struct.type StructField struct { // Name is the field name. Name string // PkgPath is the package path that qualifies a lower cas
2022-02-18 19:00:00
341
原创 003-Golang1.17源码分析之map
Golang1.17源码分析之map-003Golang1.17 学习笔记003源码包:runtime/map.go数据结构:// A header for a Go map.type hmap struct { // Note: the format of the hmap is also encoded in cmd/compile/internal/reflectdata/reflect.go. // Make sure this stays in sync with the com
2022-02-16 14:31:56
320
原创 002-Golang1.17源码分析之channel
Golang1.17源码分析之channel-002源码包:runtime/chan.go数据结构:type hchan struct { qcount uint // 总容量 dataqsiz uint // 当前数据大小 buf unsafe.Pointer // 环形队列指针,指向 dataqsiz elemsize uint16 // 每个元素的大小 closed uint32
2022-02-16 14:09:31
11094
原创 001-Golang树型结构封装
001-Golang树型结构封装日常问题001注意:涉及到排序时,一般都是查库时就排好了,下面的操作不含排序实现1.1 参数和返回值定义这里的数据结构不使用 struct,用的 map,用什么我觉得都无所谓,根据具体情况来,反正最好还是用 struct 吧// 核心数据结构-一般都是从数据库中获取的var menus []map[string]interface{}menu := map[string]interface{}{ "parentId": 0, // 父级id, 0表示
2022-02-11 19:00:00
928
原创 Ruby踩坑记之深浅拷贝-001
Ruby踩坑记之深浅拷贝-001踩坑001浅拷贝:clone 和 dup 都是浅拷贝,只拷贝了一层,第二层不会进行拷贝,还是用的原地址;其中 dup 不会记住对象的 freeze 状态深拷贝:Marshal.load(Marshal.dump(a)) 实现了深拷贝。也可以使用 Json.parse(a.to_json) 完成深拷贝require "json"a = [ 'x',['y','z']]b = a.clonec = Marshal.load(Marshal.dump(a))d
2022-02-11 18:30:00
323
原创 001-Golang1.17源码分析之slice
Golang1.17源码分析之sliceGolang1.17 学习笔记001一、slice源码包:runtime/slice.go数据结构:type slice struct { array unsafe.Pointer // 指向底层数组的指针 len int // 长度 cap int // 容量}创建:这里创建规则跟 go 的内存管理有关,建议看完内存管理之后再看这里小于 32kb 的对象从 per-p 缓存空闲列表中创建
2022-02-11 10:48:58
540
原创 MongoDB WiredTiger 内存使用情况和限制
MongoDB WiredTiger 内存使用情况和限制Mongo学习笔记-0011.默认内存使用情况mongo 3.0.xmongo 会自动使用机器上所有的空闲的内存mongo 3.2默认内存使用大小 60%(RAM - 1GB) or 1 GBmogno 3.4默认内存使用大小 50%(RAM - 1GB) or 256 MB3.4 版本及之后,内存范围为 0.25G ~ 10000G2.内存限制配置在对应的配置文件中加入:wiredTigerCacheSize
2021-02-19 15:34:30
1001
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人