一文了解一致性哈希
前言
一致性哈希是一种特殊的哈希算法,它的核心思想是在解决分布式环境下,Hash表在动态扩缩容时节点重新映射与大量数据迁移的问题。主要的应用场景是:对于有状态服务等场景,需要根据特定的key路由到相同 的目标服务机器上进行处理的场景。
一般情况下我们会使用Hash表的方式,以key-value的方式来做数据的存储。但是,当数据量比较大的情况下,我们会把数据存储到多个节点上,然后通过哈希取模的方式来决定把当前的key存储到哪个节点。但是这种方式有个很明显的问题,就是当存储的节点增加或者减少的时候,原本的映射关系就会发生变化,也就是对于所有的数据需要按照新的节点数量再重新映射一遍,这样就涉及了大量的数据迁移和重新映射的问题,它的代价很大。而一致性哈希算法,就是用来优化这样的动态变化的场景的一种算法。
一致性哈希算法的评判指标:
- 平衡性:不同key的哈希结果分布均衡,尽可能的均衡地分布到各节点上。
- 单调性:当有新的节点上线后,系统中原有的key要么还是映射到原来的节点上,要么映射到新加入的节点上,不会出现从一个老节点重新映射到另一个老节点。
- 分散性:当上游的机器看到不同的下游列表时(在上线时及不稳定的网络中比较常见), 同一个请求尽量映射到少量的节点中。
- 服务器负载均衡:负载主要是从服务器的角度来看,指各服务器的负载应该尽量均衡。 一致性哈希算法的关键特征在于: 不要导致全局重新映射, 而是要做增量的重新映射。
短链接服务TinyURL系统设计
场景
短链接服务,可以通过将一个普通的冗长的网址缩短成一个新的较短的网址,便于分享传播。短链接服务的主要应用场景有短信发送、社群推广等。短链接服务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账号
背景
chatGPT最近非常火,很多人都想拥有一个chatGPT账号。但是chatGPT账号注册有点麻烦,很多人不知道要如何注册,所以本文将手把手教你注册chatGPT账号。
步骤
准备梯子
首先,需要准备梯子,因为大陆用不了chatGPT。另外,香港也用不了chatGPT,因此,建议使用付费的梯子节点相对丰富些。随着chatGPT越来越火,chatGPT对于账号也变得严格了。从最开始的可以邮箱注册,到现在只能使用谷歌账号注册,因此建议直接使用谷歌账号注册。早期批量注册的账号有的遭到封禁,因此建议还是手动注册账号。
另外,在注册过程中,如果梯子使用的是亚洲的节点,在接收海外短信时可能出问题,因此,在注册chatGPT账号时,建议使用美国的节点。不过,使用chatGPT倒未必需要 使用美国的节点,建议选择日本、新加坡等地的节点,如果台湾的节点能用的话可以使用台湾的节点。但是,chatGPT对于频繁切换IP的账号可能会实施封禁,因此建议不要频繁切换节点。
至于如何购买梯子,由于很多梯子需要有梯子才能购买,也就是如果要购买梯子需要先有梯子。解决办法就是,找免费的梯子,或者用不需要梯子就能购买的梯子,或者找朋友帮忙买梯子。至于有哪些梯子,可以发动下自己的人脉,或者到GitHub之类的网站上找。另外,如果你能看到本文的后面,也能找到一个还不错的梯子。
注册邮箱账号
在写本文时,只有谷歌账号能注册chatGPT了,因此,建议直接注册gmail邮箱,也就是谷歌账号。注册入口:创建您的 Google 帐号 。推荐注册一个,毕竟谷歌账号很通用,许多网站能使用谷歌账号登录,gmail邮箱也比较好用。注册过程很简单,略过。
在MySQL中使用PreparedStatement
背景
有个只会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就有一定难度了,毕竟很少有这样的使用场景。
