摘要: 什么是平衡树 对于已有的二叉查找树,它最坏情况下会退化为链表,查找效率降至O(n),我们希望的是插入或者删除元素始终能使得维持成完全二叉树的样子(完全二叉树n个节点,其高度为logn)这样查找效率就能维持在logn。 平衡树字面意义上就是说让树的两边看起来是均匀的,只要满足任意节点的左子树和右子树高 阅读全文
posted @ 2021-12-21 15:24 moon_orange 阅读(48) 评论(0) 推荐(0) 编辑
摘要: 平衡tree: 优点: 插入删除查找效率为logn,插入或删除可能导致树结构多次旋转,每次旋转时间是O(1) 2.有序,支持范围查找 缺点: 1.平衡要求过于严格,导致过多的旋转 skip list: 优点: 实现简单 插入删除查找效率平均为logn 支持range操作,节点是有序排列的。 插入删除 阅读全文
posted @ 2021-12-17 15:08 moon_orange 阅读(132) 评论(0) 推荐(0) 编辑
摘要: hash是什么 哈希用来将很大范围的数(比如[10-9, 109]),映射到一块较小的区间内。比如对于 109,我们想让它映射到[0, 105]这块区间(也可以理解为数组)内,可以直接对 109进行取余 (109 % 10^5),然后根据余数确定该数在区间内的落点。这里的取余操作就叫做hash,取余 阅读全文
posted @ 2021-12-16 15:28 moon_orange 阅读(52) 评论(0) 推荐(0) 编辑
摘要: 前言 https://github.com/k-si/Janney 是我模仿groupcache完成的一个分布式缓存,体积较小,适合学习分布式缓存思想。 ps:仓库命名习惯用一些姓氏~ groupcache的思想 cache通过内存加速数据访问,如果访问的数据不在缓存中,那么就需要去别处获取该数据, 阅读全文
posted @ 2021-12-07 15:03 moon_orange 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 什么是缓存击穿 我们常说的缓存问题:缓存雪崩,缓存击穿,缓存穿透都分别指什么呢? 简单来说: 缓存雪崩是指缓存在同一时间全部失效,导致压力全部转移到DB上。 缓存击穿指的是某个key在失效的这一刻,有大量的请求数据,这些数据压力也转移到了DB。 缓存穿透指的是大量数据访问一个不存在的key,导致每次 阅读全文
posted @ 2021-12-07 09:52 moon_orange 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 预备知识 理解mmap,首先要理解什么是用户态和内核态,其次要了解虚拟内存。 简单的说,用户态内核态指的就是cpu指令集的权限程度,我们用户程序并没有操作硬件的权限,于是很多操作都需要转为内核态才能被执行。我们的物理内存也是分为用户空间和内核空间的,比如32位处理器的寻址范围为4G,那么低地址的3G 阅读全文
posted @ 2021-12-05 02:46 moon_orange 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 普通哈希 在分布式场景下,往往涉及到负载均衡,比如分布式缓存这种应用,我们希望如果获取相同的key,尽量映射到同一台机器上,这样可以在内存中最快速的获取,如果相同的key总是打到不同的机器上,可能由于缓存淘汰导致该缓存值被替换掉,进而需要读取磁盘,这样性能就会大打折扣。 基于此,我们可以获取key值 阅读全文
posted @ 2021-12-02 18:38 moon_orange 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 参考: https://blog.csdn.net/liyuanbhu/article/details/7882789 https://blog.csdn.net/D_leo/article/details/73572373 crc冗余校验是为了保证接收方收到数据后,能确认数据是完好无损的。 crc 阅读全文
posted @ 2021-12-02 16:36 moon_orange 阅读(64) 评论(0) 推荐(0) 编辑
摘要: LRU是什么 我们知道内存中的读写速度很快,基于此很多缓存技术都喜欢将数据存在内存中,但是内存空间是有限的,到达一定量后必然需要将一些不常用的缓存数据删除或者落盘。于是顺应而生了很多缓存淘汰算法。其中比较常见的有FIFO、LFU、LRU、LRU-k、2Q算法等等...其目的都是为了高效的维护缓存数据 阅读全文
posted @ 2021-11-29 16:25 moon_orange 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 对于通知一个goroutine结束它的工作,遵循goroutine之间通过管道传递消息的设计理念,我们可以使用channel传递一个信号,当goroutine检测到信号,结束工作即可: var wg sync.WaitGroup func work(exit <-chan struct{}) { L 阅读全文
posted @ 2021-11-26 21:43 moon_orange 阅读(138) 评论(0) 推荐(0) 编辑