当前位置:网站首页>Redis based distributed ID generator

Redis based distributed ID generator

2022-07-06 12:13:00 A pole

be based on Redis Distributed ID generator

ID Self increasing strategy

  • One a day key, It is convenient to count the order quantity
  • ID The structure is Time stamp + Counter

ID Component part

image-20220621171917673

  • Sign bit :1bit, For ever 0
  • Time stamp :31bit, In seconds , from 2022 year 1 The month begins to count , have access to 68 year , Can also be based on demand , Change to every minute 、 Hourly or daily counter , Available time can be increased .
  • Serial number :32bit, Daily counter , Support daily production 2^32 Different ID, Can also be based on demand , Change to hourly 、 Counter per minute or per second , But it needs to match with the timestamp , Can increase ID Number .

Here is a timestamp in seconds and a serialization counter in days ID generator .

package cn.sticki.common.redis.utils;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/** * @author  A pole  * @version 1.0 * @date 2022/6/20 20:29 */
@Component
public class RedisIdGenerator {
    

	/** *  Start timestamp  */
	private static final long BEGIN_TIMESTAMP = 1640995200L;

	/** *  Number of digits of serial number  */
	private static final int COUNT_BITS = 32;

	private final RedisTemplate<String, Long> redisTemplate;

	public RedisIdGenerator(RedisTemplate<String, Long> redisTemplate) {
    
		this.redisTemplate = redisTemplate;
	}

	@SuppressWarnings("ConstantConditions")
	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"));
		// 2.2  obtain redis Self growth value 
		long increment = redisTemplate.opsForValue().increment("id:" + keyPrefix + ":" + date);

		// 3.  Splice and return 
		return increment << COUNT_BITS | timestamp;
	}

}

Other globally unique ID Generation strategy

  • UUID
  • Redis Self increasing
  • snowflake Algorithm
  • Database autoincrement
原网站

版权声明
本文为[A pole]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060913400889.html