最小堆以及优先级队列的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)

Redis(二): 什么是 Redis 中的事件

Redis 设计与实现–事件 中有很清晰的说明。 redis 要处理的事件有两种类型: 文件事件:网络连接套接字。服务器与多个客户端通过网络套接字连接,当对应套接字上出现“读”或“写”需求时,对应的事件就会触发; 时间事件:在指定时间点运行的事件。如持续运行的服务器为了维持一个健康稳定的状态,需要定期对自身的资源和状态进行检查和整理。 一、时间事件 时间事件记录着那些要在指定时间点运行的事件, 多个时间事件以无序链表的形式保存在服务器状态中。 每个时间事件主要由三个属性组成: ...

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

Redis系列(一): Redis 单线程事件循环

一、前言 在关注 redis 单线程/多线程 时,有几个重要的时间节点: Before Redis v4.0,真正的单线程; Redis v4.0,引入多线程处理 AOF 等任务,但核心的网络模型中依旧使用单线程; Redis v6.0,正式在网络模型中实现 I/O多线程。 从 Redis v1.0 到 Redis v6.0以前,Redis 的核心网络模型一直都是一个典型的 单Reactor模型,所有的事件都在这个线程内处理完成。本 issue 旨在解释清楚这个 单Reactor模型 的所有运作细节,为以后更好地理解新的 Multi-Reactors/Master-Workers 模型做准备。 ...

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

面试题:交替打印数字和字符串

题目描述 使用两个 goroutine 交替打印序列,一个 goroutine 打印数字, 另外一个 goroutine 打印字母, 最终效果如下: 1A2B3C4D5E6F7G8H9I10J11K12L13M14N15O16P17Q18R19S20T21U22V23W24X25Y26Z 思路 使用 channel 来控制打印的进度。使用两个 channel,来分别控制数字和字母的打印进度,数字打印完通过 channel 通知数字打印,数字打印完通过 channel 通知字母打印。如此周而复始,直到终止条件。 ...

March 31, 2021 · JemmyHu(hujm20151021@gmail.com)

Golang中使用RSA进行加解密

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

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