跳至主要內容
搜索引擎告诉你如何“论资排辈”

搜索引擎告诉你如何“论资排辈”

在前文「搜索引擎告诉你如何大海捞针」中,我们简要的描述了搜索引擎是如何从成百上千亿的网站中,快速的搜索到我们要找的内容。但能够搜索到结果只是搜索流程中的一部分,还有另一个很重要组成部分 —— 排序。

现在我们随便搜索一些数据可能都会找到几十、甚至上百万条结果,如果是较为热门的内容甚至会有上千万条。那如何从这上千万个网页中,找到用户最想要的、或者说是跟用户搜索的关键词最相关的网页呢?这就是我们本章要探索的内容。


LeonSH...大约 7 分钟后端搜索引擎
搜索引擎告诉你如何大海捞针

搜索引擎告诉你如何大海捞针

如果问你这个问题:

像搜索引擎这样的全文搜索底层原理到底是什么?

对于有经验的人来说,很轻松的就能回答这个问题。因为现代的搜索引擎基本都是采用倒排索引来实现的。那什么是倒排索引呢?

建立倒排索引

有的同学看到「倒排」两个字可能有点慌。

我知道你很急,但你先别急(bushi)

这个不是「倒排需求」的倒排,而是「倒排索引」的倒排。假设我们现在有 3 个网页,包含了如下很简单的内容:


LeonSH...大约 4 分钟后端搜索引擎
Base 64原理

Base 64原理

Base64

Base64 是什么?是将字节流转换成可打印字符、将可打印字符转换为字节流的一种算法。Base64 使用 64 个可打印字符来表示转换后的数据。

准确的来说,Base64 不算是一种加、解密的算法,它是一种编码、解码的算法。这也是为什么我的用词是编码、解码,而不是加密、解密。

编码原理

这里的讨论的前提是使用 UTF-8 编码

Base64 算法的原理,是将输入流中的字节按每 3 个分为一组,然后每次取 6 个比特,将其转换成表格中对应的数据,一直重复到没有剩余的字符为止,转换表格如下:


LeonSH...大约 6 分钟后端Base64
缓存与数据库的双写一致性

缓存与数据库的双写一致性

这几天瞎逛,不知道在哪里瞟到了缓存的双写,就突然想起来这块虽然简单,但是细节上还是有足够多我们可以去关注的点。这篇文章就来详细聊聊双写一致性

首先我们知道,现在将高速缓存应用于业务当中已经十分常见了,甚至可能跟数据库的频率不相上下。你的用户量如果上去了,直接将一个裸的 MySQL 去扛住所有压力明显是不合理的。

这里的高速缓存,目前业界主流的就是 Redis 了,关于 Redis 相关的文章,之前也有聊过,在此就不赘述,感兴趣的可以看看:


LeonSH...大约 7 分钟后端缓存
深入了解Zookeeper核心原理

深入了解Zookeeper核心原理

之前的文章Zookeeper基础原理&应用场景详解中将Zookeeper的基本原理及其应用场景做了一个详细的介绍,虽然介绍了其底层的存储原理、如何使用Zookeeper来实现分布式锁。但是我认为这样也仅仅只是了解了Zookeeper的一点皮毛而已。所以这篇文章就给大家详细聊聊Zookeeper的核心底层原理。不太熟悉Zookeeper的可以回过头去看看。


LeonSH...大约 13 分钟后端Zookeeper
Zookeeper基础原理&应用场景详解

Zookeeper基础原理&应用场景详解

简单了解Zookeeper

Tips: 如果之前对Zookeeper不了解的话,这里大概留个印象就好了

Zookeeper是一个分布式协调服务,可以用于元数据管理、分布式锁、分布式协调、发布订阅、服务命名等等。

例如,Kafka中就是用Zookeeper来保存其集群中的相关元数据,例如Broker、Topic以及Partition等等。同时,基于Zookeeper的Watch监听机制,还可以用其实现发布、订阅的功能。


LeonSH...大约 7 分钟后端Zookeeper
降低代码的圈复杂度——复杂代码的解决之道

降低代码的圈复杂度——复杂代码的解决之道

本文代码示例以Go语言为例

0. 什么是圈复杂度

可能你之前没有听说过这个词,也会好奇这是个什么东西是用来干嘛的,在维基百科上有这样的解释。

Cyclomatic complexity is a software metric used to indicate the complexity of a program. It is a quantitative measure of the number of linearly independent paths through a program's source code. It was developed by Thomas J. McCabe, Sr. in 1976.


LeonSH...大约 12 分钟后端圈复杂度
大白话聊聊微服务——人人都能看懂的演进过程

大白话聊聊微服务——人人都能看懂的演进过程

这篇博客的本意是希望看到这篇文章的读者能够很轻松的理解我想表达的意思。但程序向的分享经常会不经意间就贴上了代码,很可能就会让人看的很懵。而且我认为分享一个东西,只有对方真正明白了其中的逻辑,才是有意义的分享。所以接下来我会尝试用大家都能理解的语言来聊一聊”微服务“。

【写在前面】

那么,什么是微服务呢?你不一定知道微服务,但是你一定知道麦某劳,而且知道麦某劳有个甜品站。你可能会问,甜品站和微服务有什么关联呢?

让我们先假设不把甜品站独立出来,而是普通的麦某劳店。经营一段时间你会发现,这个地方虽然人流量很大,也有顾客,但是顾客的需求80-90%都集中在甜品,导致甜品供不应求,而其余的菜品则没多少人购买。但是把这个店关了吗?那也不行,始终是有流量的。


LeonSH...大约 14 分钟后端微服务
简单了解一下K8S,并搭建自己的集群

简单了解一下K8S,并搭建自己的集群

距离上次更新已经有一个月了,主要是最近工作上的变动有点频繁,现在才暂时稳定下来。这篇博客的本意是带大家从零开始搭建K8S集群的。但是我后面一想,如果是我看了这篇文章,会收获什么?就是跟着步骤一步一走吗?是我的话我会选择拒绝,所以我加了关于K8S的简单介绍,每一步的步骤都添加了解释。由于篇幅和时间原因,我只介绍了K8S中较为核心的Pod和Service。

文章前半段会简单的介绍一下K8S,后半段会介绍如何从零开始慢慢的搭建集群。如果想直接开始着手搭建集群,则可以直接从第三章开始看。


LeonSH...大约 13 分钟后端K8S
游戏服务器和Web服务器的区别

游戏服务器和Web服务器的区别

用Go语言写游戏服务器也有一个多月了,也能够明显的感受到两者的区别。这篇文章就是想具体的聊聊其中的区别。当然,在了解区别之间,我们先简单的了解一下Go语言本身。

Go语言的特点

Go语言跟其他的语言例如Java比起来,算得上一门很年轻的语言。Go语言是由Robert Griesemer、Rob Pike和Ken Thompson于2007年在Google开发。并于2009年正式发布。

Go语言的设计理念围绕着简洁这两个字,认为少即是多。如果你熟悉Java,用Java那一套语法命名跟Go做对比,可以很明显的体会到这种感觉。


LeonSH...大约 12 分钟后端
2