加入收藏 | 设为首页 | 会员中心 | 我要投稿 长春站长网 (https://www.0431zz.com.cn/)- 媒体智能、开发者工具、运维、低代码、办公协同!
当前位置: 首页 > 站长资讯 > 评论 > 正文

关于可重入函数

发布时间:2021-02-05 11:03:55 所属栏目:评论 来源:互联网
导读:注意是指整个元素,如果是有序的话,在有些时候,比如在数据库里面也好,或者是在其他对一些有序的树进行查询的时候,即使用链表这种方式存储的话,我们发现它的元素是有序的,比如说下面这个升序链表,134578910 它是升序排列的,这个时候我们要快速地查询

注意是指整个元素,如果是有序的话,在有些时候,比如在数据库里面也好,或者是在其他对一些有序的树进行查询的时候,即使用链表这种方式存储的话,我们发现它的元素是有序的,比如说下面这个升序链表,134578910 它是升序排列的,这个时候我们要快速地查询,比如 9 在什么地方或者查询 5,是不是在这个链表里面出现,这时候你会发现,如果是用普通的数组可以进行二分查找可以很快查到5所在的位置,以及查询到一个元素是否存在。

一个有序的数组里面存在,那么问题来了,如果是有序的,但是是链表的情况下应该怎样有效地加速呢?于是在近代1990年前后,一种新的数据结构出现了,它的名字叫做 跳表。

跳表的特点

注意:只能用于元素有序的情况。

所以,跳表(skip list)对表的是平衡树(AVL Tree)和 二分查找,是一种 插入/删除/搜索 都是 O(logn) 的数据结构。1989 年出现。

  • 不管是平衡树、二叉搜索树其他哪些树的话都是在1960年和196几年就已经出现了,它的出现比平衡树和二分查找以及所谓的一些高级数据结构出现的要晚。比其他的晚了接近30年,最后才出现,这就是为什么很多老的数据结构的话,用平衡二叉树会多一点,而一些比较新的,特别是在元素个数不多的情况的情况下,用的全部都是跳表,也就是说在更新换代了。

它的最大优势是原理简单、容易实现、方便扩展、效率更高。因此在一些热门的项目里用来替代平衡树,如 Redis、LevelDB等。

  • 跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。

如何给有序的链表加速

假设有一个有序的链表,1 3 4 5 7 8 9 10 这么一个原始的链表。它的时间复杂度查询肯定是 O(n) 的,那么问一下如何优化?如何进行简单优化?可以让它的查询时间复杂度变低,也就是加速它的查询。

我们可以思考一些,如果你来比如说我要很快地查到 7 ,有没有在链表中存在和它的位置在哪儿的话,你能够非常快的查询出来吗?
 

以上示意图描述了一个序列号的二进制组成结构。

第一位不用,恒为0,即表示正整数;接下来的41位表示时间戳,精确到毫秒。为了节约空间,可以将此时间戳定义为距离某个时间点所经历的毫秒数(Java默认是1970-01-01 00:00:00)。

再后来的10位用来标识工作机器,如果出现了跨IDC的情况,可以将这10位一分为二,一部分用于标识IDC,一部分用于标识服务器;最后12位是序列号,自增长。

snowflake的核心思想是64bit的合理分配,但不必要严格按照上图所示的分法。如果在机器较少的情况下,可以适当缩短机器id的长度,留出来给序列号。

5. 黑名单机制

如果此appid进行过很多非法操作,或者说专门有一个中黑系统,经过分析之后直接将此appid列入黑名单,所有请求直接返回错误码;

我们可以给每个appid设置一个状态比如包括:初始化状态,正常状态,中黑状态,关闭状态等等;或者我们直接通过分布式配置中心,直接保存黑名单列表,每次检查是否在列表中即可;

限流机制

常用的限流算法包括:令牌桶限流,漏桶限流,计数器限流;

  • 令牌桶限流令牌桶算法的原理是系统以一定速率向桶中放入令牌,填满了就丢弃令牌;请求来时会先从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务;令牌桶允许一定程度突发流量,只要有令牌就可以处理,支持一次拿多个令牌;
  • 漏桶限流漏桶算法的原理是按照固定常量速率流出请求,流入请求速率任意,当请求数超过桶的容量时,新的请求等待或者拒绝服务;可以看出漏桶算法可以强制限制数据的传输速度;
  • 计数器限流计数器是一种比较简单粗暴的算法,主要用来限制总并发数,比如数据库连接池、线程池、秒杀的并发数;计数器限流只要一定时间内的总请求数超过设定的阀值则进行限流;

具体基于以上算法如何实现,Guava提供了RateLimiter工具类基于基于令牌桶算法:

(编辑:长春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读