一、使用场景介绍
分布式系统架构,在业务高并发场景下,如何快速生成连续的会员号,我们系统使用的是mysql+redis的实现方案。
目标:
- 全局唯一,生成编号连续
- 支持高并发
- 高可靠,容错单点故障
适用业务场景:连续会员编号生成。
二、实现流程
三、功能点介绍
1、mysql表结构设计:
seq_num | 序列号 | bigint unsigned |
updated_time | 更新时间 | timestamp |
2、Redis 的hash结构:
- key:"mysql:custnum:sequence“
- field:
->position:指向当前可用的sequence值
->limit:当前段中最大的sequence值
通过区间:[position,limit) 确定一段可用的sequence。
3、lua脚本
local existsValue = redis.call('EXISTS',KEYS[1]);
if existsValue <1
then
return 'NOTEXISTS';
end
local newPosition = redis.call('HINCRBY',KEYS[1],'position',1);
local limit = redis.call('HGET',KEYS[1],'limit');
if newPosition >= tonumber(limit)
then
return 'OUTOFLIMIT';
end
return newPosition;
-
优化及建议
目前系统中获取sequence只在一台redis获取,没有分散压力,获取连续编号单台redis压测达1w+tps,已经满足业务需求,如果业务上有更高要求,可以从多组redis获取sequence值。