雪花算法是生成数据id非常好的一种方式,机器id是雪花算法不可分割的一部分。但是对于集群应用,让不同的机器自动产生不同的机器id传统做法就是针对每一个机器进行单独配置,但这样做不利于集群水平扩展,且操作过程非常复杂,所以每一个机器在集群环境下是一个头疼的问题。现在借助spring+redis,给出一种策略,支持随意水平扩展,肥肠好用。
大致策略分为4步:
1.对机器ip进行hash,对某一个(大于你的机器的个数)数取模,作为初始的机器ID。
2.将机器id存储到redis中(注册)。
3.以此类推,每一个机器初始化的时候都向redis注册一个数,若这个数注册过了,则+1重新注册。
4.在spring容器销毁时从redis中将注册信息删除。
下面给出具体实现代码:
@Service("machineIdUtil")
public class MachineIdUtil {
//日誌
private static Logger logger = LogUtil.getLogger(MachineIdUtil.class);
/**
*redis 实例
*/
@Autowired
private Cluster jimClient;
/**
* 机器id
*/
public static Integer machine_id;
/**
* 本地ip地址
*/
private static String localIp;
private static TimeUnit timeUnit = TimeUnit.DAYS;
/**
* hash机器IP初始化一个机器ID
*/
@PostConstru