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的两个命令(KEYS 和 SCAN)
Apr 12 Redis
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
详解Redis瘦身指南
May 26 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
redis中lua脚本使用教程
Nov 01 Redis
Redis基本数据类型Set常用操作命令
Jun 01 Redis
Redis全局ID生成器的实现
Jun 05 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
Redis实战之Lettuce的使用技巧详解
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
php文件上传简单实现方法
2015/01/24 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
python实现杨辉三角思路
2017/07/14 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
浅谈Python的list中的选取范围
2018/11/12 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
Python中函数参数匹配模型详解
2019/06/09 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
军训自我鉴定
2014/01/22 职场文书
励志演讲稿800字
2014/08/21 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python