Go学习笔记(五)——泛型
Tutorial: Getting started with genericsWhen To Use GenericsAn Introduction To GenericsDeconstructing Type Parameters
泛型介绍泛型常用方法
pulsar学习(一)
先占坑pulsar官网
一次线上panic排查记录
先占坑
redis笔记
redis基础知识
数据结构底层数据结构SDS双向链表压缩列表跳跃表Hash表整数数组对外数据结构string
list
map
set
sorted set
rehash如何触发和渐进式机制
rehash触发根据负载因子阈值进行触发,不同于java中hashMap ,reids默认提供两个扩容负载因子阈值分别为1和5;
当负载系数达到1时, 如果当前redis server没有执行AOF重写或者RDB备份,会触发扩容
当负载系数达到5时,此时会立即触发阔扩容
rehash流程
rehash时会维护两个hash桶,一个是扩容前的老hash桶,一个是扩容后的新Hash桶
渐进式扩容方式为:
设置rehashIndex为0 表示开始扩容
当在rehash过程中,有客户端命令执行时,除了进行正常的操作外,还会将当前rehashindex对应的桶中数据迁移到新hash桶中,rehashindex 加一
当没有命令执行时,redis服务也会使用定时任务,执行迁移过程(每次执行不超过1ms)
当所有老hash桶中数据都迁移完成时 rehashindex设置为-1表名迁移结束 ...
2020面试小记
写在即将入职之际,算是对这一次的换工作的一次总结吧。从去年年底下定决心换工作开始准备到现在,也过去了将近半年的时间了,最后斩获了自己比较满意的offer。与之前的几次换工作经历相比,这一次大致做了如下准备。
面试前1.日常刷题之前工作算是非典型的互联网工作,每天会在闲暇之余会在leetcode或者lintcode刷刷题,一开始刷题是为了开拓开拓思路,同时加强算法的掌握度。刷题时大概用过两种方式,第一种是按照某一类型进行从简单到难的专项加强,当然做到有些Medium难度和Hard难度的时候,会出现找不到突破点的挫败感,这时候不妨先休息一下,换换脑子刷一些水题,提升兴趣度和成就感;然后再回过头来从新思考之前没做出来的题,如果还没有想到解法,这时候就推荐参考一下大神们的解题思路,但是不要就抄一下AC就完事了,要看明白怎么解,去思考为什么,知道了思路再尝试自己去编码实现。
不过说实话,难的问题感觉和天赋还是有关系的,到现在还是听到动态规划就望而却步
2.基础知识这里可能要分为两部分,一部分是计算机相关的基础知识,一部分是常用语言相关的基础知识。
计算机相关的基础知识像是数据结构和算法相关 ...
go学习笔记(四)——并发
1. goroutine什么是goroutinegoroutine是golang的最小执行单元,每个go程序至少会有一个主goroutine,这里可以类比成java中额主线程。为了更好的理解goroutine,可以将进程,线程和goroutine(其他语言中的协程)进行类比。
进程,线程和goroutine
进程是操作系统进行资源分配,调度和执行的基本单元。当操作系统分配一个进程时,会生成一个唯一对应的PCB块以及为该进程分配专有的系统资源。后续操作系统的调度会通过对应的PCB块来进行。
线程是程序执行流的最小单元,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。一般情况下进程与线程为1:n的关系,同一个进程生成的线程会共享改进程的堆上资源。通常情况线程的调度由操作系统内核态进行调度。
**协程(goroutine)**是更轻量级的线程,或者可以理解为用户态的线程。协程的调度实现答题可以分为两种,一种是用户态的调度实现,比如python中有名的gevent,就是通过用户态调度器实现协程间的调度,这种调度方式存在的一个弊端是由于调度完全是在用户态进行的,所以内核线 ...
从lintcode LFU引发的思考
题目24. LFU Cache
LFU是一个著名的缓存算法对于容量为k的缓存,如果缓存已满,并且需要逐出其中的密钥,则最少使用的密钥将被踢出。实现LFU中的set 和 get操作
题目的内容比较直观就是设计一个LFU缓存淘汰算法的实现,下面我们先来看下LFU的基本流程
LFULFU算法中会记录一定时间内每个Key的被访问次数,淘汰时会淘汰最近一段时间内被访问次数最少的key,当多个keys计数值为最小值时,按照LRU进行淘汰,如下图所示:
其他常见缓存淘汰策略FIFOFIFO是最简单的先进先出,使用Queue即可实现。
LRULRU是根据最近最少使用原则进行缓存淘汰的算法。顾名思义当需要进行页置换或者缓存淘汰时将最近最少命中的页或缓存剔除的算法,如下图:
解题思路HashMap + 小根堆时间复杂度 get : O(1) set O(logk)为了查询速度将缓存已key-value的形式保存在hashMap中,同时使用数组实现的小根堆来记录数据的访问频次情况,以便于淘汰策略进行淘汰操作。
LFU解题代码
java中优先级队列PriorityQueue解析PriorityQue ...
go学习笔记(三)——语法
1.变量变量是每种语言都不可或缺的声明方式,go提供了以下几种声明方式
12345var a stringvar a string = "a"var a = "b"a := "c" //只能在函数内使用var a,b,c string //同类型多变量的声明
需要注意的是,在go语言中声明的变量如果在接下来作用域中不使用,编译时会报xxx declared and not used错
除了上述几种声明,go语言还可用分组声明的方式
1234var( a int =1 b string = "a")
同时 go中还有一个特殊的变量,匿名变量(_)在表示接收但不会使用的变量
12dictValue := map(string)int{"test":1}value,_ := dictValue["test"]
当然除了上面的使用方式,匿名变量还有其他的作用,在稍后会做解释。
2.常量常量可以是字符、字符串、布尔值或数值。不支持 推断赋值(:& ...
go学习笔记(二)——基本数据类型
数据类型1.基本类型go语言中的基本类型如上图所示,go语言中有五类基数类型。
1) boolean型同其他语言一样,boolean包括两个值 true 和false
1var booleanVal boolean = true
2) 数值类型数值类型中可以分为三大类:整型,浮点型和复数
a.整型go语言中直接定义好了不同位数的整型,其中包括如下表所示类型
类型
备注
rune
int32的别称
int8
8位带符号整数类型
int16
16位带符号整数类型
int32
32位带符号整数类型
int64
64位带符号整数类型
byte
相当于uint8别称
uint8
8位不带符号整数类型
uint16
16位不带符号整数类型
uint32
32位不带符号整数类型
uint64
64位不带符号整数类型
注意:1.int的默认类型为int322.go语言中不支持隐式类型转换,哪怕是int8转int32,使用隐式类型转换会在编译器报错
123var a int32 = 123//编译报错cannot use a (type i ...
go学习笔记(一)——环境搭建
go安装和配置国内源下载
windows环境下,下一步安装法,即可完成安装
go中文文档 go包信息检索
go的常用命令go包含的命令 如下图:
常用命令
命令
可选参数
作用
备注
go build
-o 指定输出名称
将go代码文件编译成可执行文件
默认输出名称为package名称,使用build时,会忽略已”_”和”.”开头的文件
go install
go clean
清理当前项目中的
go get
从远程仓库获取代码包
同python的pip
go fmt
-w 写入到源文件
代码标准格式化
go test
执行单元测试(文件名为*_test.go)
IDE选择1.atom在atom上开发go
2. vs code安装请至官网选择对应版本进行安装
vscode实用快捷键
手动安装go需要的插件
vs code go插件安装失败问题解决
创建github.com下的插件12345678910111213141516171819202122232425262728cd $GOPATH/srcmkdir githu ...




