- 博客(24)
- 资源 (1)
- 收藏
- 关注
原创 Redis 单线程模型
1、Redis的单线程主要是指Redis的网络IO和键值对的读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。但是Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。所以,严格上来说,Redis并不是单线程的。2、Redis高性能的原因 Redis大部分操作是在内存上完成的,同时采用了高效的数据结构,例如哈希表和跳表。 Redis采用了多路复用机制,使其在网络IO操作中能并发处理大量的客户请求,实现高吞吐量..
2021-05-31 10:30:42 315
原创 Redis基本数据结构
1、基本数据结构 String(字符串) List(列表) Hash(哈希) Set(集合) Sorted Set(有序集合) 上面都是Redis键值对中值的数据类型,也就是数据的保存形式。 2、底层数据结构底层数据结构一共有6种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。3、键和值本身用什么结构组织?为了实现从键到值的快速方法,Redis使用了一个哈希表来保存所有的键值对。一个哈希表,其实就是一个数..
2021-05-30 23:13:16 225 1
原创 Redis 知识框架
Redis是一个非常优秀的系统,它在CPU使用、内存组织、存储持久化和网络通信这四大方面的设计非常经典。为了能够在较短的时间内,掌握Redis的核心知识,必须形成系统guan
2021-05-28 20:43:08 103
原创 grpc auth interceptor+ Identifier Type设计模式+JWT验证
1、自定义 grpc interceptorconst ( authorizationHeader = "authorization" bearerPrefix = "Bearer ")//Interceptor creates a grpc auth interceptor.func Interceptor(publicKeyFile string) (grpc.UnaryServerInterceptor, error) { f, err := os.Open(publ
2021-05-27 23:38:48 257
原创 K8s架构概览
1、k8s集群K8s集群中主要有两类角色:Master节点和Worker节点。简单讲,Maser节点主要是用来管理和调度集群资源的,worker节点是资源的提供者。在一个高可用的K8s集群中,Mater节点和Worker节点一般有多个节点构成。这些节点可以是物理机,也可以是虚拟机。Worker节点所提供的资源单位叫做Pod,简单理解,Pod就是K8s云平台它所提供的虚拟机。Pod里面驻的是应用容器,比如说docker容器。容器是CPU和内存的资源隔离单位。大部分场景中,一个Pod里面只驻.
2021-05-27 14:56:07 2300
原创 golang面试题:Sum of Squares
package mainimport "fmt"func SumOfSquares(c, quit chan int) { y := 1 for { select { case c <- y * y: y++ case <-quit: return } }}func main() { sumChan := make(chan int) quitChan := make(chan int) sum := 0 go func() ...
2021-05-24 23:29:11 109
原创 golang 字符串相等比较
fmt.Println("go"=="go")fmt.Println("GO"=="go")fmt.Println(strings.Compare("GO","go"))fmt.Println(strings.Compare("go","go"))fmt.Println(strings.EqualFold("GO","go"))输出结果truefalse-10true内建方法"==”,区分大小写,最简单的方法 Compare函数,区分大小写,比内建方法“==”的速度要快.
2021-05-23 20:32:17 928
原创 golang find file
1、查找文本文件package mainimport ( "fmt" "log" "os" "path/filepath")func main() { var files []string root := "/your/file/path" err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if er
2021-05-22 23:41:15 468
原创 Golang Read Write Create and Delete text file
package mainimport ( "fmt" "io" "os")var path = "test.txt"func main() { createFile() writeFile() readFile() deleteFile()}func createFile() { // check if file exists var _, err = os.Stat(path) // create fi.
2021-05-22 23:13:37 115 2
原创 二叉树后序非递归遍历
package mainimport ( tree "awesomeProject/interview/Tree" "fmt")func postorderTraversal(root *tree.Node) []int { if root == nil { return nil } result := make([]int, 0) stack := make([]*tree.Node, 0) var lastVisit *tree.Node //弹出过的节点,保证根节点必须.
2021-05-20 23:29:13 72 1
原创 二叉树中序非递归遍历
package mainimport ( tree "awesomeProject/interview/Tree" "fmt")//非递归中序遍历(left->root->right)func inorderTraversal(root *tree.Node) []int { result := make([]int, 0) if root == nil { return result } stack := make([]*tree.Node, 0) //首先判断.
2021-05-18 23:46:15 98
原创 理解队列
1、基本含义队列其实可以通过数组来实现的。可以用一个抽象数组来描述一个队列。为了实现队列功能,可以给数组添加两个指针变量:一个称为头指针,它指示当前消费的位置,例如图中0-2三个元素已经消费出队列了。每次消费一个元素,头指针的值加1。一个称为尾指针,表示下一个入队列的位置,每次生产者生产一个元素或是入队列一个元素,尾指针就会加1队列的特性要求,尾指针的值必须大于等于头指针的值,如果两种是相等的 ,表示当前队列为空。如果两者不相等,那么尾指针的值减去头指针的值的差值就是当前队列中未消费
2021-05-18 12:58:04 102
原创 golang 生成JWTToken
package tokenimport ( "crypto/rsa" "time" "github.com/dgrijalva/jwt-go")// JWTTokenGen generates a JWT token.type JWTTokenGen struct { privateKey *rsa.PrivateKey issuer string nowFunc func() time.Time}// NewJWTTokenGen new JWT token.
2021-05-17 23:16:07 1023
原创 RSA非对称加密流程说明
说明:图例中,红框:需要保密的文本;绿框:不需要保密的文本。所谓非对称,指的是:用PrivateKey加密,就必须用PublicKey解密。用PublicKey加密,就必须用PrivateKey解密。1、加密如果A需要把文件Text,通过不安全的网络 ,发送到B,则需要加密。为了解决对称加密的密码泄露的问题,使用非对称加密。图中,红色框表示的B模块中的BPrivateKey和Text只有B知道,绿色框代表的BPublicKey网络上任何人都可以知道。A通过BPublicKey和Tex
2021-05-16 23:37:12 772 3
原创 二叉树前序非递归遍历
package treetype Node struct { Val int Left *Node Right *Node}func NewNode(val int) *Node { node := &Node{ Val: val, Left: nil, Right: nil, } return node}前序遍历:package mainimport ( tree "awesomeProject/interview/Tree" ".
2021-05-15 22:48:54 91 1
原创 RPC和REST的区别
一句话,两者并不是一个层面意义上的东西。1、定义REST 是Representational State Transfer的简称,是一种软件架构风格,中文描述为表述性状态转移(是指某个瞬时状态的资源数据的快照,包括资源数据的内容、表述格式(XML、JSON)等信息)。这种风格的典型应用就是HTTP。RPC 是 Remote Procedure Call 的缩写形式,中文描述为远程过程调用,用来屏蔽远程调用跟本地调用的区别,是解决应用间通信的一种方式。RPC可以基于TCP/UDP,也可以基于.
2021-05-12 16:00:22 1887
原创 什么是RPC?
1、基本定义RPC,全称Remote Procedure Call, 即远程过程调用。主要作用是屏蔽网络编程细节,实现调用远程方法就像调用本地方法(同一个进程中的方法)一样的体验。同时屏蔽底层网络通信的复杂性,让我们更加专注业务逻辑的开发。2、RPC通信RPC是一个远程调用,肯定是需要跨服务器而非本机,所以需要网络编程才能实现,这就带来了以下几个问题:Call ID 映射在本机的函数调用中,函数体是直接通过函数指针来指定的,当函数调用时,编译器会自动调用相应的函数指针。但是在远
2021-05-12 12:50:52 20271 1
原创 golang channel使用场景:广播通知
类似 pthread_cond_broadcast() 的功能。利用从已关闭的 channel 读取数据时总是非阻塞的特性,可以实现在一个协程中向其他多个协程广播某个事件发生的通知:package mainimport ( "fmt" "time")func main() { N := 10 exit := make(chan struct{}) done := make(chan struct{}, N) //start N worker
2021-05-11 23:11:05 655 1
原创 golang channel使用场景:条件变量(condition variable)--一对一通知
条件变量(condition variable)类型于 POSIX 接口中线程通知其他线程某个事件发生的条件变量,channel 的特性也可以用来当成协程之间同步的条件变量。因为 channel 只是用来通知,所以 channel 中具体的数据类型和值并不重要,这种场景一般用 struct{} 作为 channel 的类型。一对一通知类似 pthread_cond_signal() 的功能,用来在一个协程中通知另个某一个协程事件发生:package mainimport (
2021-05-11 23:03:06 325 1
原创 golang channel使用场景:futures / promises
golang 虽然没有直接提供futrue / promise模型的操作原语,但通过 goroutine 和 channel 可以实现类似的功能:package mainimport ( "io/ioutil" "log" "net/http")//http request promisefunc RequestFuture(url string) <-chan []byte { c := make(chan []byte, 1) go ..
2021-05-11 22:55:26 155 2
原创 用go语言控制Docker启动MongoDB并建立测试库
1、拉取MongoDB镜像(API方式)func imagePull(ctx context.Context, refStr string, c *client.Client) { pullReader, err := c.ImagePull(ctx, refStr, types.ImagePullOptions{ All: false, RegistryAuth: "", PrivilegeFunc: nil, }) if err != nil { p
2021-05-11 22:42:50 239
转载 GOB 的数据
原文在此:http://blog.golang.org/2011/03/gobs-of-data.html,来自 Golang 官方博客。Gob 是 Golang 的包中带的一个数据结构序列化的编/解码工具。在实际应用中,已经有不少的编解码工具/包/库了,为什么 Golang 还要新开发一个 Gob?又是一个重复的轮子?Gob 做了哪些工作?Gob 的优势是什么?本文做了一个较为全面的解释。—————-翻译分割线—————-Gob 的数据为了让某个数据结构能够在网络上传输或能够保存至文件,它
2021-05-10 21:59:38 273
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人