雪花算法lua脚本
by tong
动态分配-Redis
实现
通过 redis 去获取 workId 和 datacenterId

具体 Lua 脚本逻辑如下:

- 第一个服务节点在获取时,Redis 可能是没有 snowflake_work_id_key 这个 Hash 的,应该先判断 Hash 是否存在,不存在初始化 Hash,dataCenterId、workerId 初始化为 0
- 如果 Hash 已存在,判断 dataCenterId、workerId 是否等于最大值 31,满足条件初始化 dataCenterId、workerId 设置为 0 返回
- dataCenterId 和 workerId 的排列组合一共是 1024,在进行分配时,先分配 workerId
- 判断 workerId 是否 != 31,条件成立对 workerId 自增,并返回;如果 workerId = 31,自增 dataCenterId 并将 workerId 设置为 0
dataCenterId、workerId 是一直向下推进的,总体形成一个环状。通过 Lua 脚本的原子性,保证 1024 节点下的雪花算法生成不重复。如果标识位等于 1024,则从头开始继续循环推进

问题
虽然 redis 一般也不会有问题,但是会出现抖动等情况,有一定的风险
back
home
tags: 分布式 - ID - 编程