全局ID生成器(应对分布式情况)

       📝个人主页:五敷有你      
 🔥系列专栏:SpringBoot

⛺️稳中求进,晒太阳

每个店铺都可以发布优惠卷

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

1.id的规律性太明显

2.受单表数据量的限制

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

  1. 高可用
  2. 唯一性
  3. 高性能
  4. 递增
  5. 安全性

为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其他信息:

ID组成部分:

符号位:1bit

时间戳:31bit,以秒为单位,可以用69年

序列号:秒内的计数器,支持每秒生成2^32个不同ID

关键代码:

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;

@Component
public class RedisIdWorker {

    private static final long BEGIN_TIMESTAMP=1640995200L;
    private static final int COUNT_BITS=32;


    StringRedisTemplate stringRedisTemplate;

    public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    /**
     * 这是一个全局ID
     * @param keyPrefix
     * @return
     */
    public long nextId(String keyPrefix){

        //1.生成时间戳
        LocalDateTime now=LocalDateTime.now();
        Long nowSecond=now.toEpochSecond(ZoneOffset.UTC);
        long timestamp=nowSecond-BEGIN_TIMESTAMP;

        //2.生成序列号

        //获取当天日期,精确到天
        String date=now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        //自增长
        long count=stringRedisTemplate.opsForValue().increment("icr:"+keyPrefix+":"+date);
        //3.拼接并返回

        /**
         * 或运算 有1为1 无1为0
         */
        return  timestamp<<COUNT_BITS | count;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五敷有你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值