当前位置:网站首页>Implementation of redis unique ID generator

Implementation of redis unique ID generator

2022-07-05 20:43:00 1024 questions

ID Component part :

Sign bit :1bit, For ever 0

Time stamp :31bit, In seconds , have access to 69 year

Serial number :32bit, Seconds counter , Support generation per second 2^32 Different ID

The generated code :

public class RedisIdWorker {    /**     * Start timestamp      */    private static final long BEGIN_TIMESTAMP = 1640995200L;    /**     * Number of digits of serial number      */    private static final int COUNT_BITS = 32;    private StringRedisTemplate stringRedisTemplate;        // Construction method form injection     public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {        this.stringRedisTemplate = stringRedisTemplate;    }    public long nextId(String keyPrefix){        //1. Generate timestamps         LocalDateTime now = LocalDateTime.now();        long nowSecond = now.toEpochSecond(ZoneOffset.UTC);        long timestamp = nowSecond - BEGIN_TIMESTAMP;        //2. Generate serial number         // 2.1 Get current date , Accurate to the sky         String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));        long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);        //3. Splice and return         return timestamp << COUNT_BITS | count;    }}

PS:Redis Achieve global uniqueness id Generate

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.util.Assert;import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.util.Calendar;import java.util.concurrent.TimeUnit;/** * describe : * only ID generator  * @author jimmy * @create 2020-11-06 16:06 */@Componentpublic class GenerateIDUtil {    @Autowired    private RedisTemplate redisTemplate;    /**     * Generate daily initial Id     * @param key     * @return     */  public String initPrimaryId(String key) {        Assert.hasLength(key, "hashName Can't be empty ");        String hashCol = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));        // Custom numbering sequence         String hashColVal = hashCol + "00001";//        redisTemplate.opsForHash().putIfAbsent(hashName, hashCol, hashColVal);        Long expiresTime = getSecondsNextEarlyMorning();        redisTemplate.opsForValue().set(key, Long.valueOf(hashColVal), expiresTime, TimeUnit.SECONDS);        return hashColVal;    }    /**     * Get distributed Id          * @param key     * @return     */    public String getPrimaryId(String key) {        String id = "";        if(redisTemplate.hasKey(key)){            // redisTemplate.opsForValue().get(key);            // redisTemplate.delete(key);            id = String.valueOf(redisTemplate.opsForValue().increment(key, 1));        } else {            id = initPrimaryId(key);        }        return id;    }    /**     * Judge the number of seconds from the current time to the early morning of the next day      * @return The unit of return value is [s: second ]     */    public Long getSecondsNextEarlyMorning() {        Calendar cal = Calendar.getInstance();        cal.add(Calendar.DAY_OF_YEAR, 1);        cal.set(Calendar.HOUR_OF_DAY, 0);        cal.set(Calendar.SECOND, 0);        cal.set(Calendar.MINUTE, 0);        cal.set(Calendar.MILLISECOND, 0);        return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;    }}

This is about Redis only ID This is the end of the article on the implementation of the generator , More about Redis only ID Please search the previous articles of SDN or continue to browse the related articles below. I hope you will support SDN more in the future !


原网站

版权声明
本文为[1024 questions]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207052034221889.html