30、布隆过滤器:如何解决Redis缓存穿透问题

你好,我是微扰君。 上一讲我们学习了如何基于bitmap,使用少量内存,对大量密集数据高效地去重和排序,本质就是通过一个长长的二进制01序列,来维护每个元素是否出现过这样的二值状态,这个数据结构非常重要,日常工作中有很多应用,比如我们今天要学习的布隆...

业务开发算法50讲

31、跳表:Redis是如何存储有序集合的

你好,我是微扰君。 上一讲我们一起学习了布隆过滤器,它可以帮助我们用更低的存储成本、更高效地判断某个元素是否在一个集合中出现,当然代价是一定的误判率。总的来说,布隆过滤器特别适合用来解决Redis中缓存穿透的问题。 今天,我们同样来讨论一个在Redi...

业务开发算法50讲

32、时间轮:Kafka是如何实现定时任务的

你好,我是微扰君。 今天我们来聊一聊日常开发中非常常见的技术需求:延时队列。 之前在学Kafka二分搜索的时候,我们已经学过了消息队列,它是一个用于传递消息的组件,大部分场景下,我们都希望消息尽快送达,并且消息之间要严格遵循先进先出的约束。但在有一些...

业务开发算法50讲

33、限流算法:如何防止系统过载

你好,我是微扰君。 上一讲我们学习了业务场景中频繁会使用到的延时队列,能帮助处理很多业务上的定时任务问题,因为这个组件的功能和具体业务往往没有关系,我们通常会利用各种中间件来实现延时队列的能力。 今天我们来探讨另外一个算法的原理和实现,它也和业务本身...

业务开发算法50讲

34、前缀树:Web框架中如何实现路由匹配

你好,我是微扰君。 不知不觉,已经到工程实战篇的最后一讲了,在这个章节中,我们一起学习了很多工程中常用的算法,如果你从事后端开发,应该或多或少有些接触,比如在Redis、Kafka、ZooKeeper等常用中间件里就经常出现,理解它们的核心思想,能给...

业务开发算法50讲

35、洗牌算法:随机的哲学,如何用程序来洗一副牌

你好,我是微扰君。 专栏正文已经结束了,在过去一段时间里我们一起学的知识,不知道你掌握得怎么样了呢?如果还意犹未尽的话,从今天开始我们会陆陆续续聊一些其他话题,作为特别番外,希望你可以和我一起继续享受其中的思维乐趣。 今天就先从一个颇有趣味的“洗牌算...

业务开发算法50讲

36、分布式事务:如何理解两阶段提交

你好,我是微扰君。 今天我们来聊一个经典问题“分布式事务”,以及它的常见解决方案“两阶段提交”。 关于事务,我们之前在介绍日志型文件系统的时候就已经一起学习过了(戳[这里]复习),主要特点就是需要保证在应用程序中,一系列连续操作要么全部成功执行,要么...

业务开发算法50讲

37、Thrift编码方法:为什么RPC往往不采用JSON作为网络传输格式

你好,我是微扰君。今天我们来聊聊RPC的网络传输编码方式。 如果你有过几年后端服务的开发经验,对RPC,也就是远程过程调用,应该不会陌生。随着互联网应用的发展,我们的服务从早期流行的单体架构模式,逐步演进成了微服务架构的模式,而微服务之间通信,最常见...

业务开发算法50讲

38、倒排索引:搜索引擎是如何做全文检索的

你好,我是微扰君。今天我们来聊一聊倒排索引算法。 倒排索引算法,作为一种经典的索引方式,在工业界中应用非常广泛,比如搜索引擎、推荐系统、广告系统等等。在广告系统中,我们需要根据定向信息去广告库中召回合适的广告;在搜索引擎中,需要根据某个关键字返回若干...

业务开发算法50讲

39、Geohash:点外卖时我们是如何查找到附近餐厅的

你好,我是微扰君。 今天我们来聊一聊另一个和索引相关的非常有趣的问题:“地理位置检索”问题。 身处移动互联网时代,我们的衣食住行少不了各种用到地理位置信息的APP。比如周末想和朋友小聚一下,不知道去哪,我就会在美团点评上检索餐厅或者休闲场所,除了看评...

业务开发算法50讲