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
#🎜 🎜## 🎜🎜##🎜🎜 #
Principe de mise en œuvre :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); } }
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!