96SEO 2026-02-19 19:17 13
三、基于Redis实现分布式ID四、雪花算法1、雪花算法介绍2、

550e8400-e29b-41d4-a716-446655440000。
UUID作为MySQL主键会导致索引页分页插入慢长度太长导致每个索引页存放的索引变少索引效率降低
利用给字段设置auto_increment_increment和auto_increment_offset来保证ID自增每次业务使用下列SQL读写MySQL得到ID号作为业务的唯一ID
非常简单利用现有数据库系统的功能实现成本小ID单调递增可以实现一些对ID有特殊要求的业务
强依赖DB当DB异常时整个系统不可使用属于致命问题。
应该配置主从复制以尽可能增加可用性但是主从切换时可能会导致重复发号ID发号性能瓶颈限制在单台MySQL的读写性能
在分布式系统中我们可以多部署几台机器每台机器设置不同的初始值且步长和机器数相等
比如有两台机器。
设置步长step为2TicketServer1的初始值为11357911…、TicketServer2的初始值为2246810…
假设我们要部署N台机器步长需设置为N每台的初始值依次为0,1,2…N-1那么整个架构就变成了如下图所示
系统水平扩展比较困难比如定义好了步长和机器台数之后如果要添加机器该怎么
做假设现在只有一台机器发号是1,2,3,4,5步长是1这个时候需要扩容机器一台。
可
以这样做把第二台机器的初始值设置得比第一台超过很多比如14假设在扩容时间之
内第一台不可能发到14同时设置步长为2那么这台机器下发的号码都是14以后的偶
数。
然后摘掉第一台把ID值保留为奇数比如7然后修改第一台的步长为2。
让它符合
我们定义的号段标准对于这个例子来说就是让第一台以后只能产生奇数。
扩容方案看起来
复杂吗貌似还好现在想象一下如果我们线上有100台机器这个时候要扩容该怎么做
ID没有了单调递增的特性只能趋势递增这个缺点对于一般业务需求不是很重要可以容忍
数据库压力还是很大每次获取ID都得读写一次数据库只能靠堆机器来提高性能
原方案每次获取ID都得读写一次数据库造成数据库压力大改为利用批量获取每次获取一个segment(step决定大小)号段的值。
用完之后再去数据库获取新的号段可以大大的减轻数据库的压力各个业务不同的发号需求用biz_tag字段来区分每个biz-tag的ID获取相互隔离互不影响。
如果以后有性能需求需要对数据库扩容不需要上述描述的复杂的扩容操作只需要对biz_tag分库分表就行。
biz_tag用来区分业务max_id表示该biz_tag目前所被分配的ID号段的最大值step表示每次分配的号段长度。
原来获取ID每次都需要写数据库现在只需要把step设置得足够大比如1000。
那么只有当1000个号被消耗完了之后才会去重新读写一次数据库。
读写数据库的频率从1减小到了1/step
Leaf服务可以很方便的进行线程扩展性能完全能够支撑大多数业务场景容灾性高Leaf服务内部有号段缓存即使DB宕机短时间内Leaf仍能正常对外提供服务可以自定义max_id的大小非常方便业务从原有的ID方式上迁移过来
ID号码不够随机能够泄露发号数量的信息不太安全TP999数据波动大当一个号段的ID使用完全后leaf服务去mysql取号段在此过程中应用服务如果有很大的并发过来就会导致没有ID进行分配从而导致响应时间变长出现尖刺DB宕机的话整个系统不可使用
对于第二个缺点响应存在峰值Leaf-segment做了一些优化简单的说就是
取号段的时机是在号段消耗完的时候进行的也就意味着号段临界点的ID下发时间取决于下一次从DB取回号段的时间并且在这期间进来的请求也会因为DB号段没有取回来导致线程阻塞。
如果请求DB的网络和DB的性能稳定这种情况对系统的影响是不大的但是假如取DB的时候网络发生抖动或者DB发生慢查询就会导致整个系统的响应时间变慢。
为此我们希望DB取号段的过程能够做到无阻塞不需要在DB取号段的时候阻塞请求线程即当号段消费到某个点时就异步的把下一个号段加载到内存中。
而不需要等到号段用尽的时候才去更新号段。
这样做就可以很大程度上的降低系统的TP999指标。
采用双buffer的方式Leaf服务内部有两个号段缓存区segment。
当前号段已下发10%时如果下一个号段未更新则另启一个更新线程去更新下一个号段。
当前号段全部下发完后如果下个号段准备好了则切换到下个号段为当前segment接着下发循环往复
每个biz-tag都有消费速度监控通常推荐segment长度设置为服务高峰期发号QPS的600倍10分钟这样即使DB宕机Leaf仍能持续发号10-20分钟不受影响
对于第三点“DB可用性”问题我们目前采用一主两从的方式同时分机房部署Master和Slave之间采用半同步方式同步数据
Snowflake雪花算法是由Twitter开源的分布式ID生成算法以划分命名空间的方式将64-bit位分割成多个部分每个部分代表不同的含义。
而
第1位占用1bit第一位为符号位不使用。
第1部分41位的时间戳41-bit位可表示2^41个数每个数代表毫秒那么雪花算法可
用的时间年限是(2^41)/(1000606024365)69
1024台机器通常不会部署这么多台机器。
也可以划分为多个比如前5位可以作为机房ID
0-31个机房后5位作为每个机房的机器ID第3部分12-bit位是自增序列可表示2^12
41位时间戳是固定的时间戳转二进制的长度是41位后面两个部分都可以灵活调正只要注意后面位运算的位数就行
结合雪花算法生产环境架构当客户端段捕获到时钟回拨异常后由客户端进行重试
直接将出问题的机器下线然后发送短信告诉运维人员这台机器出现问题
Leaf-snowflake方案完全沿用snowflake方案的bit位设计即“1411012”的方式组装ID号。
对于workerID的分配当服务集群数量较小的情况下完全可以手动配置。
Leaf服务规模较大动手配置成本太高。
所以使用Zookeeper持久顺序节点的特性自动对snowflake节点配置wokerID。
启动Leaf-snowflake服务连接Zookeeper在leaf_forever父节点下检查自己是否已经注册过是否有该顺序子节点。
如果有注册过直接取回自己的workerIDzk顺序节点生成的int类型ID号启动服务。
如果没有注册过就在该父节点下面创建一个持久顺序节点创建成功后取回顺序号当做自己的workerID号启动服务
因为这种方案依赖时间如果机器的时钟发生了回拨那么就会有可能生成重复的ID号需要解决时钟回退的问题。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback