雪花算法是如何运作并具体实施的?
- 内容介绍
- 相关推荐
本文共计600个文字,预计阅读时间需要3分钟。
%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95%E7%9A%84%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E7%8E%B0%E7%AE%80%E4%BB%8B
%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95%EF%BC%88SnowFlake%EF%BC%89%E6%98%AFTwitter%E5%BC%80%E6%BA%90%E7%9A%84%E4%B8%80%E7%A7%8D%E7%94%A8%E4%BA%8E%E5%88%86%E5%B8%83%E5%BC%8F%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%94%9F%E6%88%90%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80ID%E7%9A%84%E7%AE%97%E6%B3%95%E3%80%82%E5%9B%9E%E5%BA%94%E4%BA%86%E6%BB%A1%E8%B6%B3%E5%B7%A5%E4%B8%9A%E7%BA%A7%E8%A6%81%E6%B1%82%E7%9A%84Scala%E5%AE%9E%E7%8E%B0%E3%80%82%E9%A1%B9%E7%9B%AE%E5%B7%B2%E7%BB%8F%E4%B8%8D%E5%86%8D%E6%9B%B4%E6%96%B0。
雪花算法的原理与实现 简介雪花算法(SnowFlake)是Twitter开源的一种用于在分布式环境下生成全局唯一ID的算法。并且提供了该算法的满足工业级要求的Scala实现,该项目已经不再更新,官方宣称是因为该实现高度依赖Twitter内部的网络基础设施,所以不具备普适性。
原理雪花算法是将一个64位的整数分成三个部分:
- 41个比特位表示生成ID时的时间戳(精确到毫秒),所以理论上可以使用69年。
- 10个比特位表示当前机器的编号,所以理论上可以支持1024台机器。
- 12个比特位表示当前时间戳下已生成的雪花ID数量,所以理论上一毫秒内可以产生4096个不同的ID。
因为在有些语言中最高位是符号位,所以不用。
在实际使用中,可以根据实际情况来对64个比特位进行划分,比如:集群中的机器数量超过1024台,那么可以给机器多分配一个比特位。
优缺点先说说优点:
- 一毫秒内可以生成4096个ID,可以用69年, 可用性非常高。
- 因为在分布式集群中使用机器编号来作区分,所以不会重复。
- 时间戳是递增的,机器编号也是递增的,序列号也是递增的,所以ID的整体趋势是递增的,又因为不重复,所以ID可以作为数据库索引来提高查询效率。
它的优点很明显,缺点也同样明显:
- ID和时钟是强绑定的,一旦时间出现回退,就会出现重复的ID。
算法的实现,我放在了我的GitHub仓库中:github.com/funtrin/toys
本文共计600个文字,预计阅读时间需要3分钟。
%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95%E7%9A%84%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E7%8E%B0%E7%AE%80%E4%BB%8B
%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95%EF%BC%88SnowFlake%EF%BC%89%E6%98%AFTwitter%E5%BC%80%E6%BA%90%E7%9A%84%E4%B8%80%E7%A7%8D%E7%94%A8%E4%BA%8E%E5%88%86%E5%B8%83%E5%BC%8F%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%94%9F%E6%88%90%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80ID%E7%9A%84%E7%AE%97%E6%B3%95%E3%80%82%E5%9B%9E%E5%BA%94%E4%BA%86%E6%BB%A1%E8%B6%B3%E5%B7%A5%E4%B8%9A%E7%BA%A7%E8%A6%81%E6%B1%82%E7%9A%84Scala%E5%AE%9E%E7%8E%B0%E3%80%82%E9%A1%B9%E7%9B%AE%E5%B7%B2%E7%BB%8F%E4%B8%8D%E5%86%8D%E6%9B%B4%E6%96%B0。
雪花算法的原理与实现 简介雪花算法(SnowFlake)是Twitter开源的一种用于在分布式环境下生成全局唯一ID的算法。并且提供了该算法的满足工业级要求的Scala实现,该项目已经不再更新,官方宣称是因为该实现高度依赖Twitter内部的网络基础设施,所以不具备普适性。
原理雪花算法是将一个64位的整数分成三个部分:
- 41个比特位表示生成ID时的时间戳(精确到毫秒),所以理论上可以使用69年。
- 10个比特位表示当前机器的编号,所以理论上可以支持1024台机器。
- 12个比特位表示当前时间戳下已生成的雪花ID数量,所以理论上一毫秒内可以产生4096个不同的ID。
因为在有些语言中最高位是符号位,所以不用。
在实际使用中,可以根据实际情况来对64个比特位进行划分,比如:集群中的机器数量超过1024台,那么可以给机器多分配一个比特位。
优缺点先说说优点:
- 一毫秒内可以生成4096个ID,可以用69年, 可用性非常高。
- 因为在分布式集群中使用机器编号来作区分,所以不会重复。
- 时间戳是递增的,机器编号也是递增的,序列号也是递增的,所以ID的整体趋势是递增的,又因为不重复,所以ID可以作为数据库索引来提高查询效率。
它的优点很明显,缺点也同样明显:
- ID和时钟是强绑定的,一旦时间出现回退,就会出现重复的ID。
算法的实现,我放在了我的GitHub仓库中:github.com/funtrin/toys

