pg- snowflake: 生成 Snowflake ID 标准与可选集群编号相容的 ids
展览 snowflake_gen() 函数生成 雪花标识
标准 兼容 ids (与
可自定义位数,见下文:
# Snowflake ID compatible (each letter is 1 bit):
0tttttttttttttttttttttttttttttttttt | CCCCC | iiiiiiiiii | ssssssssssssss
^ ^ ^ ^
35 5 10 14 bits
这里,
- "t"表示时间戳的位数,即当前Unix时间在
毫秒减去数值
CONST_SNOWFLAKE_TS_STARTpsql 变量 。 仅CONST_SNOWFLAKE_TS_BITS最高额 使用时间戳的位数. - "C"表示"集群号". 若为
CONST_SNOWFLAKE_CLUSTER_NO_BITS是0,则 此字段不存在,整个最左边的区域用于 时间戳. - "一"是"没有"的"岛"aka"雪花机器ID", 必须是独一无二的 在所有 在同一集群内的主节点.
- "s"是"序列数位".
您可以自定义您的位字段的长度 pg-snowflake.config.sql
文档,见下文.
也可以将自定义参数传递给 snowflake_gen() 函数本身.
库一般安装在计划中 public 在每个 PostgreSQL 节点上.
安装
第一,复制副本 pg-snowflake.config.sql.example 改为 pg-snowflake.config.sql 内
应用程序和可选更新的根 CONST_* 根据你的需求.
\set CONST_SNOWFLAKE_TS_START 1475796139634
\set CONST_SNOWFLAKE_TS_BITS 35
\set CONST_SNOWFLAKE_CLUSTER_NO_BITS 5
\set CONST_SNOWFLAKE_ISLAND_NO_BITS 10
\set CONST_SNOWFLAKE_SEQ_BITS 14
然后用 psql 控制台运行 :
-- The library is typically installed in schema "public".
SET search_path TO public;
-- Optional: if you don't want to pass PG_SNOWFLAKE_CLUSTER_NO environment
-- variable, create this configuration function manually.
--CREATE OR REPLACE FUNCTION snowflake_cluster_no() RETURNS integer LANGUAGE sql
-- SET search_path FROM CURRENT AS 'SELECT 1';
-- Optional: if you don't want to pass PG_SNOWFLAKE_ISLAND_NO environment
-- variable, create this configuration function manually.
--CREATE OR REPLACE FUNCTION snowflake_island_no() RETURNS integer LANGUAGE sql
-- SET search_path FROM CURRENT AS 'SELECT 1';
-- Install the library to the current schema.
\ir .../pg-snowflake-up.sql
这个 pg-snowflake-up.sql 安装脚本将搜索
pg-snowflake.config.sql 父文件夹中的文件( 如果文件失败 )
未找到).
默认情况下,集群编号读取自 PG_SNOWFLAKE_CLUSTER_NO 外壳掩体
变量。 这样,你可以指定它 例如1用于发展, 2用于中转,
3 用于生产环境(或3,4,5.)
不同AWS区域。 如果你出于某种原因不想要这种行为
定义 snowflake_cluster_no() 函数.
这同样适用于 PG_SNOWFLAKE_ISLAND_NO 财务报告和审定财务报表 snowflake_island_no()
函数.
snowflake gen([seq name regclass][,ts start bigint][,ts bits][,集群 no bits][,岛屿 no bits][,seq bits]) [,seq bits]] (中文(简体) )
生成 a 雪花识别标准 兼容的标识.
seq_name: 默认情况下,函数使用snowflake_seq要避免的顺序 在毫秒内(或在秒内)相撞,但也可以通过自己的碰撞 序列名称.ts_start:可选的时代开始时间戳以毫秒为单位. 默认为CONST_SNOWFLAKE_TS_START(参见pg-snowflake.config.sql.example.).ts_bits:时间戳部分的可选位数. 默认为CONST_SNOWFLAKE_TS_BITS。 。 。 .cluster_no_bits:集群编号部分的可选位数. 默认为CONST_SNOWFLAKE_CLUSTER_NO_BITS。 。 。 .island_no_bits:岛号部分的可选位数. 默认 改为CONST_SNOWFLAKE_ISLAND_NO_BITS。 。 。 .seq_bits:序列部分的可选位数. 默认为CONST_SNOWFLAKE_SEQ_BITS。 。 。 .
默认格式是 t35-C5-i10-s14。要自定义,请使用命名的 PostgreSQL
参数语法,例如:
SELECT snowflake_gen(ts_bits:=30, cluster_no_bits:=10, island_no_bits:=10);
此函数的好处是,您可以通过 ID 命令获取大致 以时间戳为基础的顺序,甚至跨越微硬/节点. 它还在 (原始内容存档于2018-10-21). bigint id experient. 缺点是 ID 不容易解析 只是人类的眼睛,因为它是位数基(不是以小数位数为基数).
生成的 id 示例 :
4705186322862407685