彻底搞懂什么是一次性哈希算法
背景近期在学习 Go 语言,在 分布式存储 Geecache 练习教程中第一次听到一次性哈希,由于第一次接触后端,不是特别理解,所以记录下以备后续巩固学习。
分配请求在分布式存储中,往往会通过多台服务器构成集群来提供服务,因为单机的并发量和数据量是有限的,接下来我们称服务器为节点。
假设集群有十个节点,当 节点A 接收到 请求A 时,如果 节点A 没有缓存数据,那么它将会从数据源获取 数据A 并缓存到 节点A 。那么第二次当输入一致时将只有 1/10 的几率选择 节点A 去读取缓存,而有 9/10 的几率会选择其他节点,并再次访问数据源进而存储数据。就会造成在多个节点中,多次缓存同一份数据,导致效率低下,存储空间的浪费。
那么我们该如何将缓存均匀的分布到不同节点进行缓存,并保证但输入一致时,访问同一个节点?
哈希算法取模运算通过对输入进行哈希计算,每次计算都是相同的值,这样就可以将某些相同的请求全部打到同一个节点,从而满足分布式系统的负载均衡需求。
比如当前有三个节点 A、B、C,我们将输入的所有字符的 ASCII 码加起来生成一个 KEY,基于 hash(key) % 3 公式计算得 ...
Golang 学习
环境
MacOS 安装
1brew install go
修改 .zshrc 配置
1234export PATH=$PATH:$GOROOT/binexport GOPATH=$HOME/Developer/gopathsource ~/.zshrc
查看环境变量
12go versiongo env
语法基本结构和基本数据类型可见性规则
只有当某个(常量、变量、类型、函数、结构字段等)需要被外部包调用的时候才使用大写字母开头,并遵循 Pascal 命名法,称为导出(像面向对象语言中的 public);
否则就遵循骆驼命名法,即第一个单词的首字母小写,其余单词的首字母大写,对外不可见。
类型Go 语言中不存在类型继承
基本类型:int、float、bool、string
结构化/复合:struct、array、since、map、channel
结构化的类型没有真正的值,使用 nil 作为默认值
描述类型行为:interface
示例
12345678910单类型定义var IZ initvar a IZ = 5// 多类型定义type ( IZ int ...
通过 N 指令快速切换 Node 版本
安装 n 模块1sudo npm install -g n
安装 Node 版本1sudo n 20.12.2
查看所有版本并切换1n
切换选择 Node 版本
常用指令1234sudo n stable // 安装稳定版本sudo n x.x.x // 安装指定版本sudo n rm x.x.x // 删除指定版本sudo n use x.x.x demo.js // 用指定版本执行脚本
最常见的 pm2 指令
PM2 是 node 进程管理工具,可以利用它来简化很多 node 应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。
基础指令
全局安装
1npm install -g pm2
启动
1pm2 start app.js
-i --instance: 创建进程实例,可用于负载均衡。
-n --name: 指定启动实例的应用名称。
-o --output <path>: 输出标准日志路径。
-e --error <path>: 输出错误日志路径。
--watch: 监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
--ignore-watch: 排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如–ignore-watch=”test node_modules “some scripts””
重新启动
1pm2 restart app.js
查看所有进程信息
123pm2 statuspm2 listpm2 ls
查看某个进程信息
1pm2 describe <NAME | ...
如何在 Linux 快速安装 Nodejs
在 Linux 环境下,我通过 apt 安装 nodejs 发现无论怎么更新 sudo apt update & sudo apt install nodejs,始终只能安装到 node 10.x 版本,然而我需要安装最新版本的 Node.于是通过二进制安装。
确定版本
确定 Linux 系统版本,我的是 x86_64
1uname -m
到 Node 官网 找到你需要安装的版本,右键复制安装包地址链接。
安装
下载1wget https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz
解压我放在了 /usr/local/bin 目录下
1sudo tar -xvf node-v13.11.0-linux-x64.tar.xz -C /usr/local/bin
修改命名
1sudo mv /usr/local/bin/node-v13.11.0-linux-x6 /usr/local/bin/node
配置环境变量
1echo 'export PATH=" ...
最实用的 Linux 高级指令(持续更新)
主机名要修改服务器的主机名(hostname),可以按照以下步骤进行:
使用管理员权限登录到服务器。
1ssh root@192.12.**.**
输入以下命令以查看当前的主机名:
1hostname
输入以下命令以修改主机名(将 替换为你想要设置的新主机名):
1sudo hostnamectl set-hostname <new_hostname>
或者,如果你使用的是旧版本的 Linux 发行版,可以使用以下命令:
1sudo hostname <new_hostname>
输入管理员密码以确认操作。
重新启动服务器或注销并重新登录以使主机名更改生效。
如果遇到 sudo: unable to resolve host RN-0914: Name or service not known
12sudo nano /etc/hosts
修改 192.221..
保存
用户在 Linux 系统中,有许多与用户相关的操作可以进行。以下是一些常见的用户操作:
添加用户:使用 useradd 命令可以添加新用户。例如:
1sudo usera ...
使用 Cloudflare Workers 反代节点
反代节点(Reverse Proxy Node)通常是指充当反向代理服务器的节点。它们用于接收来自客户端的请求,并将这些请求代理到一个或多个后端服务器,然后将后端服务器的响应返回给客户端。这类似于反向代理服务器的功能,用于负载均衡、缓存、安全性和性能优化等用途。
反代节点通常用于隐藏后端服务器的真实 IP 地址或域名,以提高安全性和隐私。它们可以在网络架构中充当重要的中继点,帮助优化流量分发、减轻后端服务器的负载,同时提供额外的网络功能和安全策略。
因此,反代节点通常是一种反向代理服务器,即服务端代理。它用于管理和代理客户端请求,以改进网络性能和提供其他功能。
接下来,我们通过 Cloudflare Workers 来实现反代节点。
注册 Cloudflare访问 Cloudflare 控制台 进行注册/登录
域名正常情况下,cloudflare 会生成一个四级域名地址 ${worker-name}.{username}.workers.dev,但是 worders.dev 在国内已经被墙了,所以我们需要准备一个自己的域名。
假如我打 ...
Ubuntu 20.04 LTS 更新 Linux 内核版本
Ubuntu 20.04 LTS 内核默认版本是 5.4,如果需要升级到最新版本,可以按照以下步骤操作:
打开终端,查看当前 Linux 内核版本
显示系统主机名、内核版本号、CPU 类型等信息:
12uname -a // Linux emooa 5.15.0-87-generic #97~20.04.1-Ubuntu SMP Thu Oct 5 08:25:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
仅显示系统主机名:
123uname -n或者hostname
显示当前系统的内核版本 :
1uname -r // 5.15.0-87-generic
显示当前系统的硬件架构:
1uname -i // x86_64
更新软件源列表:
1sudo apt update
安装 Ubuntu 20.04 LTS 官方提供的 HWE 内核包:
1sudo apt install linux-generic-hwe-20.04
安装完毕后,重新启动电脑,可以通过 uname -r 来验证内核版本:
12sudo reboot
如果显示的 ...
三分钟搞懂 GeoJSON 是什么?
前言
GeoJSON(地理 JSON)是一种开放的标准数据格式,用于表示地理信息和地理特征的地理数据。它基于 JSON(JavaScript Object Notation)格式,旨在用于描述地理和空间信息,例如地图数据、地理特征、地理坐标等。GeoJSON 通常用于 Web 地图应用、地理信息系统(GIS)、地理空间数据的存储和交换,以及其他与地理位置相关的应用。
GeoJSON 的主要特点包括:
地理特征:GeoJSON 允许表示各种地理特征,如点(Point)、线(LineString)、多边形(Polygon)、多点(MultiPoint)、多线(MultiLineString)、多边形集合(MultiPolygon)、几何集合(GeometryCollection)、特征对象(Feature)、以及特征集合(FeatureCollection)等。这使得它适用于各种地理数据的表示。
地理坐标:GeoJSON 使用经度和纬度坐标来表示地理位置。这些坐标通常使用 WGS 84 坐标系,这是一种广泛使用的地理坐标系。在国际上,每个坐标系统都会被分配一个 EPSG 代码,EPS ...
Canvas 绘制 GeoJSON 缩略图
前言
通过上篇【Canvas 绘制 2D 图形】 我们知道了如何绘制简单的 Canvas,在需求场景中我们往往也需要在 Canvas 中绘制 GeoJSON (具体见 GeoJSON 是什么? )数据的缩略图。下面以中国地图为例,绘制一个地图缩略图。【在线预览】
GeoJSON几何类型包括:
Point // 点
MultiPoint // 多个点
LineString // 线
MultiLineString // 多条线
Polygon // 多边形
MultiPolygon // 多个多边形
FeatureCollection // 特征集合,主要是上面几种类型的集合,并且支持无限嵌套。
在本例子中我们需要用到这份数据 https://cdn.emooa.com/geojson/100000.json,集合类型为 MultiPolygon,部分数据如下:
123456789101112131415161718192021222324252627282930[ { "type": "MultiPolygon", ...