golang 均匀散列id

        首先来模拟一种情况,我们要对一批id均匀分布到10个redis队列中,然后有10个服务分别消费对应的队列,首先你想到的是不是根据id取模,也就是id%10来作为队列的mod,比如queue_0、queue_1、queue_2,....那么这种情况是可行的。

        但是真实的情况可能是,queue_1的长度有1000个,但是queue_2的长度只有100个,那么是不是说明取模为1的id可能就是要多一些,取模为2的要少一些,因为这样的情况,导致的结果是:你启动了10个任务来消费10个队列,其中一个队列的处理压力特别大,而其他队列的数据特别少,程序是空闲的,问题来了,怎么避免这种情况,同时又能保证数据的顺序性呢?那么就需要用到我们的crc32算法。

        具体使用如下:

key := fmt.Sprintf("%d", id)
hash := crc32.ChecksumIEEE([]byte(key))
mod := int64(hash)%10

这样根据crc32均匀散列的结果就会均匀分布了,比如你用11,21,31,41这样按照传统取模的方式对10取模的话,都会在queue_1中去,但是使用了crc32算法再取模的结果是,他们会散列到不同队列中。

        有兴趣可以使用尝试一下

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值