自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 收藏
  • 关注

原创 Golang 并发安全有序链表的实现原理

Golang 并发安全有序链表的实现原理前言平时使用 Golang 开发的小伙伴一定知道,Go 语言在进行高并发变成是极其容易的,因为 Go 语言自身就支持了多协程。但是 Go 语言的数据结构大多都不具备 scalable,无论是使用锁+hmap,还是使用并发安全的 sync.Map,在高并发场景下,程序都会随着协程数量的增加导致性能下降。所以编写支持高并发且具备 scalable 的数据结构就显得尤为重要。并发安全问题当多个 goroutine(协程) 同时访问相同的变量且具有写操作时,就会发生未

2021-08-13 20:22:47 830

原创 Go 基于 Redis + Lua 实现分布式限流器

Go 基于 Redis + Lua 实现分布式限流器限流算法在分布式系统设计中有广泛的应用,特别是在系统的处理能力有限的时候,通过一种有效的手段阻止限制范围外的请求继续对系统造成压力,避免系统被压垮,值得开发工程师们去思考。实际生活中,限流器算法通常作为限制用户行为的一种方式之一。比如最近我在某东抢 PS5,开始购买的一瞬间就没了,肯定是有些用户使用了脚本去抢(黑产!),导致我们用手的人很难抢到。那么限流器就可以限制一下这些通过脚本去抢购的用户,强烈建议某东优化!1. 简单计数限流器首先要介绍的

2021-08-11 18:03:26 1794 1

原创 GOTT-提升代码可读性

Golang On The Toilet–Readablegolang on the toilt 该名称源于「谷歌」的 google on the toilet,谷歌公司会在厕所里贴一些技术上的小知识点或注意点,让大家在上厕所的时候都可以学习一下。所以本篇博客,也是诺列一些在平时开发中,使用 golang 的一些小知识点。提升代码的可读性总结一句话就是,你写的代码,不要仅限于别人能看懂,而且还要轻松的看懂。不要在交接工作或者同事要看你代码学习的时候,同事心里骂娘。要写一些简单并且可读性高的代码。

2021-07-06 22:13:20 315 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 453

原创 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 464

原创 IO 多路复用

IO 多路复用IO 多路复用实现了代替进程监控大量描述符什么时候就绪,然后进程可以根据就绪的描述符作出相应的操作。IO 过程分为等待和拷贝,等待完毕可以拷贝的时候,这个状态称为就绪。常见的三种 IO 多路复用为 select、poll和 epoll。select原理:(已 C/C++ 中系统调用 select 函数为例)用户将需要监控的文件描述符添加到一个集合中。select 系统调用将集合中的文件描述符拷贝到内核中进行监控,在内核中对所有的描述符进行遍历操作,且只关注是否有描述符就绪。

2021-05-28 17:07:46 354 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 1407

原创 HDFS 的组成架构

HDFS 的组成架构NameNode存储文件的元信息,包括名字、目录、大小等。管理 HDFS 的名称空间配置副本策略管理数据块(Block)映射信息处理客户端读写请求DataNode主要用来存储数据,NameNode 下达命令,DataNode 执行实际的操作。存储实际的数据块执行数据块的读写操作Client客户端文件切分,文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,一般是 128M,然后进行上传与 NameNode 交互,获取文件的

2021-05-24 21:58:00 486 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 2802

原创 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 2663

原创 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 1402

原创 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 581 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 4213

原创 Mark: Linux 动态查看日志文件

便捷动态查看日志文件在 Linux 上跑脚本或者任务的时候,总是把日志打到文件里,有时候想知道当前进度的时候总是使用tail log.txt,这样很不程序员,所以就调研了下如何动态查看。使用命令 tailf log.txt就可以实现动态查看日志文件,与该命令相似的命令是 tail -f log.txt...

2020-09-01 18:43:41 598

原创 Spark 算子 combineByKey

combineByKey 算子是一个稍微复杂的算子,所以在这里记录一下 combineByKey 的操作方式。combineByKey 的参数combineByKey 总共有三个参数第一个参数是对相同分区,相同 key 的第一个 value 进行初始化。第二个参数是对相同分区,相同 key 的 values 进行的操作。第三个参数是对不同分区,相同 key 的 values 进行的操作。举个栗子????val conf = new SparkConf().setMaster("local"

2020-08-04 16:19:07 260

原创 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 293

原创 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 1048

原创 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 267

原创 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 367

原创 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 170

原创 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 245

原创 Scala 条件语句和循环

Scala 条件语句和循环该篇博客仅适用于已经有至少一门的语言基础的同学If ElseScala 的条件判断语句跟其他语言没什么不同,就是判断的时候需要加上括号。Golang 在判断的时候就不需要加括号。 if (age < 20) { println(s"$age ") } else if (age >= 20 && age...

2020-04-22 13:53:12 214

原创 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 1401

原创 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 4653

原创 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 309

原创 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 5105

原创 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 446

原创 Go 语言--变量逃逸

Go 语言–变量逃逸堆和栈各有优缺点,该怎么在编程中处理这个问题呢?在 C/C++语言中,需要开发者自己学习如何进行内存分配,选用怎样的内存分配方式来适应不同的算法需求。比如,函数局部变量尽量使用栈;全局变量、结构体成员使用堆分配等。程序员不得不花费很多年的时间在不同的项目中学习、记忆这些概念并加以实践和使用。Go语言将这个过程整合到编译器中,命名为“变量逃逸分析”。这个技术由编译器分析代码的...

2019-09-17 20:05:49 334

原创 返回值优化(Return Value Optimization -- RVO)

返回值优化(Return Value Optimization – RVO)在日常开发中,我们不得不会遇到返回对象的情况。那么对于 追求效率 的程序员来说,返回对象是一件很痛苦的事情。举个栗子????考虑这样的一种情况:分数相乘有这么一个分数类:#include <iostream>class Rational {public: Rational (int n...

2019-09-15 20:04:14 857

原创 Go 语言的两种执行流有什么区别

Go 语言的两种执行流有什么区别go build -> go run | go run如果先使用 go build 编译生成可执行文件,可以将可执行文件的放到没有 go 环境的机器上,仍然可以执行。如果直接 go run 源代码,那么如果要在另一台机器上也要运行,那另一台机器也需要 go 环境,不然没办法执行。在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,...

2019-09-09 15:13:11 346

原创 仔细区别 pointers 和 references

仔细区别 pointers 和 references参考《More Effective C++》没有所谓的 null references一个引用必须总代表某个对象。所以如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能他不指向(代表)任何对象,那么你应该使用 pointers,因为你可以将 pointers 设为 null。换句话说,如果一个变量总是代表一个对象,也就是不...

2019-08-26 15:09:57 288

原创 宏(#define)和内联(inline)函数的理解以及区别

宏(#define)和内联(inline)函数的理解以及区别宏宏的缺点:没有类型检查,不安全。宏是在预处理时进行简单文本替换,并不是简单的参数传递,很难处理一些复杂的情况,或者当编译出错时,提醒可读性差。如果宏函数本身很长,会造成代码冗余。宏无法进行调试。当预处理搜索#define定义的符号时,字符串常量并不被搜索。宏的优点:加快了代码的运行效率,不用再去调用浪费时间。让...

2019-08-24 14:02:32 701 1

原创 进程间通信--管道

进程间通信–管道管道是一种最基本的 IPC 机制,作用于有有血缘关系的进程之间,完成数据传递。调用 pipe 系统函数即可创建一个管道,有如下特质:其本质是一个伪文件(实为内核缓冲区)由两个文件描述符引用,一个表示读端,一个表示写端规定数据从管道的写端流入管道,从读端流出管道的原理:管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。管道的局限性如下:数据自己读不能自己写...

2019-08-14 09:42:14 163

原创 C++ 爬虫程序

C++ 爬虫程序项目描述使用 C++ 编程语言,实现一个 爬虫程序,来对图片进行下载。开发平台Windows 10流程介绍先输入一个起始 URL 进入 URL 队列。在当前路径下创建一个文件夹。#include <Windows.h>CreateDirectory("./images", NULL);获取到当前队列中首部的 URL。解析 UR...

2019-08-07 14:49:37 2524

原创 多态的四种表现形式

多态的四种表现形式在之前一提到多态,我下意识就是虚函数重写构成的运行时多态。直到看了一篇文章,才反应过来多态有四种表现形式。cpp-polymorphism运行时多态(虚函数)编译时多态(模板)重载类型转换运行时多态(Subtype Polymorphism/Runtime Polymorphism)运行时多态就是派生类重写基类的虚函数,在调用函数里,参数为基类的指针或引用,会构...

2019-07-24 10:56:41 15330

原创 稳稳地 TCP

稳稳地 TCPTCP 是面向连接、可靠传输、面向字节流的传输控制协议(Transmission Control Protocol)。TCP 协议段格式源/目的端口号:表示数据是从哪里来,到哪里去。32 位序号/ 32 位确认号:为保证 TCP 可靠传输的一种机制。4 位首部长度:表示该 TCP 首部有多少个字节。一行是四个字节;若选项为空,则 TCP 首部长度为 20 字节,若选项不...

2019-07-05 11:37:14 288 1

原创 UDP 小结

UDP 小结参考《图解TCP_IP》UDP 协议端格式源端口号(Source Port)表示发送端端口号,字段长 16 位。该字段是可选项,有时可能不会设置源端口号。没有源端口号的时候该字段设置为 0 。可用于不需要返回的通信中。目标端口号(Destination Port)表示接收端端口号,字段长度 16 位。UDP 长度(Length)该字段保存了 UDP 首...

2019-06-30 18:51:02 295

原创 海量数据面试题

海量数据面试题哈希切割给一个超过100G 大小的 log fifile, log中存着 IP 地址, 设计算法找到出现次数最多的 IP 地址? 与上题条件相同, 如何找到 top K 的 IP ?如何直接用 Linux 系统命令实现?思路:先把这这个 log fifie 分成拆分成很多个小文件。小文件的大小并不是相等的,而是在拆分过程中,根据某个哈希函数把 ip 进行哈希的方式存储在一个...

2019-06-27 20:03:08 210

原创 位图及布隆过滤器的模拟实现

位图及布隆过滤器的模拟实现位图位图其实就是一个简化版的哈希表,在很多时候,我们并不关注一个数据出现了多少次,而只是关注这个数据存在与否。所以哈希表太浪费空间了,我们可以用一个比特位来表示一个数据存在与否。那么在 32 位平台下,一个整数是 4 个字节,共 32 个比特位,那么它就可以表示 32 个数据的状态。比如我们要处理 100 个数据并且这 100 个数据都是小于等于 100 的,那么...

2019-06-26 16:42:00 540

原创 jsoncpp 操作指南

JSON 小练在日常的开发环境中,尤其是进行服务器端和客户端开发中,我们一定会对数据进行序列化和反序列化,在之前,我总是用空格作为两个数据之间的分隔,直到我遇到 JSON, 我爱了。那么我就用一个简单的例子来总结一下目前我用到的 JSON 操作。网络计算器我用的是 jsoncpp

2019-06-23 14:32:36 1369 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除