高并发场景下快速生成连续编号一种方法

一、使用场景介绍

      分布式系统架构,在业务高并发场景下,如何快速生成连续的会员号,我们系统使用的是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值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值