Redis唯一ID生成器的实现

Redis唯一ID生成器的实现

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生成器内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    AMD和NVIDIA之间的图形大战

    AMD和NVIDIA之间的图形大战,,图形卡作为计算机主机的重要组成部分,承担着图形输出和显示的任务。今天,在娱乐、视听享受的追求,显卡的地位将

    怎样设置id账号|id账户怎么设置

    怎样设置id账号|id账户怎么设置,,1. id账户怎么设置1.在iPhone主屏上找到“AppStore”图标,点击打开。2.打开AppStore应用商店以后,用手指向

    重置快捷键|idea重置快捷键

    重置快捷键|idea重置快捷键,,idea重置快捷键1、首先打开IDEA之后,点击任务栏的“File”。2、在下拉列表中中选择“Settings”3、在弹出的设

    overture快捷键|@override快捷键

    overture快捷键|@override快捷键,,1. @override快捷键答:CAD标注快捷键命令大全:1. 快速标注-QDIMCAD快速标注快捷键命令为:QDIM,主要用于从选

    德国ICT联想推IdeaPadU300s上标

    德国ICT联想推IdeaPadU300s上标,,2012 CeBIT展将在汉诺威举行,德国从3月6日到10日,在汉诺威,德国的CeBIT展会上,是最大的ICT(信息通信技术)在世

    如何免费注册appid

    如何免费注册appid,右下角,应用程序,如何免费注册appid1.打开Appstore2.任意点开一个免费应用程序,并点击下载。3.从弹出的对话框中,选择“