您的位置:首页 > 娱乐 > 八卦 > 基于Redis实现全局唯一id

基于Redis实现全局唯一id

2024/10/5 19:13:57 来源:https://blog.csdn.net/ppp666777/article/details/140878122  浏览:    关键词:基于Redis实现全局唯一id

业务需求 

全局id生成器需要满足一下特点

 高可用,唯一性,高性能,递增性,安全性

id的组成分为三部分:符号位,时间戳,序列号。 

如何将这三部分合在一起作为long返回呢?答案是使用位运算,我们可以这样想,将时间戳 左移32位,低位都补0正好空出了序列号的位置,将序列号位置与自增长count进行与运算就可。

@Component
public class RedisIdWorker {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 开始时间戳*/private static final long BEGIN_TIMESTAMP = 1704067200L;/*** 序列号位数* @param prefix* @return*/private static final long COUNT_BITS = 32L;public long nextId(String prefix) {//生成时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;//生成序列数//获取当前日期,精确到天String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));//自增长Long count = redisTemplate.opsForValue().increment("icr" + prefix + ":" + date);//拼接返回return timestamp << COUNT_BITS | count;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com