数据结构与算法
文章平均质量分 90
数据结构与算法
MayMatrix
J2EE .
展开
-
Redis+Lua脚本实现分布式限流(Nginx+Lua IP限流)
在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一、京东618、秒杀、抢购促销等,这些都是典型的大流量高并发场景。关注【冰河技术】微信公众号,解锁更多【高并发】专题文章。注意:由于原文篇幅比较长,所以被拆分为:理论、算法、实战(HTTP接口实战+分布式限流实战)三大部分。理论篇:《》算法篇:《》本文是在《》一文的基础上进行实现,有关项目的搭建可参见《》一文的内容。小伙伴们可以关注【冰河技术】微信公众号来阅读上述文章。转载 2022-11-08 15:28:27 · 2642 阅读 · 3 评论 -
Redis 分布式限流器-计数器算法
水先进入到漏桶里,漏桶里的水按一定速率流出,当流出的速率小于流入的速率时,由于漏桶容量有限,后续进入的水直接溢出(拒绝请求),以此实现限流。转载 2022-11-08 15:23:30 · 1169 阅读 · 0 评论 -
分布式限流 redission RRateLimiter 的使用及原理
redission分布式限流采用令牌桶思想和固定时间窗口,trySetRate方法设置桶的大小,利用redis key过期机制达到时间窗口目的,控制固定时间窗口内允许通过的请求量。转载 2022-11-08 15:09:05 · 3527 阅读 · 0 评论 -
Redisson分布式限流器RRateLimiter原理解析
因为公司的开放网关的限流模块就是基于Redisson开发的,之前看的版本源码与最新的已经有很大的不同,趁着整理知识点的机会下了最新版的源码看了一遍。限流这个说简单也简单,说复杂也复杂。不知道是不是我看的东西太少,我觉得redisson的限流器设计非常精巧,感觉把redis玩穿了。转载 2022-11-08 15:05:16 · 1031 阅读 · 1 评论 -
Java常见5种限流算法及7种限流方式
最近几年,随着微服务的流行,服务和服务之间的依赖越来越强,调用关系越来越复杂,服务和服务之间的稳定性越来越重要。在遇到突发的请求量激增,恶意的用户访问,亦或请求频率过高给下游服务带来较大压力时,我们常常需要通过缓存、限流、熔断降级、负载均衡等多种方式保证服务的稳定性。其中限流是不可或缺的一环,这篇文章介绍限流相关知识。这篇文章介绍实现限流的几种方式,主要是窗口算法和桶算法,两者各有优势。转载 2022-11-08 15:01:15 · 3366 阅读 · 0 评论 -
Java中4种经典限流算法讲解
本文主要介绍了Java中4种经典限流算法讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧−目录最近,我们的业务系统引入了Guava的限流组件,它是基于实现的,而令牌桶是非常经典的限流算法。本文将跟大家一起学习几种经典的限流算法。转载 2022-11-08 14:56:51 · 1244 阅读 · 0 评论 -
Sentinel 系统自适应限流原理剖析与实战指导
看到标题中的几个关键字系统自适应限流是否是以为高大上,这个自适应又是如何实现的呢? 一、Sentinel 系统自适应概述 从官方了解到 Sentienl 系统自适应限流是一个全局的概念,对应用入口流量统一进行统一控制,结合应用的机器负载、CPU 使用率,整体平均响应时间、入口 QPS 和并发线程数等几个维度的监控指标从而决定是否调用进行限流操做。为了有一个直观的感觉,咱们能够从官方的运维平台看看其系统自适应限流的操做界面:架构 RT、线程数、入口QPS这三个指标是能够经过采集调用信息进行..转载 2021-12-03 14:57:58 · 656 阅读 · 0 评论 -
深入理解云原生下自适应限流技术原理与应用
作者简介:乔卓越,于19年毕业,热爱开源,乐于思考。拥有基础架构和游戏领域的一线开发经验。独立负责过大规模后端服务的开发与性能测试平台搭建。 前言 本文将深入讨论现今后端服务关于负载的测量、优化、治理手段,通过对比分析TCP-BBR技术核心痛点,进而带读者尽可能理解并掌握自适应限流技术。 背景 负载(load),通常与并发关系密切。对于后端服务而言,任意时间内的并发用户访问都会提升服务负载,进而进一步消耗计算资源。然而计算资源是有限的,如CPU、memory、network等等,过载将会导致服...转载 2021-12-03 14:53:57 · 607 阅读 · 0 评论 -
自适应限流工具
作者:fredalxin地址:https://fredal.xin/netflix-co...作为应对高并发的手段之一,限流并不是一个新鲜的话题了。从Guava的Ratelimiter到Hystrix,以及Sentinel都可作为限流的工具。自适应限流一般的限流常常需要指定一个固定值(qps)作为限流开关的阈值,这个值一是靠经验判断,二是靠通过大量的测试数据得出。但这个阈值,在流量激增、系统自动伸缩或者某某commit了一段有毒代码后就有可能变得不那么合适了。并且一般业务方也不太能够正确评估自己的容量,去设转载 2021-12-03 14:50:21 · 377 阅读 · 1 评论 -
Go可用性 限流 : 自适应限流
序 在前面限流的三篇文章,我们学习了令牌桶、漏桶算法的原理、实现以及使用方式,不知道你有没有觉得这两种算法存在着一些问题。 Go 可用性(二) 限流 1: 令牌桶原理及使用 Go 可用性(三) 限流 2: 令牌桶的实现 rate/limt Go 可用性(四) 限流 3: 漏桶算法 这两种算法最大的一个问题就是他们都属于需要提前设置阈值的算法,基于 QPS 进行限流的时候最麻烦的就是这个阈值应该怎么设定。一般来说我们可以通过压测来决定这个阈值。 .转载 2021-12-03 14:47:49 · 760 阅读 · 0 评论 -
TCP 的那些事儿(下)
这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP的协议头、状态机、数据重传中的东西。但是TCP要解决一个很大的事,那就是要在一个网络根据不同的情况来动态调整自己的发包的速度,小则让自己的连接更稳定,大则让整个网络更稳定。在你阅读下篇之前,你需要做好准备,本篇文章有好些算法和策略,可能会引发你的各种思考,让你的大脑分配很多内存和计算资源,所以,不适合在厕所中阅读。目录TCP的RTT算法经典算法Karn / Partridge 算法J.转载 2021-12-02 18:08:15 · 121 阅读 · 0 评论 -
TCP 的那些事儿(上)
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》(当然,你也可以去读一下RFC793以及后面N多的RFC)。另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找相关的技术文档。之所以想写这篇文章,目的有三个,一个是想锻炼一下自己是否可以用简单的篇幅把这么复杂的TCP协议.转载 2021-12-02 18:02:19 · 201 阅读 · 0 评论 -
TCP滑动窗口 和 拥塞窗口
滑动窗口 -- 表征发送端和接收端的接收能力拥塞窗口-- 表征中间设备的传输能力 TCP滑动窗口需要说明一下,如果你不了解TCP的滑动窗口这个事,你等于不了解TCP协议。我们都知道,TCP必需要解决的可靠传输以及包乱序(reordering)的问题,所以,TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包。所以,TCP引入了一些技术和设计来做网络流控,Sliding Window是其中一个技术。 前面我们说过,TCP头里有一个字段叫W.转载 2021-12-02 17:57:47 · 772 阅读 · 0 评论 -
TCP BBR拥塞控制算法解析
维基百科简介:https://en.wikipedia.org/wiki/TCP_congestion_control#TCP_BBR 作者:Liu, Lubin 摘要 2016年底,Google发表了一篇优化tcp传输算法的文章,极大的提高了tcp得throughput,并且已经集成到Linux 4.9 内核。本文给出了论文中省略的一些背景知识,并结合自己的理解做了更加细节的介绍,可以帮助读者理解整个bbr算法。 1.背景 1.1TCP 基于丢转载 2021-12-01 17:35:12 · 2311 阅读 · 0 评论 -
alibaba / Sentinel 系统自适应限流原理
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。背景在开始之前,我们先了解一下系统保护的目的:保证系统不被拖垮在系统稳定的前提下,保持系统的吞吐量长期以来,系统保护的思路是根据硬指标,即系统的负载 (load1) 来做系统过载保护。当系统负载高于某个阈值,就禁止或转载 2021-11-30 15:57:29 · 333 阅读 · 0 评论 -
Nginx七层负载均衡的六种调度算法简介
这篇文章主要介绍了简单了解Nginx七层负载均衡的几种调度算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Nginx是一款轻量级的高性能web服务器,同时也是一款非常优秀的负载均衡器和反向代理服务器。由于支持强大的正则匹配规则、动静分离、URLrewrite功能及安装配置简单且对网络稳定性依赖非常小等优点,所以常用来做为七层负载均衡使用。在硬件不差的情况下,通常可以稳定支持几万的并发连接,在硬件性能足够好,且对系统内核参数及Nginx配置进行优化甚至可转载 2021-10-14 18:48:07 · 1145 阅读 · 0 评论 -
面试官:海量无序数据,寻找第 K 大的数,越快越好
最近在参加阿里云举办的《第三届数据库大赛创新上云性能挑战赛–高性能分析型查询引擎赛道》,传送门:https://tianchi.aliyun.com/competition/entrance/531895/introduction。好久没有打比赛了,也是突然来了兴致,参加性能挑战赛总有一种自己还年轻的感觉。因为比赛还没有结束,所以赛题解析还不方便这时候就写出来,但是其中一个优化点,倒是可以拿出来跟大家分享下。简单抽象一下问题,便是今天的主题:在一个百万级无序的 long 数组中,寻找第 K 大的数。要转载 2021-06-30 11:29:45 · 567 阅读 · 0 评论 -
现代化的缓存设计方案:Caffeine Cache
原文地址 译者:简直缓存是提升性能的通用方法,现在大多数的缓存实现都使用了经典的技术。这篇文章中,我们会发掘Caffeine中的现代化的实现方法。Caffeine 是一个开源的 Java 缓存库,它能提供高命中率和出色的并发能力。期望读者们能被这些想法激发,进而将它们应用到任何你喜欢的编程语言中。驱逐策略缓存的驱逐策略是为了预测哪些数据在短期内最可能被再次用到,从而提升缓存的命中率。由于简洁的实现、高效的运行时表现,以及在常规的使用场景下有不错的命中率,LRU(Least Rec...转载 2020-09-08 09:42:35 · 504 阅读 · 0 评论 -
Count-Min Sketch原理
如果老板让你统计一个实时的数据流中元素出现的频率,并且准备随时回答某个元素出现的频率,不需要的精确的计数,那该怎么办?直觉告诉我们可能需要一个巨大的 HashMap 来统计各个元素的出现频率,但由于不同的元素的个数可能非常大,以至于是个天文数字,要求的内存可能会非常大,从而不切实际。同时,又要求我们实时计算,实时回答,当HashMap的冲突很高时,最坏的情况的时间复杂度可能无法满足实时的要求。加上前面要求不需要精确的计数,这么说来,必须寻找新的算法。那么,Count-Min Sketch 就是用转载 2020-09-08 09:39:02 · 1390 阅读 · 0 评论 -
常见的八大排序算法的比较和选择依据
一、八大排序简介:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外...转载 2020-07-16 12:26:31 · 2014 阅读 · 0 评论 -
理解BitMap算法的原理及应用
前言位图:一种常用的数据结构,代表了有限域中的稠集(dense set),每一个元素至少出现一次,没有其他的数据和元素相关联。在索引,数据压缩,海量数据处理等方面有广泛应用。BitMap 的思想的和原理是很多算法的基础,比如 Bloom Filter、Counting Bloom Filter。BitMap的原理BitMap 的基本原理就是用一个 bit 位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。举个例子在Java里...转载 2020-06-11 22:08:06 · 10122 阅读 · 0 评论 -
常见排序算法和搜索算法——时间和空间复杂度
排序方法平均情况最好情况最坏情况辅助空间稳定性冒泡排序O(n^2)O(n)O(n^2)O(1)稳定选择排序O(n^2)O(n^2)O(n^2)O(1) 不稳定插入排序...转载 2020-06-09 09:55:50 · 836 阅读 · 0 评论 -
Lucene底层 索引原理
基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级、万亿条数据记录的检索工作,这里向大家分享下Lucene底层...转载 2020-04-29 17:53:32 · 436 阅读 · 0 评论 -
Lucene索引过程中 内存管理与数据存储
Lucene的索引过程分两个阶段,第一阶段把文档索引到内存中;第二阶段,即内存满了,就把内存中的数据刷新到硬盘上。 倒排索引信息在内存存储方式 Lucene有各种Field,比如StringField,Tex...转载 2020-04-29 17:44:57 · 946 阅读 · 0 评论 -
Lucene索引存储结构
内存管理 与 数据存储索引文档的总体结构 索引(index):Lucene的索引由许多个文件组成,这些文件放在同一个目录下 段(segment):一个Lucene的索引由多个段组成,段与段之间是独立的。添加新的文档时可以生成新的段,达到阈值(段的个数,段中包含的文件数等)时,不同的段可以合并。在文件夹下,具有相同前缀的文件属于同一个段segments...转载 2020-04-29 17:41:30 · 2714 阅读 · 1 评论 -
MYSQL索引之B+Tree
首先,正确的创建合适的索引,是提升数据库查询性能的...转载 2020-04-17 14:07:29 · 238 阅读 · 0 评论 -
Elasticsearch倒排索引与B+Tree对比
如何快速检索?Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在 18 和 30 之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型数据库的 b-tree 索引快在哪里?到底为什么快呢?笼统的来说,b-tree 索引是为写入优化的索引结构。当我们不需要支持快速的更新的时候,可以用预...转载 2020-04-17 12:02:30 · 4969 阅读 · 2 评论 -
Elasticsearch中的倒排索引详解
Elasticsearch创建索引流程一文中,介绍了ES创建索引的流程。再流程中是调用Lucene的接口来创建索引的。本篇文章主要介绍ES中的索引——倒排索引倒排索引是搜索引擎非常重要的一种数据结构,什么是倒排索引,倒排索引的原理是什么?1 索引过程在讲解倒排索引前,我们先了解索引创建,下图是 Elasticsearch 中数据索引过程的流程。从上图可以看到,文档未在 ES 中...转载 2020-04-17 11:58:29 · 6075 阅读 · 0 评论 -
布隆过滤器的原理、使用场景和注意事项
什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。实现原理HashMap 的问题讲述布隆过滤器的...转载 2020-04-16 16:50:02 · 223 阅读 · 0 评论 -
BTree和B+Tree详解
B-Tree是平衡搜索多叉树。B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树即由这些树逐步优化而来。树 是数据结构基础知识,想要深...转载 2020-04-16 16:11:05 · 1014 阅读 · 0 评论 -
【算法基础】o(1), o(n), o(logn), o(nlogn)
由于平时接触算法比较少,今天看资料看到了o(1),都不知道是什么意思,百度之后才知道是什么意思。 描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据...转载 2020-04-16 10:45:06 · 710 阅读 · 0 评论 -
分布式一致性算法(二)Raft算法
一、更加直观的Raft算法Raft 适用于一个管理日志一致性的协议,相比于 Paxos 协议 Raft 更易于理解和去实现它。为了提高理解性,Raft 将一致性算法分为了几个部分,包括领导选取(leader selection)、日志复制(log replication)、安全(safety),并且使用了更强的一致性来减少了必须需要考虑的状态。1.解决什么问题分布式存储系统通常通过维...转载 2020-03-05 11:49:19 · 569 阅读 · 0 评论 -
分布式一致性算法(一)Paxos算法
从分布式一致性到共识机制(一)Paxos算法从分布式系统的CAP理论出发,关注分布式一致性,以及区块链的共识问题及解决。区块链首先是一个大规模分布式系统,共识问题本质就是分布式系统的一致性问题,但是又有很大的不同。工程开发中,认为系统中存在故障(fault),但不存在恶意(corrupt)节点,而区块链,特别是公开链是落地到物理世界中,涉及到人性和利益关系,不可避免的存在信任以及恶意攻击...转载 2020-03-05 11:46:10 · 592 阅读 · 0 评论 -
排序算法性能及选择总结
各种排序方法的性能比较:排序法平均时间最坏情况最好情况稳定度额外空间备注1.直接插入O(n2)O(n2)O(n)稳定O(1)大部分已排序时较好(简单)1.希尔O(nlogn)转载 2015-08-21 17:42:23 · 3048 阅读 · 0 评论 -
浅析常用的排序算法
排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序、分配排序和计数排序。插入排序主要包括直接插入排序,折半插入排序和希尔排序两种;选择排序主要包括直接选择排转载 2015-08-21 17:34:33 · 555 阅读 · 0 评论