Maison  >  Article  >  base de données  >  Comment implémenter le générateur d'ID global Redis

Comment implémenter le générateur d'ID global Redis

PHPz
PHPzavant
2023-05-27 12:02:491417parcourir

Le générateur d'ID global est un outil utilisé pour générer des identifiants globalement uniques dans les systèmes distribués. Il répond généralement aux caractéristiques suivantes :

  • Unicité : Assurez-vous de l'ID. est unique et non répétable

  • Incrémentiel : Assurez-vous qu'il augmente progressivement dans son ensemble, ce qui est propice à la création d'un index dans la base de données

    #🎜 🎜## 🎜🎜#
  • Sécurité : La régularité des pièces d'identité n'est pas particulièrement évidente, empêchant de deviner d'autres pièces d'identité en fonction des numéros d'identification pour assurer la sécurité
  • Élevé performances : assurez-vous que la vitesse de génération d'ID est suffisamment rapide
  • Haute disponibilité : assurez-vous qu'il peut être utilisé à tout moment
  • #🎜🎜 #

    Principe de mise en œuvre :
Afin d'améliorer la sécurité de l'ID, l'ID peut être composé en épissant la valeur d'auto-incrémentation Redis avec d'autres informations. La méthode de composition spécifique est la suivante. dans la figure :

Comment implémenter le générateur dID global Redis

Bit de signe : 1 bit, toujours 0, indiquant un nombre positif
    # 🎜🎜#
  • Horodatage : 31 bits, en secondes, peut être utilisé pendant environ 69 ans

  • Numéro de série : 32 bits, dans le cas de le même nombre de secondes, l'ID sera augmenté à la position du numéro de série, pris en charge Générer 2 ^ 32 ID différents par seconde

  • Implémentation du code :

    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);
        }
    }
  • Générer le numéro de série :

Redis Il y a une limite supérieure à l'auto-incrémentation et la valeur maximale est de 2^64. Bien que ce nombre soit élevé, il existe néanmoins une limite supérieure et, si le temps passe suffisamment longtemps, il est toujours possible de dépasser ce nombre. Ainsi, même s’il s’agit de la même entreprise, elle ne peut pas utiliser la même clé. Par conséquent, vous pouvez ajouter une date à la clé, telle que : icr : nom de l'entreprise : 2022:05:14. La clé générée de cette manière sera une nouvelle clé chaque jour et l'incrément quotidien ne dépassera pas 2^64, une telle clé est donc un choix plus approprié.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer