Reids实战——优惠券秒杀(全局唯一ID生成策略)
创始人
2024-02-26 19:24:39
0

1 全局唯一ID生成策略

每个店铺都可以发布优惠券:

当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: 

1. id的规律性太明显

2. 会受单表数据量的限制

全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:

唯一、高可用、高性能、递增性、安全性

 这就相当对应了我们Redis中String类型的方法,

第一:高可用、高性能,这是毋庸置疑的,毕竟是基于Redis的

第二:递增性

第三:安全性

对于安全性:我们可以不直接使用Redis自增的数值,而是拼接一些其它信息:

符号位:1位

时间戳:31位,可以使用69年

序列号:32位,使用INCRBY生成,秒内的计数器,支持每秒2^32个不同的id

 实现方法如下:

1.获取时间戳

获取时间戳可以通过当前时间戳减去2022年1月1号的时间戳,获取时间戳的方法可以使用toEpochSecond方法转化为秒数。

2.获取序列号

获取序列号,因为为了不然redis中保存的key都为同一个,我们在key的后面加上了当前时间(今天),而且此做法还可以方便统计这一天生成的订单数

然后就是通过Redis中的INCREBY方法生成序列号。

3.拼接

拼接就比较讲究了,虽然可以直接使用加号等字符串拼接方法进行进行拼接,但是最后拼接出来的只能是字符串

要想最后获得一个Long类型的ID,我们可以这样做:

首先分析一下这个id的组成:

第一位为符号位,然后就是31的时间戳,然后就是序号。

我们可以这么做,先把时间戳左移32位,这样后32位就只能是序列号。然后通过 |(或)来进行拼接序列号。(涉及位运算知识,计算机组成原理)

这里注意:使用 | 或的原因是最开始都是序列号上都是00000,不管你序列号来的是0还是1,

0 | (或)0还是0,0|(或)1也还是1,所以使用|(或)

实现代码如下:

package com.hmdp.utils;import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;/*** @Author 华子* @Date 2022/11/28 19:54* @Version 1.0*/
@Component
public class RedisIdWorker {@Resourceprivate StringRedisTemplate stringRedisTemplate;//开始时间private static final Long BEGIN_TIMESTAMP = 1640995200L;private static final int COUNT_BITS = 32;public long nextId(String keyPrefix){
//        1.获取时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;
//        2.获取序列号//2.1获取当前时间String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));//2.2生成序列号long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
//        3.拼接并返回return timestamp << COUNT_BITS | count;}}

这样就可以生成全局唯一ID啦~

相关内容

热门资讯

女子醉驾找人“摆平”被骗7万后... 因醉酒驾驶轻信他人“可摆平”的谎言被骗,女子葛某乙不堪压力自杀身亡。在实施诈骗的苏某被判刑并赔偿后,...
2026年,山西将实现政策范围... 近日,省医保局发布消息,我省通过提高保障水平、优化经办服务,切实减轻参保职工生育医疗负担,2025年...
原创 上... 上海之后,广州也出台18条政策,将大力扶持游戏电竞行业,继上海率先加码电竞产业扶持之后,广州的跟进并...
服务成渝发展 北京市竞天公诚(... 12月19日,“国际视野 渝见未来——竞天公诚重庆分所开业庆典暨2025西南新格局企业创新发展研讨会...
小崔律师的自媒体之路:从单打独... 临近年底,小崔律师参与了很多交流活动,大家对我的自媒体获客途径比较感兴趣,都鼓励我能够写一篇文章系统...
数字政通中标:贵州省司法厅执法... 证券之星消息,根据天眼查APP-财产线索数据整理,根据贵州大数据产业集团有限公司12月18日发布的《...
知名短剧女演员承认对助理动手并... 近日,知名短剧女演员被曝和助理发生肢体冲突,双方冲突录音曝光。两人疑因工资结算起争执。 12月21日...
突发政策利好,资金涌入这个赛道... L3级自动驾驶车型获得准入,南向资金涌入自动驾驶板块,均胜电子、赛力斯、曹操出行、佑驾创新等获大幅加...
靠谱又性价比高的离婚律师推荐:... 在离婚纠纷日益复杂的当下,寻找一位靠谱且性价比高的离婚律师至关重要。离婚案件不仅涉及情感纠葛,更关乎...
海南封关免税黄金与热带鲜果成游... 封面新闻记者 杨芮雯 12月18日,海南正式封关运作,“一线放开、二线管住”的政策红利全面释放,游客...