- 博客(132)
- 收藏
- 关注

原创 Linux gcc没有默认对齐数(内赋gcc官方大佬邮件)
轻松求得系统的默认对齐数在自己解决问题中遇到了内存对齐的问题。突然发现我的Linux默认对齐数好像不是4。可以参考这个OJ题来理解。有趣的内存对齐面试题优快云上好像所有的博客都说是4。然后就记录一下怎么推断出自己系统的默认对齐数。推断对齐数首先,我们先写一个程序:#include <iostream>struct test{ char a; doub...
2019-05-11 14:21:00
2818
16
原创 缓存那些事儿
需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。Redis是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
2025-03-04 23:21:13
787
原创 nginx 正向代理与反向代理
正向代理:代理客户端访问目标服务器,常见于 VPN、浏览器代理。反向代理:代理服务器处理客户端请求,常用于负载均衡、后端保护。如果你的目标是访问外部资源,用正向代理;如果是优化和保护后端服务器,用反向代理。
2025-02-26 23:08:49
463
原创 nginx 搭建 IPv6 -> IPv4 反向代理服务器
在实际生产过程中,由于各种原因,我们的在线服务搭建在火山云服务器上,使用火山云包括 ECS、CLB、PLB 等组件进行网络通信,并且通过专线接受来自某公司内部流量。但是在大概 22~23 年,某公司要把所有网络流量变为 IPv6 往下发,火山云的 CLB 和 PLB 还不支持 IPv6,那我们就面临着断流的风险。经调研和学习,了解到可以通过 nginx 来搭建一个反向代理服务里,把 IPv6 的流量转成 IPv4 往下发,这样就解决了我们的问题。本篇文章也是记录一下当时的搭建过程和步骤,以及踩过的坑。
2025-02-26 23:02:51
669
原创 Golang GC 三色标记法
白色表示尚未被标记的对象、灰色表示已经追踪但还没标记的对象,黑色表示已经完成标记的对象。黑色表示活跃对象,不会被回收。栈空间所有对象都标记为黑色 就放置了栈空间的对象后续需要一次STW重新扫描一次 但是同样存在GC精度不高的问题。因为栈区没有写屏障,当对象 9 引用对象 8 时,并不会把对象 8 标记为灰色。当对象 7 和对象 8 断开引用关系时,触发写屏障,把对象 8 标记为灰色。遍历灰色集合,将直接可达的对象标记为灰色,自身标记为黑色。遍历根节点,将根节点直接可达的对象,标记为灰色。
2025-02-15 21:48:31
471
原创 Golang Model 字段自动化校验设计
上面我们列出来常见的四种校验方式,当我们在一个复杂且庞大的业务场景需要把各种各样的校验放在一起去校验时,我们不得不编写一个庞大的校验函数,把这些单点的校验函数聚合起来,更有甚者都没有进行子逻辑校验的函数区分,就是第一个大函数,把各种各样的校验逻辑代码写到一个函数中,那么长此以往,校验逻辑就会非常复杂,无法迭代。在我们日常开发中,不可避免的总要去进行各种参数校验,但是如果在某个场景中,要校验的字段非常多,并且在其中还有耦合关系,那么我们手写校验逻辑就变得非常的低效且难以维护。字段校验是最常见的校验类型。
2025-02-15 17:02:41
685
原创 Golang 并发安全有序链表的实现原理
Golang 并发安全有序链表的实现原理前言平时使用 Golang 开发的小伙伴一定知道,Go 语言在进行高并发变成是极其容易的,因为 Go 语言自身就支持了多协程。但是 Go 语言的数据结构大多都不具备 scalable,无论是使用锁+hmap,还是使用并发安全的 sync.Map,在高并发场景下,程序都会随着协程数量的增加导致性能下降。所以编写支持高并发且具备 scalable 的数据结构就显得尤为重要。并发安全问题当多个 goroutine(协程) 同时访问相同的变量且具有写操作时,就会发生未
2021-08-13 20:22:47
872
原创 Go 基于 Redis + Lua 实现分布式限流器
Go 基于 Redis + Lua 实现分布式限流器限流算法在分布式系统设计中有广泛的应用,特别是在系统的处理能力有限的时候,通过一种有效的手段阻止限制范围外的请求继续对系统造成压力,避免系统被压垮,值得开发工程师们去思考。实际生活中,限流器算法通常作为限制用户行为的一种方式之一。比如最近我在某东抢 PS5,开始购买的一瞬间就没了,肯定是有些用户使用了脚本去抢(黑产!),导致我们用手的人很难抢到。那么限流器就可以限制一下这些通过脚本去抢购的用户,强烈建议某东优化!1. 简单计数限流器首先要介绍的
2021-08-11 18:03:26
1878
1
原创 GOTT-提升代码可读性
Golang On The Toilet–Readablegolang on the toilt 该名称源于「谷歌」的 google on the toilet,谷歌公司会在厕所里贴一些技术上的小知识点或注意点,让大家在上厕所的时候都可以学习一下。所以本篇博客,也是诺列一些在平时开发中,使用 golang 的一些小知识点。提升代码的可读性总结一句话就是,你写的代码,不要仅限于别人能看懂,而且还要轻松的看懂。不要在交接工作或者同事要看你代码学习的时候,同事心里骂娘。要写一些简单并且可读性高的代码。
2021-07-06 22:13:20
332
1
原创 Golang Map 学习笔记
Golang Map 学习笔记通过阅读大神博客,简单记录学习笔记https://www.qcrao.com/2019/05/22/dive-into-go-map/Map 的数据结构在源码中,map 的结构体叫 hmap,意思是 hashmap。// A header for a Go map.type hmap struct { // 元素个数,调用 len(map) 时,直接返回此值 count int flags uint8 // buckets 的对数
2021-07-05 17:36:11
496
原创 Golang slice 和 array
slice vs array1. array数据是 Golang 里最基本的类型,它的类型由元素类型和元素个数共同决定,因此 [3]int 和 [4]int 是两种类型。数据的类型在编译期间就决定了,数据的元素个数是常量,因此数组是无法扩容的。Golang 有两种数据声明方式// 1. 显式指定数据的长度array1 := [3]int{1, 2, 3}// 2. 由初始化的元素个数来推导数据长度array2 := [...]int{1, 2, 3}array2 的数组元素个数由初始化的元
2021-06-05 17:58:34
477
原创 IO 多路复用
IO 多路复用IO 多路复用实现了代替进程监控大量描述符什么时候就绪,然后进程可以根据就绪的描述符作出相应的操作。IO 过程分为等待和拷贝,等待完毕可以拷贝的时候,这个状态称为就绪。常见的三种 IO 多路复用为 select、poll和 epoll。select原理:(已 C/C++ 中系统调用 select 函数为例)用户将需要监控的文件描述符添加到一个集合中。select 系统调用将集合中的文件描述符拷贝到内核中进行监控,在内核中对所有的描述符进行遍历操作,且只关注是否有描述符就绪。
2021-05-28 17:07:46
376
1
原创 HDFS 文件块的大小
HDFS 文件块的大小HDFS 中的文件在物理磁盘上是通过分块存储的,块的大小可以通过参数配置(dfs.blocksize)来决定,在 Hadoop >= 2.x 版本中是 128M,老版本是 64M举个栗子假如磁盘的寻址时间约为 10ms,即查找到目标 Block 的时间为 10ms根据规定,寻址时间为传输时间的 1%时,为最佳状态。因此传输时间= 10ms / 0.1 = 1s若磁盘的传输速率为 100M/s那么块的大小最佳为 100M。以上例子都取的大概值,根据测算,机械硬盘中
2021-05-24 22:18:46
1459
原创 HDFS 的组成架构
HDFS 的组成架构NameNode存储文件的元信息,包括名字、目录、大小等。管理 HDFS 的名称空间配置副本策略管理数据块(Block)映射信息处理客户端读写请求DataNode主要用来存储数据,NameNode 下达命令,DataNode 执行实际的操作。存储实际的数据块执行数据块的读写操作Client客户端文件切分,文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,一般是 128M,然后进行上传与 NameNode 交互,获取文件的
2021-05-24 21:58:00
505
1
原创 Golang 为什么不能直接将任意类型数组赋值给 []interface{}
Golang 为什么不能直接将任意类型数组赋值给 []interface{}本篇参考: https://github.com/golang/go/wiki/InterfaceSlice当我在写 go 代码时,想用 []interface{} 类型来接受一个任意类型的数组,从而进行泛型操作时,发现直接赋值会发生错误,导致 panic。 dataSlice := []int{1, 2, 3, 4, 5, 6} var interfaceSlice []interface{} = dataSlice
2021-04-28 15:57:37
2852
原创 Scala---五种常见的模式匹配
Scala 五种常见的模式匹配1. 常量模式常量模式包含常量变量和常量字面量object PatternMatch { // 字面常量 val BYTEDANCE = "bytedance.com" def foo(s: String): Unit = { s match { case BYTEDANCE => println("ok") case _ => println("can not match") } } def m
2021-04-16 19:45:31
2750
原创 Golang 等比例调整图片分辨率且用黑色补齐多余部分
描述随意上传一张图片,将图片的分辨率等比率压缩至 108*108 的格式,若图片不是正方形,则多余部分使用黑色填充。大体思路首先将图片进行解码。将图片分辨率等比例压缩至 108*108 。创建一个黑色的 108*108 的图片,在黑色图片上把压缩过的图片画在正中间。最后再创建新的图片/编码。完整代码package mainimport ( "bufio" "bytes" "fmt" "github.com/nfnt/resize" "image" "image/draw"
2021-02-20 17:22:42
1455
原创 globStatus 使用小结
globStatus(Path pathPattern)Return all the files that match filePattern and are not checksum files.大体上说就是返回所有匹配到的文件路径。个人使用心得:该 API 支持使用 Shell 通配符来匹配文件,若需要对文件进行筛选,可以在查出来文件路径后进行 filter。fileFs.globStatus(new Path(regexHdfsPath)).map(_.getPath.toString).
2020-12-20 15:25:31
610
1
原创 Linux 删除文件中匹配的行
背景:跑了个脚本但是有很多特殊的情况,这种情况需要忽略,但是我需要把日志里的错误都拿错来,错误中穿插了特殊情况,复制的时候就得一直中断,很麻烦。例如:err1err2err3xxxx 0 nilerr4err5xxxx 0 nil就不能一下拉到底一起复制,所以就研究了下,Linux 可以通过命令,删除文件中匹配到的行。seqsed -i ‘/preSql/d’ a.txt删除匹配到preSql的行sed -i ‘1d’ a.txt删除第一行sed -i ‘3~2d
2020-09-08 11:54:44
4398
原创 Mark: Linux 动态查看日志文件
便捷动态查看日志文件在 Linux 上跑脚本或者任务的时候,总是把日志打到文件里,有时候想知道当前进度的时候总是使用tail log.txt,这样很不程序员,所以就调研了下如何动态查看。使用命令 tailf log.txt就可以实现动态查看日志文件,与该命令相似的命令是 tail -f log.txt...
2020-09-01 18:43:41
620
原创 Spark 算子 combineByKey
combineByKey 算子是一个稍微复杂的算子,所以在这里记录一下 combineByKey 的操作方式。combineByKey 的参数combineByKey 总共有三个参数第一个参数是对相同分区,相同 key 的第一个 value 进行初始化。第二个参数是对相同分区,相同 key 的 values 进行的操作。第三个参数是对不同分区,相同 key 的 values 进行的操作。举个栗子????val conf = new SparkConf().setMaster("local"
2020-08-04 16:19:07
281
原创 Spark Aggregate算子
源码定义/** * Aggregate the elements of each partition, and then the results for all the partitions, using * given combine functions and a neutral "zero value". This function can return a different result * type, U, than the type of this RDD, T. Thus
2020-07-26 11:33:05
313
原创 Golang &^操作符
&^ 操作符是(与非)的意思。例如 1 &^ 3 就是将 3 先取反,然后和 1 相与。package mainimport "fmt"func main() { a := 1 // 0000 0001 b := 4 // 0000 0100 fmt.Printf("%08b\n", a&^b)}输出 0000 0001
2020-07-23 18:05:42
1065
原创 Scala 的 Symbol 类型
This class provides a simple way to get unique objects for equal strings. Since symbols are interned, they can be compared using reference equality. Instances of Symbol can be created easily with Scala’s built-in quote mechanism.大概翻译一下:这个类提供了一个快速的字符串比较方.
2020-07-15 18:55:05
281
原创 Golang实现一个简单的单链表
Golang实现一个简单的单链表package listtype Node struct { Data interface{} Next *Node}type List struct { size uint32 head *Node tail *Node}// 构造方法,将所有变量置空func (list *List) init() { (*list).size = 0 (*list).head = nil (*list).tail = nil}func (list
2020-07-13 15:13:09
379
原创 Spark核心RDD
Spark核心RDDRDD 全称为 Resilient Distributed Dataset 弹性分布式数据集因为在刚接触了spark后,好像有很多这种 RDD 的类型,RDD 就是 spark 在计算过程中使用的数据集。当 spark 从 HDFS 中读取了数据后,默认会依据 HDFS 的 block 数量去生成一个同等数量 RDD,RDD 里使用 partition 来相对应 HD...
2020-05-08 15:31:14
191
原创 Scala 方法与函数
Scala 方法与函数方法的定义object Scala_Function { def main(args: Array[String]): Unit = { def max(lhs: Int, rhs: Int): Int = { if (lhs >= rhs) { // return lhs lhs } else {...
2020-04-22 15:57:51
258
原创 Scala 条件语句和循环
Scala 条件语句和循环该篇博客仅适用于已经有至少一门的语言基础的同学If ElseScala 的条件判断语句跟其他语言没什么不同,就是判断的时候需要加上括号。Golang 在判断的时候就不需要加括号。 if (age < 20) { println(s"$age ") } else if (age >= 20 && age...
2020-04-22 13:53:12
224
原创 Golang 原子操作与互斥锁
Golang 原子操作与互斥锁先来看一个代码package mainimport ( "fmt" "runtime" "sync")var ( counter int32 wg sync.WaitGroup)func main() { wg.Add(2) // 设置需要等待的 goroutine 的数量为 2 go addCounter("Gerald") ...
2020-04-14 14:56:21
1426
原创 go test 用法总结
go test 用法总结使用操作在当前目录下使用 go test 会运行当前目录下所有的 test 文件。test 文件命名 xxx_test.gotest 文件里需要运行的方法命名 TestXxx(t *testing.T/b *testing.B) // 测试性能的时候用 b若要跳过当前 test 文件中的某个方法,使用 t.SkipNow()go test 不...
2020-03-03 13:28:18
4733
原创 Go 语言操作 MySQL 数据库
Go 语言操作 MySQL 数据库起步首先需要引入一个驱动,在命令行使用 go get 引入即可:go get github.com/go-sql-driver/mysql然后在 import 的时候,只需要该驱动的 init() 函数,所以可以在该驱动前加 _最后使用 database/sql 来操作数据库import ( "database/sql" "fmt"...
2019-11-06 20:07:16
323
原创 Golang:如何优雅的让所有子协程执行完后再执行主协程
Golang:如何优雅的让所有子协程执行完后再执行主协程方法一:channel 实现同步使用 channel 来完成同步功能。/*@Time : 2019-10-28 下午 5:30@Author : Gerald@File : 用channel来实现同步@Software: GoLand*/package mainimport ( "fmt")func print...
2019-10-28 19:06:18
5220
原创 GoLang:数组的切片失效
GoLang:数组的切片失效学习切片的时候想到一个问题:如果一个切片是引用一个完整的数组,那么给这个切片 append 一个元素后,这个 append 的元素会以什么样的形式存在?先看代码: arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} s := arr[:] s[8] = 666 fmt.Println(arr) fmt.Println(s) f...
2019-10-08 21:18:24
463
原创 Go 语言--变量逃逸
Go 语言–变量逃逸堆和栈各有优缺点,该怎么在编程中处理这个问题呢?在 C/C++语言中,需要开发者自己学习如何进行内存分配,选用怎样的内存分配方式来适应不同的算法需求。比如,函数局部变量尽量使用栈;全局变量、结构体成员使用堆分配等。程序员不得不花费很多年的时间在不同的项目中学习、记忆这些概念并加以实践和使用。Go语言将这个过程整合到编译器中,命名为“变量逃逸分析”。这个技术由编译器分析代码的...
2019-09-17 20:05:49
345
原创 返回值优化(Return Value Optimization -- RVO)
返回值优化(Return Value Optimization – RVO)在日常开发中,我们不得不会遇到返回对象的情况。那么对于 追求效率 的程序员来说,返回对象是一件很痛苦的事情。举个栗子????考虑这样的一种情况:分数相乘有这么一个分数类:#include <iostream>class Rational {public: Rational (int n...
2019-09-15 20:04:14
886
原创 Go 语言的两种执行流有什么区别
Go 语言的两种执行流有什么区别go build -> go run | go run如果先使用 go build 编译生成可执行文件,可以将可执行文件的放到没有 go 环境的机器上,仍然可以执行。如果直接 go run 源代码,那么如果要在另一台机器上也要运行,那另一台机器也需要 go 环境,不然没办法执行。在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,...
2019-09-09 15:13:11
356
原创 仔细区别 pointers 和 references
仔细区别 pointers 和 references参考《More Effective C++》没有所谓的 null references一个引用必须总代表某个对象。所以如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能他不指向(代表)任何对象,那么你应该使用 pointers,因为你可以将 pointers 设为 null。换句话说,如果一个变量总是代表一个对象,也就是不...
2019-08-26 15:09:57
303
原创 宏(#define)和内联(inline)函数的理解以及区别
宏(#define)和内联(inline)函数的理解以及区别宏宏的缺点:没有类型检查,不安全。宏是在预处理时进行简单文本替换,并不是简单的参数传递,很难处理一些复杂的情况,或者当编译出错时,提醒可读性差。如果宏函数本身很长,会造成代码冗余。宏无法进行调试。当预处理搜索#define定义的符号时,字符串常量并不被搜索。宏的优点:加快了代码的运行效率,不用再去调用浪费时间。让...
2019-08-24 14:02:32
725
1
原创 进程间通信--管道
进程间通信–管道管道是一种最基本的 IPC 机制,作用于有有血缘关系的进程之间,完成数据传递。调用 pipe 系统函数即可创建一个管道,有如下特质:其本质是一个伪文件(实为内核缓冲区)由两个文件描述符引用,一个表示读端,一个表示写端规定数据从管道的写端流入管道,从读端流出管道的原理:管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。管道的局限性如下:数据自己读不能自己写...
2019-08-14 09:42:14
175
原创 C++ 爬虫程序
C++ 爬虫程序项目描述使用 C++ 编程语言,实现一个 爬虫程序,来对图片进行下载。开发平台Windows 10流程介绍先输入一个起始 URL 进入 URL 队列。在当前路径下创建一个文件夹。#include <Windows.h>CreateDirectory("./images", NULL);获取到当前队列中首部的 URL。解析 UR...
2019-08-07 14:49:37
2585
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人