使用Redis生成全局唯一ID示例

全局ID生成器,一种在分布式系统下用来生成全局唯一ID的工具,一般满足一下要求特性

1.唯一性

2.高性能

3.安全性

4.递增性

5.高可用

复制代码
@Component
public class RedisIdWorker {
    /**
     * 定义一个开始的时间戳(秒级)
     * @param args
     */
    private static final long BEGIN_TIMESTAMP = 1640995200L;

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    public long nextId(String keyPrefix){
        //1.生成时间戳
        LocalDateTime now = LocalDateTime.now();
        long nowSecond = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp = nowSecond - BEGIN_TIMESTAMP;
        //2.生成序列号
        String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        long count = redisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);//这里不会有有空指针
        //3.拼接并返回
        return timestamp << 32 | count;

    }

    public static void main(String[] args) {
        //获取从1970年1月1日0时0分0秒开始到2013.3.28日时间的秒数
        LocalDateTime time = LocalDateTime.of(2013, 3, 28, 0, 0, 0);
        long second = time.toEpochSecond(ZoneOffset.UTC);
        System.out.println("second:"+second);
    }
}

测试

复制代码
 @Autowired
    private RedisIdWorker redisIdWorker;

    private ExecutorService es = Executors.newFixedThreadPool(500);

    @Test
    public void testIdWorker() throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(300);
        Runnable task = () -> {
            for (int i = 0; i < 100; i++) {
                long id = redisIdWorker.nextId("order");
                System.out.println("id = " + id);
            }
            latch.countDown();
        };
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 300; i++) {
            es.submit(task);
        }
        
        long end = System.currentTimeMillis();
        System.out.println("time = " + (end - begin));
    }
相关推荐
数据库学啊几秒前
供暖季技术实战:益和热力用 TDengine 时序数据库破解热力数据处理难题
数据库·时序数据库·tdengine
SEO_juper10 分钟前
搜索引擎索引权威指南:抓取、收录与排名的基础
数据库·搜索引擎·seo·数字营销
心随雨下15 分钟前
Tomcat日志配置与优化指南
java·服务器·tomcat
不剪发的Tony老师18 分钟前
SQLite 3.51.0发布,新功能解读
数据库·sqlite
Kapaseker21 分钟前
Java 25 中值得关注的新特性
java
wljt24 分钟前
Linux 常用命令速查手册(Java开发版)
java·linux·python
撩得Android一次心动27 分钟前
Android 四大组件——BroadcastReceiver(广播)
android·java·android 四大组件
努力学习的小廉28 分钟前
初识MYSQL —— 复合查询
android·数据库·mysql
canonical_entropy31 分钟前
Nop平台到底有什么独特之处,它能用在什么场景?
java·后端·领域驱动设计
chilavert31833 分钟前
技术演进中的开发沉思-174 java-EJB:分布式通信
java·分布式