自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 pool 减小GC压力的缓存池

pool总结pool是用来缓解Gc压力的,会在每次Gc之前全部清空pool,GC默认每两分钟一次在倒入 pool 包时执行的 init 函数会向 GC 注册 poolCleanup 函数,也就是在 GC 之前会运行该函数。pool 也存在私有队列为空的时候,从全局队列偷取一部分noCopy 保证是一个空结构,用来防止pool在第一次使用后被复制分为本地local 和 global 队列 来绑定P进行操作poollocal 有pad 来防止false sharding

2020-09-29 15:46:41 474

原创 MRR 顺序读取

总结参数read_rnd_buffer_size用来控制键值的缓冲区大小,会先读区一页的数据,或者需要的数据在buffer中进行排序,然后,根据顺序进行读取,防止磁盘随机读取是否启用MRR优化,可以通过参数optimizer_switch中的flag来控制。当MRR为on时,表示启用MRR优化。mrr_cost_based表示是否通过costbased的方式来选择是否启用mrr。若设置mrr=on,mrr_cost_based=off,则总是启用MRR优化。如下:和 MRR 相关的配置 有两个:更

2020-09-29 09:42:33 774

原创 服务注册与发现 -- 结构化日志 服务调用链追踪 - 服务指标监控

服务注册与发现etcd [OK]结构化日志zap [OK]服务调用链追踪zipkin [OK] jaeger [OK]服务指标监控https://github.com/g4zhuj/grpc-wrapper

2020-09-28 17:25:30 193

原创 singleflight---防缓存穿透利器

SingleFlight总结提供了三个参数Do同步通知、Dochan异步chan通知、Forget删除map的存在的键值每次调用都会重置map结构体是由mu sync.Mutex、m map[string]*call组成,mu用于操作的排它锁,m用于存储已有的键值的个数如果m中存在当前键值对,就会阻塞等待,不存在的时候会加创建call结构存入m中Dochan会异步执行,将结果放入chan通知其他阻塞的协程阻塞的协程永的WaitGroup实现do 的简单使用package maini

2020-09-28 14:34:23 1482

原创 linux 一键部署lnmp

linux 一键部署lnmphttps://drive.weixin.qq.com/s?k=AP8AgwewAAcmVqinHeANMAyAZdAOY#/直接解压 ,离 main有install.sh

2020-09-27 09:53:00 1198

原创 php 降版本

https://blog.csdn.net/qvsx100/article/details/106473372/

2020-09-25 16:21:07 1568

转载 如何实现 HTTP 断点续传多线程下载

1. HTTP断点续传多线程下载一个比较常见的场景,就是断点续传/下载,在网络情况不好的时候,可以在断开连接以后,仅继续获取部分内容. 例如在网上下载软件,已经下载了 95% 了,此时网络断了,如果不支持范围请求,那就只有被迫重头开始下载.但是如果有范围请求的加持,就只需要下载最后 5% 的资源,避免重新下载.另一个场景就是多线程下载,对大型文件,开启多个线程, 每个线程下载其中的某一段,最后下载完成之后, 在本地拼接成一个完整的文件,可以更有效的利用资源.一图胜千言2. Range &

2020-09-25 09:49:56 1035

原创 Semaphore 控制有借有还的请求数

Semaphore信号量是在并发编程中比较常见的一种同步机制,它会保证持有的计数器在 0 到初始化的权重之间,每次获取资源时都会将信号量中的计数器减去对应的数值,在释放时重新加回来,当遇到计数器大于信号量大小时就会进入休眠等待其他进程释放信号,我们常常会在控制访问资源的进程数量时用到。Golang 的扩展包中就提供了带权重的信号量,我们可以按照不同的权重对资源的访问进行管理,这个包对外也只提供了四个方法:NewWeighted 用于创建新的信号量;Acquire 获取了指定权重的资源,如果当前没有『

2020-09-24 16:24:51 218

原创 判断是否实现全部空接口类型的方法

实现全部空接口类型的方法定义空接口类型&指定实现方法type Study interface { Listen(msg string) string Speak(msg string) string Read(msg string) string Write(msg string) string}限制实现所有方法package studyimport “github.com/pkg/errors”var _ Study = (*study)(nil)type Study i

2020-09-24 15:50:41 237

原创 errGroup-协程出错-通知其他协程

ErrGroup总结使用1package mainimport ( "errors" "fmt" "golang.org/x/sync/errgroup")func main() { group := new(errgroup.Group) nums := []int{-1, 0, 1} for _, num := range nums { tempNum := num // 子协程中若直接访问num,则可能是同一个变量,所以要用临时变量 // 子协程 group

2020-09-23 18:04:09 891

原创 Cond-根据特定条件唤醒其他协程

CondGo 语言在标准库中提供的 Cond 其实是一个条件变量,通过 Cond 我们可以让一系列的 Goroutine 都在触发某个事件或者条件时才被唤醒,每一个 Cond 结构体都包含一个互斥锁 L,我们先来看一下 Cond 是如何使用的:总结Cond提供了类似队列FIFO的等待机制,同时也提供Signal唤醒队列最久一个、Broadcast全部唤醒相比于使用 for {} 忙碌等待,使用 Cond 能够在遇到长时间条件无法满足时将当前处理器让出的功能,如果我们合理使用还是能够在一些情况下提升

2020-09-23 14:37:15 506

原创 雪花算法

package mainimport (“fmt”“github.com/bwmarrin/snowflake”“os”“reflect”“time”)//Aa、Bb、Cc、Dd、Ee、Ff、Gg、Hh、Ii、Jj、Kk、Ll、Mm、Nn、Oo、Pp、Qq、Rr、Ss、Tt、Uu、Vv、Ww、Xx、Yy、Zz//IJjkKLMNO5//67PQX12RVW//3YZaDEFGbc//defghiABCH//lSTUmnopqr//xyz04stuvw//89+/var (E

2020-09-22 09:37:30 205

原创 Once---单例模式

Once总结Once只对外提供了do方法结构体由done uint32和m Mutex组成,done代表执行的次数,m是获取次数(并发读写会影响结果,所以加锁)的时候加锁处理无论是否执行成功,都会deferatomic.StoreUint32(&o.done, 1) 加1操作如果当前done是0,则会执行,否则直接返回Go 语言在标准库的 sync 同步包中还提供了 Once 语义,它的主要功能其实也很好理解,保证在 Go 程序运行期间 Once 对应的某段代码只会执行一次。在如下

2020-09-21 21:51:23 284

原创 WaitGroup

WaitGroup总结WaitGroup 提供Add、Wait、done三个方法,Add负责增加计数器,done负责发送信号,然后Add进行减一操作,等到计数器为0的时候会唤醒全部的休眠goroutineAdd 不能在和 Wait 方法在 Goroutine 中并发调用,一旦出现就会造成程序崩溃;WaitGroup 必须在 Wait 方法返回之后才能被重新使用;Done 只是对 Add 方法的简单封装,我们可以向 Add 方法传入任意负数(需要保证计数器非负)快速将计数器归零以唤醒其他等待的 G

2020-09-21 21:44:07 463

原创 Gorm 自动update操作自动过滤0和 “ “

Gorm 自动update操作自动过滤0和“gorm会自动过滤结构体的0 和" "type CrmUserTableColumns struct { Id int64 `gorm:"column:ids"` Name string `gorm:"column:xxx"` Account string `gorm:"column:xxx"` Password

2020-09-21 15:05:02 1471

原创 golang 获取指定时间的月份

times := “2020-09-18 15:04:05”s, _ := time.Parse(“2006-01-02 15:04:05”, times)fmt.Println(s.Year())fmt.Println(int(s.Month()))fmt.Println(s.Day())fmt.Println(s.Date())os.Exit(12)数字形式的直接int()就可以

2020-09-18 18:43:22 4450

原创 协程的底层实现原理

协程简介线程是进程的执行体,拥有一个执行入口,以及从进程虚拟地址空间分配的栈信息,包括用户栈和内核栈操作系统会记录线程控制信息线程获得CPU时间片以后才可以执行CPU切换对应线程的栈基、栈指针、指令指针等寄存器如果线程各自创建几个执行体,给他们各自指定执行入口,申请一些内存分配给他们做执行栈,那么线程就可以按需调度这几个执行体了为了实现这几个执行体的切换,线程也需要记录执行体的信息,包括ID、栈的位置、执行入口地址、执行现场等等线程可以选择一个执行体来执行,此时CPU中指令指针就会指向这个执

2020-09-17 22:40:33 4504

原创 main等待其他携程小技巧

mian程等待其他写成退出的小技巧package mainimport ("fmt" "sync")var ( count int rwLock sync.RWMutex)func main() { for i := 0; i < 2; i++ { go func() { for i := 1000000; i > 0; i-- { rwLock.Lock() count ++ rwLock.Unlock() } fmt.Pr

2020-09-17 21:56:19 135

原创 sync.RWMutex

RWMutex总结读和写或者释放所得动作都是原子性操作readerSem — 读写锁释放时通知由于获取读锁等待的 Goroutine;writerSem — 读锁释放时通知由于获取读写锁等待的 Goroutine;w 互斥锁 — 保证写操作之间的互斥;readerCount — 统计当前进行读操作的协程数,触发写锁时会将其减少 rwmutexMaxReaders 阻塞后续的读操作;readerWait — 当前读写锁等待的进行读操作的协程数,在触发 Lock 之后的每次

2020-09-17 21:54:14 456

原创 sync.Mutex

-----sync包------Mutex总结Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。互斥锁占用8字节正常模式,先进先出的队列形式获取锁,饥饿模式是当一个goroutine获取锁的时候,此时的goroutine超过1s没有获取到锁.其他的gorpoutine获取了,这就是饥饿模式,优化是,知乎交给队列的最先的goroutine饥饿模式

2020-09-16 21:59:30 1074

原创 golang 读文件和写文件汇总

Golang读写文件操作读文件使用golang语言去读取一个文件默认会有多种方式,这里主要介绍以下几种。使用ioutil直接读取需要引入io/ioutil包,该包默认拥有以下函数供用户调用。func NopCloser(r io.Reader) io.ReadCloserfunc ReadAll(r io.Reader) ([]byte, error)func ReadDir(dirname string) ([]os.FileInfo, error)func ReadFile(filena

2020-09-16 17:20:28 798

原创 golang判断结构体为空

golang结构体怎么判断是否为空golang结构体怎么判断为空?就是判断是否已经初始化,方法如下:可以使用if objectA== (structname{}){ // your code },进行判断。示例代码如下:package mainimport ( "fmt" "reflect")type A struct{ name string age int}func (a A) IsEmpty() bool { return refle

2020-09-15 15:03:15 6787 3

原创 golang map嵌套结构体,改变结构体的值

type aa struct { a string b int64 c string d int64}func main() { as := map[int64]*aa{ 11: &aa{ a: "A", b: 1, c: "", d: 0, }, } for index, v := range as { //type sf map[int64]aa //var aaa sf = map[int64]aa{ // index: aa

2020-09-11 10:15:41 2225 3

原创 zshrc 插件

自动加载记录plugins=(gitzsh-autosuggestions //自动加载记录#incr)

2020-09-09 14:35:45 270

原创 两个表修改 update

update telemarketing_upload_links ,telemarketing_links set telemarketing_upload_links.account = telemarketing_links.accountwhere telemarketing_upload_links.mp = telemarketing_links.mp and telemarketing_upload_links.created_at > ‘2010-01-29 10:30:50’

2020-09-09 14:14:23 964

原创 常用知识点

常量定义方法const ( stackType arrayType = 1 << iota //1 loopQueueType //2)

2020-09-09 10:51:43 71

原创 sql database/sql

https://github.com/arthas29/sqlmapper/blob/master/fields_map_test.go

2020-09-03 19:00:32 117

原创 mysq超时 invalid connection 无效链接总结

交互式连接 就是mysql 客户端 和服务器的连接时常非交互式。 可以理解为就是 代码程序连接空闲连接 最大时常wait_timeout默认 8小时查看show variables like "wait_timeout%";交互式最大连接时常interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。说得直白一点,通过mysql客户端连接

2020-09-03 10:01:34 2829

原创 mysql 常用sql语句汇总

分组查询最新的数据select max(lp.id),lp.phone from le_p as lpleft join le_app_record as lar on lar.leads_id = lp.idwhere lp.task_id = "InsuranceAgent_534235579" group by lp.phone

2020-09-02 16:27:13 146

mysql-实用-索引失效和优化原则

mysql-实用-索引失效和优化原则

2021-07-23

空空如也

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

TA关注的人

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