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 查看所有的key方式
May 07 Redis
redis 限制内存使用大小的实现
May 08 Redis
Redis延迟队列和分布式延迟队列的简答实现
May 13 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
比较几种Redis集群方案
Jun 21 Redis
Redis缓存-序列化对象存储乱码问题的解决
Jun 21 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
Redis入门基础常用操作命令整理
Jun 01 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
python sort、sorted高级排序技巧
2014/11/21 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
python添加模块搜索路径方法
2017/09/11 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
劲霸男装广告词改编版
2014/03/21 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
买房协议书范本
2014/10/23 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
客房服务员岗位职责
2015/02/09 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL