6行代码实现一个 id 发号器
- - 唐福林-博客雨id 发号器的问题, @一乐 的这篇文章说的很透彻了: http://weibo.com/p/1001603800404851831206 但参考实现就显得有些复杂. 最近在雪球工作中正好需要用到发号器,于是用 Lua 在 Redis 上实现了一个最简单的:. id 总长度 52bit,为了兼容 js,php,flex 等语言 long 类型最长只能 52 bit.
id 发号器的问题, @一乐 的这篇文章说的很透彻了: http://weibo.com/p/1001603800404851831206 但参考实现就显得有些复杂。最近在雪球工作中正好需要用到发号器,于是用 Lua 在 Redis 上实现了一个最简单的:
-- usage: redis-cli -h 10.10.201.100 -p 10401 EVAL "$(cat getID.lua)" 1 XID:01:02
local arg = KEYS[1]
-- project id must has 2 digits, 01 - 15
local pid = tonumber(string.sub(arg, 5, 6))
-- instance id must has 2 digits, 01 - 15
local iid = tonumber(string.sub(arg, 8, 9))
local idnum = redis.call("INCR", "ID_IDX") % 65536
local sec = redis.call("TIME")[1] - 1420041600
return sec*16777216 + pid*1048576 + iid*65536 + idnum
解释:
id 发号器说简单也确实挺简单。任何一个技术点,只要理解了本质,大约都是这么简单罢。