>  기사  >  데이터 베이스  >  Redis 전역 ID 생성기를 구현하는 방법

Redis 전역 ID 생성기를 구현하는 방법

PHPz
PHPz앞으로
2023-05-27 12:02:491417검색

글로벌 ID 생성기는 분산 시스템에서 전역적으로 고유한 ID를 생성하는 데 사용되는 도구입니다.

  • 고유성: ID가 고유하고 반복 불가능한지 확인하세요.

  • 증분성: 확인하세요. 전체적으로 점차 증가하고 있으며 이는 데이터베이스 인덱스 생성에 도움이 됩니다

  • 보안: ID의 규칙성이 특별히 명확하지 않아 ID 번호를 기반으로 다른 ID를 추측하는 것을 방지하여 보안을 보장합니다

  • 고성능: 속도 보장 ID 생성 속도가 충분히 빠릅니다

  • 고가용성: 언제든지 사용할 수 있도록 보장

구현 원칙:

ID 보안을 강화하기 위해 Redis 자동 연결 방법을 사용할 수 있습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제