哈哈,这就是我们这篇文章要讲解的一个开源项目 – Kong( 云原生架构下的分布式API 网关 )。 为什么说 Kong 是物联网网关神器? 在 IOT 系统架构中,为了保证系统的鲁棒性和高可扩展性。...我们需要一个强大的 API 网关来承受住遍布各地的 IOT 设备所传输的信息。插件架构设计的 Kong 使得它具有了强大的兼容性,和可扩展性。...比如在洗锅后会调用洗锅的 Hook 、烧油后会调用一个烧油的 Hook 。 而你则可以实现洗锅的 Hook,在里面做一些事。比如你实现了洗锅的 Hook,其功能是检查锅洗的干不干净。...那么系统将会在执行到洗锅这个步骤后检查有没有人实现洗锅的 Hook,结果就发现了你声明的检查洗锅的函数。接下来就会调用你写的函数来检查锅洗的干不干净。...Kong 提供了 Http/Rest 的接口来实现配置 ,使得其可以更简单的构建图形化界面进行动态配置。 为什么使用 Kong?
那为什么需要把它设计为一个环状链表?...我是这样理解的shared.pending 存放的是链表的最后一个节点,那么在环状链表中,链表的最后一个节点的next指针,是指向环状链表的头部节点,这样我们就能快速知道链表的首尾节点当知道首尾节点后,...shared.pending 是环形链表的尾部节点,它的下一个节点就是环形链表的头部节点,参考上一小节我们提到的链表合并操作。...Fiber节点 的更新队列为什么要做这两件事情?...解决这两个问题才是我们上面说的复杂的实现细节update对象丢失问题为什么会丢失我们知道高优先级任务进来会打断低优先级任务的执行,打断之后会将当前的 workInProgress 节点还原为开始的状态,
那为什么需要把它设计为一个环状链表?...我是这样理解的shared.pending 存放的是链表的最后一个节点,那么在环状链表中,链表的最后一个节点的next指针,是指向环状链表的头部节点,这样我们就能快速知道链表的首尾节点当知道首尾节点后,...解决这两个问题才是我们上面说的复杂的实现细节update对象丢失问题为什么会丢失我们知道高优先级任务进来会打断低优先级任务的执行,打断之后会将当前的 workInProgress 节点还原为开始的状态,...那为什么需要把它设计为一个环状链表?...我是这样理解的shared.pending 存放的是链表的最后一个节点,那么在环状链表中,链表的最后一个节点的next指针,是指向环状链表的头部节点,这样我们就能快速知道链表的首尾节点当知道首尾节点后,
我们先普及下这两个概念: 指针丢失:自己定义的指针不知道指到哪里了,没有明确的指向。 内存泄漏:链表中的节点没有确切的指针判断,运行时会抛出空指针异常。...这样的代码会造成指针丢失和内存泄漏,因为这会导致x节点的后继指针指向了自己本身。...这些判断条件需要结合自己的实际场景来使用 2、必须掌握的几类题目 在上面的学习中,我们对链表的一些易错的概念进行了解析,下面,我们就真正的代码实践,我在LeetCode上刷题时发现,链表题目通常分为以下几类...2.1单链表反转(LeetCode206) 思路:从前往后将每个节点的指针反向,即.next内的地址换成前一个节点的,但为了防止后面链表的丢失,在每次换之前需要先创建个指针指向下一个节点。...5、 反向链表思想:从前往后将每个节点的指针反向,即next内的地址换成前一个节点的,但为了防止后面链表的丢失,在每次换之前需要先创建个指针指向下一个节点。
但是会存在两个风险: 更执行完命令还没记录日志时,宕机了会导致数据丢失 AOF不会阻塞当前命令,但是可能会阻塞下一个操作。...为什么要用红黑树,而不用平衡二叉树?为什么在1.8中链表大于8时会转红黑树?HashMap是线性安全的嘛?如何保证安全? 13.1 Hashmap 是怎样实现的?...如果链表长度>8且数组大小>=64,链表转为红黑树 如果红黑树节点个数<6 ,转为链表。 13.2 为什么要用红黑树,为什么不用二叉树?为什么不用平衡二叉树? 为什么不用二叉树?...13.3 为什么在1.8中链表大于8时会转红黑树?...领导者(Leader):负责处理客户端请求,进行日志复制等操作,每一轮选举的目标就是选出一个领导者;领导者会不断地发送心跳信息,通知其他节点“我是领导者,我还活着,你们不要发起新的选举,不用找个新领导者来替代我
数组中存储的链表节点Entry 类实现于Map.Entry 接口,它实现了对节点的通用操作。 HashMap 的阈值默认为“容量*0.75f”,当存储节点数量超过该值,则对map 进行扩容处理。...HashMap 是一个并发不安全的容器,在迭代操作是采用的是fast-fail 机制;在并发添加操作中会出现丢失更新的问题;因为采用头插法在并发扩容时会产生环形链表的问题,导致CPU 到达100%,甚至宕机...8 时,把链表转化成红黑树来解决HashMap 因链表变长而查询变慢的问题;其次 在hash 取下标时将1.7 的9次扰动(5次按位与和4次位运算)改为2次(一次按位与和一次位运算) 1.7 的底层节点为...Entry,1.8 为node ,但是本质一样,都是Map.Entry 的实现 还有就是在存取数据时添加了关于树结构的遍历更新与添加操作,并采用了尾插法来避免环形链表的产生 但是并发丢失更新的问题依然存在...考点一:为什么初始容量必须为2 的幂?为什么负载因子为0.75f?为什么要做那么多扰动处理? 这些问题都要围绕一个点来回答:减少哈希冲突。 (1)容量必须为2 的幂是为了增加取值的可能性。
2.redis单线程为什么还能这么快?...5.redis设置的key过期了为什么没有释放内存?...2.redis对于过期的key的处理一般有惰性删除和定时删除两种策略 惰性删除:当读写一个已过期的key时,会触发惰性策略,判断key是否过期,如果过期了直接删掉。...绝大多数采用LRU策略,当存在大量热点缓存数据时,LUF可能更好 标准LRU:把所有的数据组成一个链表,表头和表尾分别表示MRU和LRU端,即最常使用端和最少使用端。...当链表的空间被占满时,它会删除LRU端的数据。 近似LRU:Redis会记录每个数据的最近一次访问的时间戳(LRU)。
大家好,我是小林。...; 所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表; 非叶子节点的索引也会同时存在在子节点中,并且是在子节点中所有索引的最大(或最小)。...HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突),JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间...为什么HashMap要用红黑树,为什么不用二叉平衡树? 红黑树适用于大量插入和删除;因为它是非严格的平衡树;只要从根节点到叶子节点的最长路径不超过最短路径的2倍,就不用进行平衡调节。...JDK 1.8 HashMap 采用数组 + 链表 + 红黑二叉树的数据结构,优化了 1.7 中数组扩容的方案,解决了 Entry 链死循环和数据丢失问题。
叶节点中的每个键值都指向真实的数据块(如Oracle中的ROWID),每个叶节点都有一个前继指针和一个后继指针。这是为了在做范围查询时,在叶子节点之间直接跳转,避免回溯到分支和后续节点。...跳表通过对间隔的数据做一个标签索引,产生了多层单链表,在最高层依次确定查找数据的范围,最终将范围缩小到可接受值,我们看跳表其实就是一个二叉查找树的变形,只是所有的数据都在最左段,其他节点用来建立查找索引...,如此跳表的插入删除就比二叉查找树方便多了 wal日志 首先,我想说一下为什么我们需要wal(写前日志)。...如果断电,内存中的数据将会丢失。因此,为了保护内存中的数据,我们需要先将日志文件记录在磁盘上。当内存中的数据刷新到磁盘时,我们可以丢弃相应的日志文件。 什么是memstore、storefile?...每次flush时,内存中的 memstore 都会成为磁盘上的storefile。 为什么有一个compact过程? 这很简单。随着小树越来越多,读取性能会越来越差。
那么面试官就会紧接着问道,为什么hashmap不是线程安全的,会造成什么问题么?于是面试者就回答:HashMap在并发情况下的put操作会造成死循环。...这时候就会被面试官问:HashMap在并发为什么造成死循环? 很多面试者这时候就会一脸懵。没有过相关经验和深入的理解源码是很难回答这个问题的。...扩容并迁移节点6后的状态,如下图所示: [A线程扩容迁移节点6] 于是第二次执行while循环时,当前待处理节点:e = 8; 在执行(关键代码)这一行时,由于线程B在扩容时将节点8的后继节点变为节点...HashMap在并发执行put操作时发生扩容,可能会导致节点丢失,产生环形链表等情况。 节点丢失,会导致数据不准 生成环形链表,会导致get()方法死循环。...知识拓展 在jdk1.7中,由于扩容时使用头插法,在并发时可能会形成环状列表,导致死循环,在jdk1.8中改为尾插法,可以避免这种问题,但是依然避免不了节点丢失的问题。
看一下链表的结点数据结构,保存了四个字段,包括key,value,key对应的hash值以及链表的下一个节点: static class Entry implements Map.Entry { final K key;//Key-value结构的key V value;//存储值 Entry next;//指向下一个链表节点 final int...hash;//哈希值 } 2.Rehash/再散列扩展内部数组长度 哈希表结构是结合了数组和链表的优点,在最好情况下,查找和插入都维持了一个较小的时间复杂度O(1), 不过结合HashMap的实现,考虑下面的情况...4.多线程put的时候可能导致元素丢失 HashMap另外一个并发可能出现的问题是,可能产生元素丢失的现象。...考虑在多线程下put操作时,执行addEntry(hash, key, value, i),如果有产生哈希碰撞, 导致两个线程得到同样的bucketIndex去存储,就可能会出现覆盖丢失的情况: ?
在我学习顺序表之后,我就立马开始了链表的学习,但是在学习链表之前,我就有一个疑问,为什么明明有了顺序表这一种数据结构为什么我们还要有链表这一种数据结构呢? 1....链表的使用和模拟实现: 3.1 构造方法: 链表源码提供了两个构造方法: 这是不带参数的构造方法; 这是带一个参数的构造方法,将c中的全部元素都拷贝到链表中; 3.2 模拟实现: 首先,我们需要创建一个...: 假如我们在如图所示的链表中头插一个node节点 为了防止我们的首节点丢失,我们需要先将首节点的地址传给新的节点,再将新节点更新为head /** * 头插法 * addFrist...; //为了防止节点丢失,先将要插入节点的next更新为前一个节点的原来的下一个节点的地址 cur.next = node;...; //为了防止节点丢失,先将要插入节点的next更新为前一个节点的原来的下一个节点的地址 cur.next = node;
大家好,又见面了,我是全栈君。 0....我们知道 HashMap 底层是一个 Entry 数组,当发生 hash 冲突的时候,HashMap 是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。...对链表而言,新加入的节点会从头结点加入。 HashMap为什么线程不安全,多线程并发的时候在什么情况下可能出现问题? Javadoc中关于hashmap的一段描述如下: 此实现不是同步的。...map 底层,其他线程的均会丢失。...其他地方还有很多可能会出现线程安全问题,我就不一一列举了,总之 HashMap 是非线程安全的,有并发问题时,建议使用 ConcrrentHashMap。
为什么还需要指针变量来保存下一个节点的位置? 链表中每个节点都是独立申请的(即需要插入数据时才去申请一块节点的空间),我们需要通过指针变量来保存下一个节点位置才能从当前节点找到下一个节点。...当我们想要从第一个节点走到最后一个节点时,只需要在前一个节点拿上下一个节点的地址(下一个节点的钥匙)就可以了。 2....但是注意,当代码走到第14行的时候,此时phead已经变成NULL了。若代码没写完,我还要继续使用指向第一个节点的地址时,这时我就找不到第一个节点的地址。 所以用一个新的指针变量phead来存储。...注意在这里prev->next=node和node->next=pos,位置可以互换,因为3的位置已经用pos来记录了,不会造成丢失。 不考虑链表为空时的情况。...//若代码没写完,我还要继续使用指向第一个节点的地址时,这时我就 //找不到第一个节点的地址 SLNode* pcur = phead; while (pcur !
上周通过一位小伙伴,加入了一个氛围很好的小群,人不多,但是大家保持着对知识的渴望,让我很感动。 我自己也有一个群,人数也不多,但是能真正互动起来一起学习,一起进步的,还是太少。...上周日也学习了一遍递归,还通过一个二叉树的例子来简单介绍了下。我之前解决二叉树相关的问题,基本上用的都是递归,结果那天分享的朋友用了队列,让我眼前一亮,原来程序的世界真是奇妙。...二叉树展开为链表 (https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/) 题目描述:给定一个二叉树,原地将它展开为链表...但是,如果我们把1的右指针指向2,那么这时候1原本的右节点就丢失了,也就是我们后续找不到5这个节点。 所以,又引起了我们的思考,如何才能不让5丢失呢?后序遍历可以吗?...再根据上面先序遍历的分析,因为我们用栈保存了右孩子,所以不需要担心右孩子丢失了。用一个 pre 变量保存上次遍历的节点即可。
当HashMap中有大量的元素都存放在同一个桶中时,这个桶下有一条长长的链表,此时HashMap就相当于单链表,假如单链表有n个元素,遍历的时间复杂度就从O(1)退化成O(n),完全失去了它的优势,为了解决此种情况...翻译一下 因为树节点的大小大约是普通节点的两倍,所以我们只在箱子包含足够的节点时才使用树节点。...当长度为 6 时红黑树退化为链表是因为 logn=log6 约等于 2.6,而 n/2=6/2=3,两者相差不大,而红黑树节点占用更多的内存空间,所以此时转换最为友好 13 HashMap 为什么线程不安全...因此 JDK1.8 使用尾插法插入元素,在扩容时会保持链表元素原本的顺序,不会出现环形链表的问题 多线程的 put 可能导致元素的丢失。...多线程同时执行 put 操作,如果计算出来的索引位置是相同的,那会造成前一个 key 被后一个 key 覆盖,从而导致元素的丢失。
领取专属 10元无门槛券
手把手带您无忧上云