Redis唯一ID生成器的实现


Posted in Redis onJuly 07, 2022

ID的组成部分:

  • 符号位:1bit,永远为0
  • 时间戳:31bit,以秒为单位,可以使用69年
  • 序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID

生成代码:

public class RedisIdWorker {

    /**
     * 开始时间戳
     */
    private static final long BEGIN_TIMESTAMP = 1640995200L;
    /**
     * 序列号的位数
     */
    private static final int COUNT_BITS = 32;

    private StringRedisTemplate stringRedisTemplate;
        //构造方法形式注入
    public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    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("yyyy:MM:dd"));
        long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
        //3.拼接并返回

        return timestamp << COUNT_BITS | count;
    }
}

PS:Redis实现全局唯一id生成

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;

/**
 * 描述:
 * 唯一ID生成器
 * @author jimmy
 * @create 2020-11-06 16:06
 */
@Component
public class GenerateIDUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 生成每天的初始Id
     * @param key
     * @return
     */  public String initPrimaryId(String key) {
        Assert.hasLength(key, "hashName不能为空");
        String hashCol = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        //自定义编号规则
        String hashColVal = hashCol + "00001";
//        redisTemplate.opsForHash().putIfAbsent(hashName, hashCol, hashColVal);

        Long expiresTime = getSecondsNextEarlyMorning();
        redisTemplate.opsForValue().set(key, Long.valueOf(hashColVal), expiresTime, TimeUnit.SECONDS);
        return hashColVal;
    }


    /**
     * 获取分布式Id     
     * @param key
     * @return
     */
    public String getPrimaryId(String key) {

        String id = "";
        if(redisTemplate.hasKey(key)){
            // redisTemplate.opsForValue().get(key);
            // redisTemplate.delete(key);
            id = String.valueOf(redisTemplate.opsForValue().increment(key, 1));
        } else {
            id = initPrimaryId(key);
        }
        return id;
    }


    /**
     * 判断当前时间距离第二天凌晨的秒数
     * @return 返回值单位为[s:秒]
     */
    public Long getSecondsNextEarlyMorning() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
    }
}

到此这篇关于Redis唯一ID生成器的实现的文章就介绍到这了,更多相关Redis唯一ID生成器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis连接被拒绝的解决方案
Apr 12 Redis
浅谈Redis在直播场景的实践方案
Apr 27 Redis
浅谈Redis的几个过期策略
May 27 Redis
详解Redis集群搭建的三种方式
May 31 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
redis缓存存储Session原理机制
Nov 20 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
Redis基本数据类型Set常用操作命令
Jun 01 Redis
Redis配置外网可访问(redis远程连接不上)的方法
Dec 24 Redis
Redis+AOP+自定义注解实现限流
Jun 28 #Redis
利用Redis实现点赞功能的示例代码
Jun 28 #Redis
一文教你快速生成MySQL数据库关系图
Jun 28 #Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 #Redis
浅谈Redis变慢的原因及排查方法
使用Redis实现分布式锁的方法
Jun 16 #Redis
关于Redis的主从复制及哨兵问题
Jun 16 #Redis
You might like
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP文件读写操作相关函数总结
2014/11/18 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
JS基础之undefined与null的区别分析
2011/08/08 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
requests和lxml实现爬虫的方法
2017/06/11 Python
python生成ppt的方法
2018/06/07 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
python实现动态创建类的方法分析
2019/06/25 Python
美国最大点评网站:Yelp
2018/02/14 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
探亲邀请信范文
2014/01/30 职场文书
雾霾停课通知
2015/04/24 职场文书
工作时间调整通知
2015/04/24 职场文书
教师见习总结范文
2015/06/23 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python