饿汉式 type singleton struct { } var instance = new(singleton) func GetInstance() *singleton{ return instance } 或者 type singleton struct { } var instance *singleton func init() { instance = new(singleton) } func GetInstance() *singleton{ return instance } 这两种方法都可以,第一种我们采用创建一个全局变量的方式来实
锁 共享内存的并发问题 在很多语言中并发编程都有对一个内存进行读写的情况,比如下面的测试: func test() { count++ println(count) } var count int func main() { for i := 0; i < 30; i++ { go test() } time.Sleep(3 * time.Second)
排序 我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。 排序算法大体可分为两种: 一种是比较排序,时间复杂度O(nlog
底层结构 type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive index recvq waitq // list of recv waiters sendq waitq // list of send waiters // lock protects
hash冲突 哈希查找表一般会存在“碰撞”的问题,就是说不同的 key 被哈希到了同一个 bucket。一般有两种应对方法:链表法和开放地址法。链表法将
slice slice是一个数组某个部分的引用,非协程安全的。 创建 通过数组创建 切片的初始化格式是:var slice1 []type = arr1[start:end],star
range slice func main() { s := []int{1, 2, 3} for i := 0; i < len(s); i++ { if i == 1 { s = append(s, 4) } fmt.Println(i, s[i]) } } 上面的代码,遍历中新增元素是没有问题的。 但是下面的range遍历,结果是不
动态字符串 redis是C语言编写,但是字符串并不是简单地的C字符串。它是SDS(simple dynamic string)。 /* * 保存字符串对象的结构 */ struct sdshdr
主从 需要注意,主从复制的开启,完全是在从节点发起的;不需要我们在主节点做任何事情。 从节点开启主从复制,有3种方式: (1)配置文件 在从服务器的
上篇主要讲到redis的基础命令,这篇涉及到redis的配置、持久化、主从、事务、内存淘汰策略 redis的配置 启动redis服务器的时候会指
此篇主要介绍redis的一些机制 expire删除机制 大家有没有想过redis是怎么实现key的过期删除的,作为有经验的开发人员,也许大家很容
缓存穿透 概念 访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。 解决方案 第一种:采用布隆过滤器,使用一个足够大的bi
redis简介 Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志 型、Key-Value 数据库。 redis会周期性的把更新的
查找bigkey redis-cli --bigkeys 统计每种数据类型的键值对个数以及平均大小。此外,这个命令执行后,会输出每种数据类型中最大的 bigkey 的信息,对于 String 类型来说,会输
该文章讲解redigo的使用。 talk is cheap show me the code redigo基本使用 opt := redis.DialPassword("root") c, err := redis.Dial("tcp", "127.0.0.1:6379", opt) if err != nil { fmt.Println("Connect to redis error", err) return } defer c.Close() userName, err := redis.String(c.Do("GET", "userName")) if err != nil { fmt.Println("redis get failed:", err) }
什么是vendor go vendor 是go 1.5 官方引入管理包依赖的方式,1.6正式引入。其基本思路是,将引用的外部包的源代码放在当前工程的vendor目录下
为什么要有context 为了在协程之间传递信息,比如网络服务,每个请求都是一个协程,在协程中还可能开启新的子协程,子协程中还有新的协程,我们
两种转换方式 标准转换 go中string与[]byte的互换,相信每一位gopher都能立刻想到以下的转换方式,我们将之称为标准转换。 // string to []byte
bufio bufio包原理 bufio 是通过缓冲来提高效率。读的时候一次多读一些,默认 io操作本身的效率并不低,低的是频繁的访问本地磁盘的文件。所以bufio
拼接字符串大对比 直接+拼接 func StringsAdd() string { var s string for _, v := range StrData { s += v } return s } 使用fmt包进行组装 func StringsFmt() string { var s string = fmt.Sprint(StrData) return s } 使用strings包的joi