后端
文章平均质量分 66
Q52077987
这个作者很懒,什么都没留下…
展开
-
GO编程模式学习笔记:MAP-REDUCE
GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO编程模式:MAP-REDUCEMapfunc MapStrToStr(arr []string, fn func(s string) string) []string { var newArray = []string{} for _, it := range arr { newArray = append(newArray, fn(it)) } return newArr原创 2021-06-19 15:49:02 · 336 阅读 · 0 评论 -
GO编程模式学习笔记:修饰器
GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO编程模式:修饰器修饰器模式在函数变成第一公民以后,就从以前的继承结构演变成了函数嵌套,也就是函数式编程形式。一个简单的修饰器模式如下:package mainimport "fmt"func decorator(f func(s string)) func(s string) { return func(s string) { fmt.Println("Started") f原创 2021-06-11 10:26:53 · 298 阅读 · 2 评论 -
GO编程模式学习笔记:切片,接口,时间和性能
GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO编程模式:切片,接口,时间和性能1. Full Slice Expressionslice会共享底层数组,而append会在cap不足的时候扩容,所以共享底层数组的两个slice,在经过一次append之后,不一定还是否共享。不能依赖这个特性写代码。但是有一种方式可以强制append之后不共享内存:dir1 := path[:sepIndex:sepIndex]这个叫做Full Slice Expression,原创 2021-06-09 22:27:11 · 302 阅读 · 0 评论 -
GO 编程模式学习笔记:错误处理
GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO 编程模式:错误处理将错误类型当作区分错误的原因,类型相当于原来的错误码。if err != nil { switch err.(type) { case *json.SyntaxError: ... case *ZeroDivisionError: ... case *NullPointerError: ... default: .原创 2021-06-06 07:54:44 · 218 阅读 · 0 评论 -
GO 编程模式学习笔记——GO GENERATION
GO编程模式学习笔记系列为学习陈皓的GO编程模式系列文章记录与心得。原文链接:GO 编程模式:GO GENERATIONGo语言代码生成主要还是用来解决编程泛型的问题。Go语言的类型检查有两种技术,一种是 Type Assert,一种是Reflection。反射实现一个支持任何类型的slice(但是必须是同一类型,这也符合范型定义)type Container struct { s reflect.Value}func NewContainer(t reflect.Type, size原创 2021-06-04 09:59:07 · 320 阅读 · 0 评论 -
Redis Stream 简明使用教程
Redis Stream 特性是Redis 5.0之后才有的。Redis Stream的主要应用就是时间序列的消息流分发。PUB/SUB也可以做消息流分发,但是PUB/SUB不记录历史消息,而Redis Stream可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。Redis stream也是有长度大小限制的,超过设置的最大长度,最旧的消息会被丢失用...原创 2019-08-03 22:01:03 · 4386 阅读 · 0 评论 -
K8s基础问题
Kubernetes为什么又叫K8s?因为中间省略了8个字母,这是硅谷那些程序员的一个惯例。busybox是什么?BusyBox是一个遵循GPL协议、以自由软件形式发行的应用程序。Busybox在单一的可执行文件中提供了精简的Unix工具集,可运行于多款POSIX环境的操作系统。在Kubernetes的使用中,BusyBox常作为Pod的init container执行一些预配置工作。什么...原创 2019-09-09 19:43:56 · 675 阅读 · 0 评论 -
grpc和protocol buffer使用
grpcgrpc是Google的rpc开源框架,它使用了protocol buffer(Google的另一个开源工具)作为接口定义语言和消息传递格式。大概的使用方法是:使用protocol buffer语言编写接口定义。使用protocol buffer工具将接口编译成目标语言代码,包括服务端的接口框架和客户端的接口stub定义,数据的序列化和反序列化过程等通用代码。开发人员在服务端编...原创 2019-05-19 16:20:03 · 1685 阅读 · 2 评论 -
go 错误处理
Go 语言的错误处理有两种方式:panic和error。panic适用于严重的,调用方不可预料的错误,比如数组越界,即使告知调用方错误的原因,调用方也不可能在原地恢复程序正常流程。error就是一般的错误,比如网络中断,调用方可以预料这种错误的发生,并能根据错误做出相应的处理。有一种错误处理的模式是将panic通过recover转化成error,这种模式适用于内部错误多且杂,并且发生在各个函...原创 2019-03-08 16:57:30 · 394 阅读 · 0 评论 -
使用通信来共享内存,而不是通过共享内存来通信
所有go语言的学习者都会看到这样一句话“使用通信来共享内存,而不是通过共享内存来通信”,这是go语言并发编程的座右铭,然而却不那么好理解。为了搞清楚熟悉的锁模式并发编程和go的channel模式并发编程的区别,先分别看一下这两种模式都是怎么做的:为了行文简洁,暂时把代码执行单元都称为“线程”,在go语言中都是go routine。线程和go routine的关系涉及go 运行时的实现,已经超...原创 2019-02-11 17:29:41 · 2035 阅读 · 3 评论 -
Redis 消息发布与订阅
推模式客户端使用SUBSCRIBE命令订阅一个channel(会被阻塞),其他的客户端可以使用PUBLISH命令向这个channel发送消息,所有订阅者都会收到这个消息。推模式每一个channel维护一个客户端列表,发送消息的时候遍历列表发送。其余订阅,取消订阅,模式匹配订阅等实现也都很简单例子:subscriber:subscribe testpublisher:publish ...原创 2018-12-04 19:48:07 · 601 阅读 · 0 评论 -
用Redis做分布式锁
获取锁的过程生成一个128位的UUID,然后给锁的这个键赋值,如果赋值成功(返回1),就获取了锁;如果赋值失败(返回0),就相当于没有获取锁。客户端自己控制重试或者放弃。释放锁的过程释放锁就是移除锁键。但是如果在没有获取锁的情况下释放锁(一般是代码BUG),会将其他进程获取到的锁释放,锁就被破坏了。防止释放非自己获取的锁的一个办法是使用WATCH观察锁键获取锁键判断是否是自己设置的值...原创 2018-12-04 19:59:49 · 211 阅读 · 0 评论 -
《MySQL实战45讲》学习笔记——索引
任何能够加速搜索的数据结构都可以用来做索引模型,常见的就是哈希索引,有序列表索引和多叉树索引。哈希索引的特点是插入删除方便,查找更快,缺点是只能进行等值查询,不能查找范围。有序索引可以使用二分查找,同时也支持范围查找,但是插入和删除效率低,适合静态数据。多叉树索引索引支持范围查找,平衡了哈希索引和有有序列表索引。InnoDB使用B+ 树索引模型,是一种平衡多叉树。TIPS:如果想...原创 2018-12-05 19:24:44 · 458 阅读 · 0 评论 -
《MySQL实战45讲》学习笔记——锁
全局锁对整个数据库实例加锁。命令是:Flush tables with read lock。使用这个命令后,数据库编程只读。全局锁的典型使用场景是做全库的逻辑备份。将整个库锁定有很大缺点:如果在主库上备份,备份期间所有更新不能执行,业务基本停摆如果在从库上备份,备份期间不能从主库同步数据,造成主从延迟官方的逻辑备份工具是mysqldump,使用-single-transaction参...原创 2018-12-06 10:48:19 · 1691 阅读 · 0 评论 -
Redis事务
事务用法Redis事务相关的命令有5个:DISCARD, EXEC, MULTI, UNWATCH, WATCHMULTI开始一个事务,EXEC执行事务,DISCARD取消事务。在MULTI和EXEC之间的命令会得到原子的执行。Redis事务和一般数据库的事务不太相同,更像是一个原子的批处理,具体有以下两点不同:redis事务开始时,在EXEC之前,所有的命令都在客户端排队,并不会到服务器...原创 2018-12-03 19:43:23 · 191 阅读 · 0 评论 -
《MySQL实战45讲》学习笔记——事务隔离
SQL标准事务隔离的级别包括:读未提交,read uncommitted,一个事务还没有提交,它做的变更就能被别的事务看到。读提交,read commited,一个事务提交之后,它做的变更才会被其他事务看到。可重复读,repeatable read,一个事务执行的过程中看到的数据,总是跟这个事务在启动的时候看到的数据是一致的。串行化,对于同一行记录,加读写锁。如果事务读写冲突,必须串行。...原创 2018-12-07 10:49:43 · 1210 阅读 · 0 评论 -
《MySQL实战45讲》学习笔记——索引(二)
普通缩影和唯一索引普通索引和唯一索引都是二级索引。区别是唯一索引由数据库保证字段的唯一性。查询过程中,普通索引和唯一索引的性能差不多,普通索引也就是多判断一次而已。更新过程,普通索引可以使用change buffer优化,唯一索引因为要检查数据的唯一性,必须要将数据读入内存,可能引入磁盘的随机读,性能会下降。使用普通索引,数据的唯一性要靠业务来保证。change buffer机制cha...原创 2018-12-11 11:05:41 · 1700 阅读 · 0 评论 -
几个go 并发模式
go 语言中向一个已经关闭的channel发送数据会引起panic,因此go并发中一个基本的原则就是在数据发送端关闭channel。虽然channel是双向的通道,两个go routine可以通过一个channel进行双向通信,但是在一般的数据流的模式下,我们宁可将channel降级为单向的通道,以获取更安全可读的代码。本文主要介绍一些将channel作为单向通信的并发模式,文末会简单给一个双向...原创 2019-02-15 19:55:22 · 1333 阅读 · 0 评论 -
《MySQL实战45讲》学习笔记——SQL语句的执行
MySQL 逻辑架构(图片来自MySQL实战45讲文稿):MySQL 的存储引擎是插件式的,这个系列讲座主要讲的是InnoDB存储引擎。连接器:管理连接,权限验证。MySQL有一个管理数据库mysql,mysql数据库中有一个表叫做user,user表中保存了4部分内容:用户,权限,安全和资源控制。用户部分保存了用户名和密码以及允许连接的Host。权限部分规定了用户是否可以查询,删除数据,...原创 2018-12-04 11:04:05 · 600 阅读 · 0 评论