最小堆以及优先级队列的Golang实现

前言 堆,是计算机科学中的一种特别的完全二叉树。若父节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称作 根节点(root node),根节点本身没有 父节点(parent node)。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。 ...

May 13, 2021 · JemmyHu(hujm20151021@gmail.com)

I/O多路复用之 epoll

select 的缺陷 目前对于高并发的解决方案是 一个线程处理所有连接,在这一点上 select 和 epoll 是一样的。但 当大量的并发连接存在、但短时间内只有少数活跃的连接时,select 的表现就显得捉襟见肘了。 ...

May 10, 2021 · JemmyHu(hujm20151021@gmail.com)

彻底理解Linux Select中的FD_SET

看 select 源码,fd_set 这个结构体实际上是一个 long 型的数组,但是数组的长度依赖于系统中 typedef long int __fd_mask 的长度。当我去调试的时候,经常打印出一些很奇怪的值,有时候还会溢出。 ...

May 8, 2021 · JemmyHu(hujm20151021@gmail.com)

MySQL面试汇总

关于事务 事务的特性 原子性(Atomic, A):要么全部执行,要么全部不执行; 一致性(Consistent, C):事务的执行,使得数据库由一种正确状态转变为另一种正确的状态; 隔离性(Isolation, I):在事务正确提交之前,不应该把该事务对数据的改变提供给其他事务; 持久性(Durability, D):事务提交后,其结果永久保存在数据库中。 事务ACID特性的实现思想 ...

April 16, 2021 · JemmyHu(hujm20151021@gmail.com)

Redis 面试汇总

当我们谈论 Redis 时,应该谈论什么? Redis 基本数据类型有哪些?以及他们各自的使用场景是什么? 常见的有五种:字符串、哈希、列表、集合、有序集合。5.0 版本中新添加了 Stream 类型。 ...

April 15, 2021 · JemmyHu(hujm20151021@gmail.com)

Golang Channel详解

一、原理 0. 简介 channel 分为有缓冲和无缓冲,或者阻塞和非阻塞,主要区别就在于是否有 容量capacity。 在 runtime 中是通过 hchan 这个结构体来表示的,它里面的主要成员可以理解成包含两个大部分:环形队列相关 和 sudog等待队列 相关。 对于有缓冲的 channel,会设置环形队列相关的参数,如已有的元素数量、容量、指向队列的指针等; 等待队列有发送等待队列和接受等待队列,他们分别在发送时 channel 已满、接收时 channel 为空的情况下,会将当前 goroutine 打包成一个 sudog 结构,添加到对应的队列中,直到条件符合时再被唤醒工作。 ...

April 9, 2021 · JemmyHu(hujm20151021@gmail.com)

Golang中使用RSA进行加解密

本文对 RSA 加密算法 的细节不做深究,仅描述大致用法。具体算法原理请阅读参考文献中的 2 和 4。 一、介绍 当我们谈论加解密方式时,通常有两种情形:对称加密 和 非对称加密。 ...

January 14, 2021 · JemmyHu(hujm20151021@gmail.com)

Boltdb使用(一)基本用法

介绍 boltdb 是一个使用 Go 编写的键值对数据库,它的目标是 简单、快速和稳定的轻型数据库,适用于那些不需要使用像 MySQL 一样的完整的数据库系统的项目。 使用 1. 安装 go get github.com/boltdb/bolt/... 2. 打开(Open)一个数据库文件连接 func main() { dbPath := "./data.db" // 指定你的数据库文件要存储的地方 db, err := bolt.Open(dbPath, os.ModePerm, nil) if err != nil { panic(err) } ... } bolt 打开一个文件之后,会一直获得此文件的锁,在这期间,其他的进程无法再次打开此文件,直到最开始的进程释放锁。打开一个已经打开的 bolt文件 会导致当前进程无限制地等待下去,直到另一个已经打开的进程结束这个文件的使> 用。为了避免这种无限制的等待,可以给 Open 操作添加超时: ...

January 5, 2021 · JemmyHu(hujm20151021@gmail.com)

虚拟网络设备tuntap

实验机器:MacBook Pro (Retina, 15-inch, Mid 2015) Golang 版本:go version go1.14.6 darwin/amd64 一、前言 网卡 也称 网络适配器,是电脑与局域网进行相互连接的设备,在 OSI 七层模型中,工作在 物理层 和 数据链路层,其作用可以简单描述为: ...

November 16, 2020 · JemmyHu(hujm20151021@gmail.com)

使用ghz压测GRPC接口

一、前言 公司后端服务已经全部微服务化,想要调试某个服务可以使用 grpcui,但要对某个接口进行压测,grpcui 还做不到。诸多努力之后找到本次主角:https://github.com/bojand/ghz,官网:ghz.sh。 推荐理由:简洁!可以一次性解决掉 proto 文件相互之间引用的烦心事! ...

November 9, 2020 · JemmyHu(hujm20151021@gmail.com)