글로벌 ID 생성기는 분산 시스템에서 전역적으로 고유한 ID를 생성하는 데 사용되는 도구입니다.
고유성: ID가 고유하고 반복 불가능한지 확인하세요.
증분성: 확인하세요. 전체적으로 점차 증가하고 있으며 이는 데이터베이스 인덱스 생성에 도움이 됩니다
보안: ID의 규칙성이 특별히 명확하지 않아 ID 번호를 기반으로 다른 ID를 추측하는 것을 방지하여 보안을 보장합니다
고성능: 속도 보장 ID 생성 속도가 충분히 빠릅니다
고가용성: 언제든지 사용할 수 있도록 보장
ID 보안을 강화하기 위해 Redis 자동 연결 방법을 사용할 수 있습니다. ID의 구체적인 구성은 그림과 같습니다.
부호 비트: 1비트, 항상 0, 양수를 나타냄
타임스탬프: 31비트, 초 , 약 69년 동안 사용 가능
일련 번호: 32비트, 동일한 초 수 아래에서 일련 번호 위치에서 ID가 증가하여 초당 2^32개의 서로 다른 ID 생성을 지원합니다.
코드 구현:
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; @Component public class RedisIdWorker { /** * 开始时间戳 (2022-01-01 00:00:00) */ private static final long BEGIN_TIMESTAMP = 1640995200L; /** * 序列号的位数 */ private static final int COUNT_BITS = 32; @Autowired private StringRedisTemplate stringRedisTemplate; /** * 生成ID * * @param keyPrefix 业务系统的前缀 * @return ID */ public long nextId(String keyPrefix) { // 生成时间戳 long timestamp = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) - BEGIN_TIMESTAMP; // 生成序列号 String key = "icr:" + keyPrefix + ":" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy:MM:dd")); long count = stringRedisTemplate.opsForValue().increment(key); // 拼接并返回 return timestamp << COUNT_BITS | count; } /** * 获取时间戳 (2022-01-01 00:00:00) * @param args */ public static void main(String[] args) { LocalDateTime time = LocalDateTime.of(2022, 1, 1, 0, 0, 0); long second = time.toEpochSecond(ZoneOffset.UTC); System.out.println(second); } }
생성된 일련번호:
Redis 자체 증분에는 상한이 있으며 최대값은 2^64입니다. 이 숫자는 크지만 결국 상한선이 있고, 시간이 오래 지속되면 여전히 이 숫자를 초과하는 것이 가능합니다. 따라서, 동일한 업체라 하더라도 동일한 키를 사용할 수 없습니다. 따라서 icr: 업체 이름: 2022:05:14와 같이 키에 날짜를 추가할 수 있습니다. 이렇게 생성된 키는 매일 새로운 키가 되며, 일일 증가량은 2^64를 초과하지 않으므로 이러한 키가 더 적절한 선택입니다.
위 내용은 Redis 전역 ID 생성기를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!