Redis生成全局唯一ID的实现方法
有时为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其他信息
ID组成部分:
符号位:1bit,永远为0 时间戳:31bit,以秒为单位,可以使用69年 序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID ID生成类: package com.example.util;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
/**
* @Author DaBai
* @Date 2022/3/17 下午 09:25
* @Version 1.0
*/
@Component
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 nowScond = now.toEpochSecond(ZoneOffset.UTC);
long timestamp = nowScond BEGIN_TIMESTAMP;
//2、生成序列号
// 2.1 获取当前日期,精确到天
String date = now.format(DateTimeFormatter.ofPattern( yyyy:MM:dd ));
long count = stringRedisTemplate.opsForValue().increment( icr + keyPrefix + : + date);
//3、拼接字符串
// 时间戳左移32位,然后 或 序列号,有1为1
long ids = timestamp COUNT_BITS | count;
return ids;
}
RedisIDWorker redisIDWorker;
private ExecutorService es = Executors.newFixedThreadPool(500);
@Test
public void ShowID() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(300);
Runnable task = () - {
for (int i = 0; i 100; i++) {
long id = redisIDWorker.nextID( order );
System.out.println( id = + id);
}
countDownLatch.countDown();
};
long startTime = System.currentTimeMillis();
for (int i = 0; i 300; i++) {
es.submit(task);
}
countDownLatch.await();
long end = System.currentTimeMillis();
System.out.println( time = + (end startTime));
}
到此这篇关于Redis生成全局唯一ID的实现方法的文章就介绍到这了,更多相关Redis生成全局唯一ID内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 Redis生成全局唯一ID的实现方法
相关文章
- Redis缓存更新机制:提升数据访问效率的必要步骤(redis缓存更新机制)
- 让网站运行更快新型内存数据库Redis之外的选择(比redis更快的)
- 红包雨用Redis实现的抽奖系统(抽奖系统用redis)
- 互联网应用加快发展Redis技术给力(互联网应用使用redis)
- 优化Redis操作,提升效率(一次redis操作耗时)
- 实现更快捷的系统运行采用全局Redis缓存(全局redis缓存)
- Redis槽深入理解分布式存储的新方法(什么是redis槽)
- 数据实现多个Redis之间共享数据的可行方案(多个redis共享)
- 红色卓越高效利用Redis缓存服务(redis高性能缓存服务)
- 实现高并发性能Redis缓存设计(redis高并发缓存设计)
- 红色丝绸之路实现Redis集群间数据同步(redis集群同步数据)
- 简单实现Redis集群主从切换(redis集群 主从切换)
- Redis集群部署借助常用命令实现高性能(redis集群中常用命令)
- Redis实现超卖预防成功案例(redis防止超卖实例)
- 利用Redis队列实现遍历操作(redis队列遍历)
- Redis队列实现原子性操作(redis 队列 原子)
- Web端Redis工具操作简易,畅享快速体验(web redis 工具)
- Redis实现密码加密配置保障信息安全(redis配置密码加密)
- 利用Redis进行远程调用的探索(redis 远程调用)