Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk melaksanakan penjana ID global Redis

Bagaimana untuk melaksanakan penjana ID global Redis

PHPz
PHPzke hadapan
2023-05-27 12:02:491417semak imbas

Penjana ID Global ialah alat yang digunakan untuk menjana ID unik secara global dalam sistem yang diedarkan secara amnya memenuhi ciri berikut:

  • Keunikan: Pastikan ID itu unik , tidak boleh berulang.

  • Penambahan: pastikan keseluruhannya meningkat secara beransur-ansur, yang kondusif untuk indeks penciptaan pangkalan data

  • Keselamatan: undang-undang ID Jantina adalah tidak begitu jelas, menghalang ID lain daripada diteka berdasarkan nombor ID, memastikan keselamatan

  • Prestasi tinggi: memastikan kelajuan menjana ID cukup pantas

  • Ketersediaan tinggi: Pastikan ia boleh digunakan pada bila-bila masa

Prinsip pelaksanaan:

Untuk meningkatkan keselamatan ID, anda boleh menggunakan Nilai kenaikan automatik Redis dengan maklumat lain ID dibentuk dengan penyambungan Kaedah komposisi khusus adalah seperti yang ditunjukkan dalam rajah:

Bagaimana untuk melaksanakan penjana ID global Redis

  • Bit tanda: 1 bit, sentiasa 0, menunjukkan nombor positif

  • Cap masa: 31 bit, dalam saat, boleh digunakan selama kira-kira 69 tahun

  • Bersiri nombor: 32 bit, dalam kes bilangan saat yang sama, ID Ditambahkan pada kedudukan nombor siri, menyokong penjanaan 2^32 ID berbeza sesaat

Pelaksanaan kod:

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);
    }
}

Jana nombor siri:

Redis Terdapat had atas untuk kenaikan diri, dan nilai maksimum ialah 2^64. Walaupun jumlah ini besar, terdapat had atas, dan jika masa berjalan cukup lama, masih mungkin untuk melebihi angka ini. Oleh itu, walaupun ia adalah perniagaan yang sama, ia tidak boleh menggunakan kunci yang sama. Oleh itu, anda boleh menambah tarikh pada kunci, seperti: icr: nama perniagaan: 2022:05:14. Kunci yang dijana dengan cara ini akan menjadi kunci baharu setiap hari, dan kenaikan harian tidak akan melebihi 2^64, jadi kunci sedemikian ialah pilihan yang lebih sesuai.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan penjana ID global Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam