跳到主要内容

一文了解布隆过滤器

· 阅读需 6 分钟

前言

判断某个元素是否在一个集合中在日常开发工作中十分常见,如判断用户是否重复注册、避免伪造不存在的记录导致缓存穿透、判断用户是否参加过某活动等。最直观的做法是使用HashSet,底层使用哈希表,但是哈希表在元素数量很大时需要占用非常大的空间。

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于判断一个元素一定不在某个集合中,以及一个元素可能在某个集合中,对于存在性它有一定的误判率。它的优点是空间效率和查询时间都远远超过一般的算法。

工作原理

image

一文了解一致性哈希

· 阅读需 12 分钟

前言

一致性哈希是一种特殊的哈希算法,它的核心思想是在解决分布式环境下,Hash表在动态扩缩容时节点重新映射与大量数据迁移的问题。主要的应用场景是:对于有状态服务等场景,需要根据特定的key路由到相同的目标服务机器上进行处理的场景。

一般情况下我们会使用Hash表的方式,以key-value的方式来做数据的存储。但是,当数据量比较大的情况下,我们会把数据存储到多个节点上,然后通过哈希取模的方式来决定把当前的key存储到哪个节点。但是这种方式有个很明显的问题,就是当存储的节点增加或者减少的时候,原本的映射关系就会发生变化,也就是对于所有的数据需要按照新的节点数量再重新映射一遍,这样就涉及了大量的数据迁移和重新映射的问题,它的代价很大。而一致性哈希算法,就是用来优化这样的动态变化的场景的一种算法。

一致性哈希算法的评判指标:

  • 平衡性:不同key的哈希结果分布均衡,尽可能的均衡地分布到各节点上。
  • 单调性:当有新的节点上线后,系统中原有的key要么还是映射到原来的节点上,要么映射到新加入的节点上,不会出现从一个老节点重新映射到另一个老节点。
  • 分散性:当上游的机器看到不同的下游列表时(在上线时及不稳定的网络中比较常见), 同一个请求尽量映射到少量的节点中。
  • 服务器负载均衡:负载主要是从服务器的角度来看,指各服务器的负载应该尽量均衡。 一致性哈希算法的关键特征在于: 不要导致全局重新映射, 而是要做增量的重新映射。

短链接服务TinyURL系统设计

· 阅读需 5 分钟

场景

短链接服务,可以通过将一个普通的冗长的网址缩短成一个新的较短的网址,便于分享传播。短链接服务的主要应用场景有短信发送、社群推广等。短链接服务TinyURL需要实现的基本功能有:

  • 根据长URL生成一个短URL
  • 根据短URL还原长URL,并跳转

服务

TinyURL是一个比较简单的服务,本身就是一个小的应用。

函数设计:

public String getLongUrl(String shortUrl)
public String createShortUrl(String longUrl)

接口设计:

GET /{shortUrl}
跳转到长URL

POST /shorten
{
"url": "http://xxx"
}
返回短URL

手把手教你注册chatGPT账号

· 阅读需 8 分钟

背景

chatGPT最近非常火,很多人都想拥有一个chatGPT账号。但是chatGPT账号注册有点麻烦,很多人不知道要如何注册,所以本文将手把手教你注册chatGPT账号。

步骤

准备梯子

首先,需要准备梯子,因为大陆用不了chatGPT。另外,香港也用不了chatGPT,因此,建议使用付费的梯子节点相对丰富些。随着chatGPT越来越火,chatGPT对于账号也变得严格了。从最开始的可以邮箱注册,到现在只能使用谷歌账号注册,因此建议直接使用谷歌账号注册。早期批量注册的账号有的遭到封禁,因此建议还是手动注册账号。

另外,在注册过程中,如果梯子使用的是亚洲的节点,在接收海外短信时可能出问题,因此,在注册chatGPT账号时,建议使用美国的节点。不过,使用chatGPT倒未必需要使用美国的节点,建议选择日本、新加坡等地的节点,如果台湾的节点能用的话可以使用台湾的节点。但是,chatGPT对于频繁切换IP的账号可能会实施封禁,因此建议不要频繁切换节点。

至于如何购买梯子,由于很多梯子需要有梯子才能购买,也就是如果要购买梯子需要先有梯子。解决办法就是,找免费的梯子,或者用不需要梯子就能购买的梯子,或者找朋友帮忙买梯子。至于有哪些梯子,可以发动下自己的人脉,或者到GitHub之类的网站上找。另外,如果你能看到本文的后面,也能找到一个还不错的梯子。

注册邮箱账号

在写本文时,只有谷歌账号能注册chatGPT了,因此,建议直接注册gmail邮箱,也就是谷歌账号。注册入口:创建您的 Google 帐号 。推荐注册一个,毕竟谷歌账号很通用,许多网站能使用谷歌账号登录,gmail邮箱也比较好用。注册过程很简单,略过。

在MySQL中使用PreparedStatement

· 阅读需 5 分钟

背景

有个只会SQL的校友在群里问了一个MySQL表达式求值有关的问题,大意是数据库里存储的是表达式,但需要计算表达式的结果进行查询。刚开始我以为MySQL里有类似eval 的函数,后来看了一下并没有,与之类似的是PreparedStatement ,然后结合存储过程,实现了在MySQL中进行表达式求值。这里,我将问题简化下,然后以此为例,介绍MySQL中的PreparedStatement

问题

建表语句:

create table expression_test
(
id bigint auto_increment primary key,
expression varchar(255) default '' not null comment '表达式',
result varchar(64) default '' not null comment '结果'
);

在这个表里,expression 列是一些表达式(算术运算),result 列是计算结果。初始状态下,表里expression 列有一些表达式,result 列为空,现需要计算表达式的值,并将结果填到result 列里。

如果不限制只能使用SQL,那这个问题并不算很困难,可以将表达式查出来,然后计算并写入结果即可,不过其实也可以用PreparedStatement。但如果限制只能使用SQL就有一定难度了,毕竟很少有这样的使用场景。