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 14 Redis
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
Redis分布式锁Redlock的实现
Aug 07 Redis
Redisson实现Redis分布式锁的几种方式
Aug 07 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
Window server中安装Redis的超详细教程
Nov 17 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
在Centos 8.0中安装Redis服务器的教程详解
Mar 21 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
DOM相关内容速查手册
2007/02/07 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
用Django写天气预报查询网站
2018/10/21 Python
python实现二维插值的三维显示
2018/12/17 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
python for循环remove同一个list过程解析
2019/08/14 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
体育学院毕业生自荐信
2013/11/03 职场文书
高中运动会入场词
2014/02/14 职场文书
运动会演讲稿300字
2014/08/25 职场文书
创业计划书之美甲店
2019/09/20 职场文书
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
Java死锁的排查
2022/05/11 Java/Android