java使用的id的几种方式

1.UUID

  • 全局唯一
  • 高性能,高可用低延时,生成要快
  • 好接入,接入要简单,拿来即用
  • 趋势递增
public static void main(String[] args) {
    String uuid = UUID.randomUUID().toString().replaceAll("-","");
    System.out.println(uuid);
}

结果如下:d7e0f5f82e484c5a890d4a657ecfaa1f,字符长度为36个字符,若去掉-则为32个字符,没有任何意义。生成简单快速,但查询性能不好。

2.mysql自增ID

当我们需要一个ID的时候,向表中插入一条记录返回主键ID,但这种方式有一个比较致命的缺点,访问量激增时MySQL本身就是系统的瓶颈,无法保证并发请求。

3.Redis 操作是单线程的,因此我们可以利用redis的incr命令实现ID的原子性自增。并且可以解决并发的场景。

package com.othp.core.util;

import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;

/** 
*主键生成服务类
*/
@Slf4j
public class PrimaryKeyService {
    
    /**
     * redis服务类
     */
    @Autowired
    private RedisService redisService;

    private static final String UUID_PRE ="uuid_";
    
    /**
     * 
    * 获取主键ID(yyyymmdd(8位日期)+9位数值)
    * 
    * @return 主键ID
     */
    public String getUuid() {
        Long keyValue = null;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        String dateStr = DateUtil.convertCalendarToString(calendar, DateUtil.YMD_PATTERN);
        StringBuffer keyBuffer = new StringBuffer();
        keyBuffer.append(PrimaryKeyService.UUID_PRE);
        keyBuffer.append(dateStr);
        String uuidKey = keyBuffer.toString();
        if(!redisService.exists(uuidKey)) {
            keyValue = redisService.incr(uuidKey, 1L);
            redisService.setExpires(uuidKey, 172800, TimeUnit.SECONDS); 
        }else {
            keyValue = redisService.incr(uuidKey, 1L);
        }
        String uuid=dateStr+String.format("%1$09d", keyValue);
        log.debug("------------uuid-----------:"+uuid);
        return uuid;
    }
}

4.雪花算法snowflake 生成全局id,本地生成,没有网络开销,效率高

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值