分布式ID選型對比(4)

百度UID generator

一, 創建表: worker_node(在項目啟動時初始化生成workId)

CREATE TABLE `worker_node` (`ID` bigint NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',`HOST_NAME` varchar(64) NOT NULL COMMENT 'host name',`PORT` varchar(64) NOT NULL COMMENT 'port',`TYPE` int NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',`LAUNCH_DATE` date NOT NULL COMMENT 'launch date',`MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified time',`CREATED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created time',PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3 COMMENT='DB WorkerID Assigner for UID Generator';

二, 創建Model及Exmple、Dao

Model: WorkerNode

package org.com.spi.model;import java.util.Date;public class WorkerNode {private Long id;private String hostName;private String port;private Integer type;private Date launchDate;private Date modified;private Date created;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getHostName() {return hostName;}public void setHostName(String hostName) {this.hostName = hostName == null ? null : hostName.trim();}public String getPort() {return port;}public void setPort(String port) {this.port = port == null ? null : port.trim();}public Integer getType() {return type;}public void setType(Integer type) {this.type = type;}public Date getLaunchDate() {return launchDate;}public void setLaunchDate(Date launchDate) {this.launchDate = launchDate;}public Date getModified() {return modified;}public void setModified(Date modified) {this.modified = modified;}public Date getCreated() {return created;}public void setCreated(Date created) {this.created = created;}
}

Example: WorkerNodeExample

package org.com.spi.model;import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;public class WorkerNodeExample {protected String orderByClause;protected boolean distinct;protected List<Criteria> oredCriteria;public WorkerNodeExample() {oredCriteria = new ArrayList<Criteria>();}public void setOrderByClause(String orderByClause) {this.orderByClause = orderByClause;}public String getOrderByClause() {return orderByClause;}public void setDistinct(boolean distinct) {this.distinct = distinct;}public boolean isDistinct() {return distinct;}public List<Criteria> getOredCriteria() {return oredCriteria;}public void or(Criteria criteria) {oredCriteria.add(criteria);}public Criteria or() {Criteria criteria = createCriteriaInternal();oredCriteria.add(criteria);return criteria;}public Criteria createCriteria() {Criteria criteria = createCriteriaInternal();if (oredCriteria.size() == 0) {oredCriteria.add(criteria);}return criteria;}protected Criteria createCriteriaInternal() {Criteria criteria = new Criteria();return criteria;}public void clear() {oredCriteria.clear();orderByClause = null;distinct = false;}protected abstract static class GeneratedCriteria {protected List<Criterion> criteria;protected GeneratedCriteria() {super();criteria = new ArrayList<Criterion>();}public boolean isValid() {return criteria.size() > 0;}public List<Criterion> getAllCriteria() {return criteria;}public List<Criterion> getCriteria() {return criteria;}protected void addCriterion(String condition) {if (condition == null) {throw new RuntimeException("Value for condition cannot be null");}criteria.add(new Criterion(condition));}protected void addCriterion(String condition, Object value, String property) {if (value == null) {throw new RuntimeException("Value for " + property + " cannot be null");}criteria.add(new Criterion(condition, value));}protected void addCriterion(String condition, Object value1, Object value2, String property) {if (value1 == null || value2 == null) {throw new RuntimeException("Between values for " + property + " cannot be null");}criteria.add(new Criterion(condition, value1, value2));}protected void addCriterionForJDBCDate(String condition, Date value, String property) {if (value == null) {throw new RuntimeException("Value for " + property + " cannot be null");}addCriterion(condition, new java.sql.Date(value.getTime()), property);}protected void addCriterionForJDBCDate(String condition, List<Date> values, String property) {if (values == null || values.size() == 0) {throw new RuntimeException("Value list for " + property + " cannot be null or empty");}List<java.sql.Date> dateList = new ArrayList<java.sql.Date>();Iterator<Date> iter = values.iterator();while (iter.hasNext()) {dateList.add(new java.sql.Date(iter.next().getTime()));}addCriterion(condition, dateList, property);}protected void addCriterionForJDBCDate(String condition, Date value1, Date value2, String property) {if (value1 == null || value2 == null) {throw new RuntimeException("Between values for " + property + " cannot be null");}addCriterion(condition, new java.sql.Date(value1.getTime()), new java.sql.Date(value2.getTime()), property);}public Criteria andIdIsNull() {addCriterion("ID is null");return (Criteria) this;}public Criteria andIdIsNotNull() {addCriterion("ID is not null");return (Criteria) this;}public Criteria andIdEqualTo(Long value) {addCriterion("ID =", value, "id");return (Criteria) this;}public Criteria andIdNotEqualTo(Long value) {addCriterion("ID <>", value, "id");return (Criteria) this;}public Criteria andIdGreaterThan(Long value) {addCriterion("ID >", value, "id");return (Criteria) this;}public Criteria andIdGreaterThanOrEqualTo(Long value) {addCriterion("ID >=", value, "id");return (Criteria) this;}public Criteria andIdLessThan(Long value) {addCriterion("ID <", value, "id");return (Criteria) this;}public Criteria andIdLessThanOrEqualTo(Long value) {addCriterion("ID <=", value, "id");return (Criteria) this;}public Criteria andIdIn(List<Long> values) {addCriterion("ID in", values, "id");return (Criteria) this;}public Criteria andIdNotIn(List<Long> values) {addCriterion("ID not in", values, "id");return (Criteria) this;}public Criteria andIdBetween(Long value1, Long value2) {addCriterion("ID between", value1, value2, "id");return (Criteria) this;}public Criteria andIdNotBetween(Long value1, Long value2) {addCriterion("ID not between", value1, value2, "id");return (Criteria) this;}public Criteria andHostNameIsNull() {addCriterion("HOST_NAME is null");return (Criteria) this;}public Criteria andHostNameIsNotNull() {addCriterion("HOST_NAME is not null");return (Criteria) this;}public Criteria andHostNameEqualTo(String value) {addCriterion("HOST_NAME =", value, "hostName");return (Criteria) this;}public Criteria andHostNameNotEqualTo(String value) {addCriterion("HOST_NAME <>", value, "hostName");return (Criteria) this;}public Criteria andHostNameGreaterThan(String value) {addCriterion("HOST_NAME >", value, "hostName");return (Criteria) this;}public Criteria andHostNameGreaterThanOrEqualTo(String value) {addCriterion("HOST_NAME >=", value, "hostName");return (Criteria) this;}public Criteria andHostNameLessThan(String value) {addCriterion("HOST_NAME <", value, "hostName");return (Criteria) this;}public Criteria andHostNameLessThanOrEqualTo(String value) {addCriterion("HOST_NAME <=", value, "hostName");return (Criteria) this;}public Criteria andHostNameLike(String value) {addCriterion("HOST_NAME like", value, "hostName");return (Criteria) this;}public Criteria andHostNameNotLike(String value) {addCriterion("HOST_NAME not like", value, "hostName");return (Criteria) this;}public Criteria andHostNameIn(List<String> values) {addCriterion("HOST_NAME in", values, "hostName");return (Criteria) this;}public Criteria andHostNameNotIn(List<String> values) {addCriterion("HOST_NAME not in", values, "hostName");return (Criteria) this;}public Criteria andHostNameBetween(String value1, String value2) {addCriterion("HOST_NAME between", value1, value2, "hostName");return (Criteria) this;}public Criteria andHostNameNotBetween(String value1, String value2) {addCriterion("HOST_NAME not between", value1, value2, "hostName");return (Criteria) this;}public Criteria andPortIsNull() {addCriterion("PORT is null");return (Criteria) this;}public Criteria andPortIsNotNull() {addCriterion("PORT is not null");return (Criteria) this;}public Criteria andPortEqualTo(String value) {addCriterion("PORT =", value, "port");return (Criteria) this;}public Criteria andPortNotEqualTo(String value) {addCriterion("PORT <>", value, "port");return (Criteria) this;}public Criteria andPortGreaterThan(String value) {addCriterion("PORT >", value, "port");return (Criteria) this;}public Criteria andPortGreaterThanOrEqualTo(String value) {addCriterion("PORT >=", value, "port");return (Criteria) this;}public Criteria andPortLessThan(String value) {addCriterion("PORT <", value, "port");return (Criteria) this;}public Criteria andPortLessThanOrEqualTo(String value) {addCriterion("PORT <=", value, "port");return (Criteria) this;}public Criteria andPortLike(String value) {addCriterion("PORT like", value, "port");return (Criteria) this;}public Criteria andPortNotLike(String value) {addCriterion("PORT not like", value, "port");return (Criteria) this;}public Criteria andPortIn(List<String> values) {addCriterion("PORT in", values, "port");return (Criteria) this;}public Criteria andPortNotIn(List<String> values) {addCriterion("PORT not in", values, "port");return (Criteria) this;}public Criteria andPortBetween(String value1, String value2) {addCriterion("PORT between", value1, value2, "port");return (Criteria) this;}public Criteria andPortNotBetween(String value1, String value2) {addCriterion("PORT not between", value1, value2, "port");return (Criteria) this;}public Criteria andTypeIsNull() {addCriterion("TYPE is null");return (Criteria) this;}public Criteria andTypeIsNotNull() {addCriterion("TYPE is not null");return (Criteria) this;}public Criteria andTypeEqualTo(Integer value) {addCriterion("TYPE =", value, "type");return (Criteria) this;}public Criteria andTypeNotEqualTo(Integer value) {addCriterion("TYPE <>", value, "type");return (Criteria) this;}public Criteria andTypeGreaterThan(Integer value) {addCriterion("TYPE >", value, "type");return (Criteria) this;}public Criteria andTypeGreaterThanOrEqualTo(Integer value) {addCriterion("TYPE >=", value, "type");return (Criteria) this;}public Criteria andTypeLessThan(Integer value) {addCriterion("TYPE <", value, "type");return (Criteria) this;}public Criteria andTypeLessThanOrEqualTo(Integer value) {addCriterion("TYPE <=", value, "type");return (Criteria) this;}public Criteria andTypeIn(List<Integer> values) {addCriterion("TYPE in", values, "type");return (Criteria) this;}public Criteria andTypeNotIn(List<Integer> values) {addCriterion("TYPE not in", values, "type");return (Criteria) this;}public Criteria andTypeBetween(Integer value1, Integer value2) {addCriterion("TYPE between", value1, value2, "type");return (Criteria) this;}public Criteria andTypeNotBetween(Integer value1, Integer value2) {addCriterion("TYPE not between", value1, value2, "type");return (Criteria) this;}public Criteria andLaunchDateIsNull() {addCriterion("LAUNCH_DATE is null");return (Criteria) this;}public Criteria andLaunchDateIsNotNull() {addCriterion("LAUNCH_DATE is not null");return (Criteria) this;}public Criteria andLaunchDateEqualTo(Date value) {addCriterionForJDBCDate("LAUNCH_DATE =", value, "launchDate");return (Criteria) this;}public Criteria andLaunchDateNotEqualTo(Date value) {addCriterionForJDBCDate("LAUNCH_DATE <>", value, "launchDate");return (Criteria) this;}public Criteria andLaunchDateGreaterThan(Date value) {addCriterionForJDBCDate("LAUNCH_DATE >", value, "launchDate");return (Criteria) this;}public Criteria andLaunchDateGreaterThanOrEqualTo(Date value) {addCriterionForJDBCDate("LAUNCH_DATE >=", value, "launchDate");return (Criteria) this;}public Criteria andLaunchDateLessThan(Date value) {addCriterionForJDBCDate("LAUNCH_DATE <", value, "launchDate");return (Criteria) this;}public Criteria andLaunchDateLessThanOrEqualTo(Date value) {addCriterionForJDBCDate("LAUNCH_DATE <=", value, "launchDate");return (Criteria) this;}public Criteria andLaunchDateIn(List<Date> values) {addCriterionForJDBCDate("LAUNCH_DATE in", values, "launchDate");return (Criteria) this;}public Criteria andLaunchDateNotIn(List<Date> values) {addCriterionForJDBCDate("LAUNCH_DATE not in", values, "launchDate");return (Criteria) this;}public Criteria andLaunchDateBetween(Date value1, Date value2) {addCriterionForJDBCDate("LAUNCH_DATE between", value1, value2, "launchDate");return (Criteria) this;}public Criteria andLaunchDateNotBetween(Date value1, Date value2) {addCriterionForJDBCDate("LAUNCH_DATE not between", value1, value2, "launchDate");return (Criteria) this;}public Criteria andModifiedIsNull() {addCriterion("MODIFIED is null");return (Criteria) this;}public Criteria andModifiedIsNotNull() {addCriterion("MODIFIED is not null");return (Criteria) this;}public Criteria andModifiedEqualTo(Date value) {addCriterion("MODIFIED =", value, "modified");return (Criteria) this;}public Criteria andModifiedNotEqualTo(Date value) {addCriterion("MODIFIED <>", value, "modified");return (Criteria) this;}public Criteria andModifiedGreaterThan(Date value) {addCriterion("MODIFIED >", value, "modified");return (Criteria) this;}public Criteria andModifiedGreaterThanOrEqualTo(Date value) {addCriterion("MODIFIED >=", value, "modified");return (Criteria) this;}public Criteria andModifiedLessThan(Date value) {addCriterion("MODIFIED <", value, "modified");return (Criteria) this;}public Criteria andModifiedLessThanOrEqualTo(Date value) {addCriterion("MODIFIED <=", value, "modified");return (Criteria) this;}public Criteria andModifiedIn(List<Date> values) {addCriterion("MODIFIED in", values, "modified");return (Criteria) this;}public Criteria andModifiedNotIn(List<Date> values) {addCriterion("MODIFIED not in", values, "modified");return (Criteria) this;}public Criteria andModifiedBetween(Date value1, Date value2) {addCriterion("MODIFIED between", value1, value2, "modified");return (Criteria) this;}public Criteria andModifiedNotBetween(Date value1, Date value2) {addCriterion("MODIFIED not between", value1, value2, "modified");return (Criteria) this;}public Criteria andCreatedIsNull() {addCriterion("CREATED is null");return (Criteria) this;}public Criteria andCreatedIsNotNull() {addCriterion("CREATED is not null");return (Criteria) this;}public Criteria andCreatedEqualTo(Date value) {addCriterion("CREATED =", value, "created");return (Criteria) this;}public Criteria andCreatedNotEqualTo(Date value) {addCriterion("CREATED <>", value, "created");return (Criteria) this;}public Criteria andCreatedGreaterThan(Date value) {addCriterion("CREATED >", value, "created");return (Criteria) this;}public Criteria andCreatedGreaterThanOrEqualTo(Date value) {addCriterion("CREATED >=", value, "created");return (Criteria) this;}public Criteria andCreatedLessThan(Date value) {addCriterion("CREATED <", value, "created");return (Criteria) this;}public Criteria andCreatedLessThanOrEqualTo(Date value) {addCriterion("CREATED <=", value, "created");return (Criteria) this;}public Criteria andCreatedIn(List<Date> values) {addCriterion("CREATED in", values, "created");return (Criteria) this;}public Criteria andCreatedNotIn(List<Date> values) {addCriterion("CREATED not in", values, "created");return (Criteria) this;}public Criteria andCreatedBetween(Date value1, Date value2) {addCriterion("CREATED between", value1, value2, "created");return (Criteria) this;}public Criteria andCreatedNotBetween(Date value1, Date value2) {addCriterion("CREATED not between", value1, value2, "created");return (Criteria) this;}}public static class Criteria extends GeneratedCriteria {protected Criteria() {super();}}public static class Criterion {private String condition;private Object value;private Object secondValue;private boolean noValue;private boolean singleValue;private boolean betweenValue;private boolean listValue;private String typeHandler;public String getCondition() {return condition;}public Object getValue() {return value;}public Object getSecondValue() {return secondValue;}public boolean isNoValue() {return noValue;}public boolean isSingleValue() {return singleValue;}public boolean isBetweenValue() {return betweenValue;}public boolean isListValue() {return listValue;}public String getTypeHandler() {return typeHandler;}protected Criterion(String condition) {super();this.condition = condition;this.typeHandler = null;this.noValue = true;}protected Criterion(String condition, Object value, String typeHandler) {super();this.condition = condition;this.value = value;this.typeHandler = typeHandler;if (value instanceof List<?>) {this.listValue = true;} else {this.singleValue = true;}}protected Criterion(String condition, Object value) {this(condition, value, null);}protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {super();this.condition = condition;this.value = value;this.secondValue = secondValue;this.typeHandler = typeHandler;this.betweenValue = true;}protected Criterion(String condition, Object value, Object secondValue) {this(condition, value, secondValue, null);}}
}

Dao: WorkerNodeMapper

package org.com.spi.dao;import java.util.List;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.com.spi.model.WorkerNode;
import org.com.spi.model.WorkerNodeExample;@Mapper
public interface WorkerNodeMapper {int countByExample(WorkerNodeExample example);int deleteByExample(WorkerNodeExample example);int deleteByPrimaryKey(Long id);int insert(WorkerNode record);int insertSelective(WorkerNode record);List<WorkerNode> selectByExample(WorkerNodeExample example);WorkerNode selectByPrimaryKey(Long id);int updateByExampleSelective(@Param("record") WorkerNode record, @Param("example") WorkerNodeExample example);int updateByExample(@Param("record") WorkerNode record, @Param("example") WorkerNodeExample example);int updateByPrimaryKeySelective(WorkerNode record);int updateByPrimaryKey(WorkerNode record);
}

三, 配置文件 及 xml

配置文件內容:

spring.datasource.url=jdbc:mysql://localhost:3306/generate_id?characterEncoding=utf8&serverTimezone=UTC 
#  ??????
spring.datasource.username=root
#  ?????
spring.datasource.password=root
#  ?????
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver###################################### MyBatis ??######################################
# ?? mapper.xml ???
mybatis.mapper-locations=classpath:mybatis/*.xml
#????????,?????????????? mapper.xml ??????????????
mybatis.type-aliases-package=net.biancheng.www.bean
#???????????????????
mybatis.configuration.map-underscore-to-camel-case=true

在resources/mybatis目錄下創建WorkerNodeMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.com.spi.dao.WorkerNodeMapper" ><resultMap id="BaseResultMap" type="org.com.spi.model.WorkerNode" ><id column="ID" property="id" jdbcType="BIGINT" /><result column="HOST_NAME" property="hostName" jdbcType="VARCHAR" /><result column="PORT" property="port" jdbcType="VARCHAR" /><result column="TYPE" property="type" jdbcType="INTEGER" /><result column="LAUNCH_DATE" property="launchDate" jdbcType="DATE" /><result column="MODIFIED" property="modified" jdbcType="TIMESTAMP" /><result column="CREATED" property="created" jdbcType="TIMESTAMP" /></resultMap><sql id="Example_Where_Clause" ><where ><foreach collection="oredCriteria" item="criteria" separator="or" ><if test="criteria.valid" ><trim prefix="(" suffix=")" prefixOverrides="and" ><foreach collection="criteria.criteria" item="criterion" ><choose ><when test="criterion.noValue" >and ${criterion.condition}</when><when test="criterion.singleValue" >and ${criterion.condition} #{criterion.value}</when><when test="criterion.betweenValue" >and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}</when><when test="criterion.listValue" >and ${criterion.condition}<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >#{listItem}</foreach></when></choose></foreach></trim></if></foreach></where></sql><sql id="Update_By_Example_Where_Clause" ><where ><foreach collection="example.oredCriteria" item="criteria" separator="or" ><if test="criteria.valid" ><trim prefix="(" suffix=")" prefixOverrides="and" ><foreach collection="criteria.criteria" item="criterion" ><choose ><when test="criterion.noValue" >and ${criterion.condition}</when><when test="criterion.singleValue" >and ${criterion.condition} #{criterion.value}</when><when test="criterion.betweenValue" >and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}</when><when test="criterion.listValue" >and ${criterion.condition}<foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >#{listItem}</foreach></when></choose></foreach></trim></if></foreach></where></sql><sql id="Base_Column_List" >ID, HOST_NAME, PORT, TYPE, LAUNCH_DATE, MODIFIED, CREATED</sql><select id="selectByExample" resultMap="BaseResultMap" parameterType="org.com.spi.model.WorkerNodeExample" >select<if test="distinct" >distinct</if><include refid="Base_Column_List" />from worker_node<if test="_parameter != null" ><include refid="Example_Where_Clause" /></if><if test="orderByClause != null" >order by ${orderByClause}</if></select><select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >select <include refid="Base_Column_List" />from worker_nodewhere ID = #{id,jdbcType=BIGINT}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >delete from worker_nodewhere ID = #{id,jdbcType=BIGINT}</delete><delete id="deleteByExample" parameterType="org.com.spi.model.WorkerNodeExample" >delete from worker_node<if test="_parameter != null" ><include refid="Example_Where_Clause" /></if></delete><insert id="insert" parameterType="org.com.spi.model.WorkerNode" >insert into worker_node (ID, HOST_NAME, PORT, TYPE, LAUNCH_DATE, MODIFIED, CREATED)values (#{id,jdbcType=BIGINT}, #{hostName,jdbcType=VARCHAR}, #{port,jdbcType=VARCHAR}, #{type,jdbcType=INTEGER}, #{launchDate,jdbcType=DATE}, #{modified,jdbcType=TIMESTAMP}, #{created,jdbcType=TIMESTAMP})</insert><insert id="insertSelective" parameterType="org.com.spi.model.WorkerNode" >insert into worker_node<trim prefix="(" suffix=")" suffixOverrides="," ><if test="id != null" >ID,</if><if test="hostName != null" >HOST_NAME,</if><if test="port != null" >PORT,</if><if test="type != null" >TYPE,</if><if test="launchDate != null" >LAUNCH_DATE,</if><if test="modified != null" >MODIFIED,</if><if test="created != null" >CREATED,</if></trim><trim prefix="values (" suffix=")" suffixOverrides="," ><if test="id != null" >#{id,jdbcType=BIGINT},</if><if test="hostName != null" >#{hostName,jdbcType=VARCHAR},</if><if test="port != null" >#{port,jdbcType=VARCHAR},</if><if test="type != null" >#{type,jdbcType=INTEGER},</if><if test="launchDate != null" >#{launchDate,jdbcType=DATE},</if><if test="modified != null" >#{modified,jdbcType=TIMESTAMP},</if><if test="created != null" >#{created,jdbcType=TIMESTAMP},</if></trim></insert><select id="countByExample" parameterType="org.com.spi.model.WorkerNodeExample" resultType="java.lang.Integer" >select count(*) from worker_node<if test="_parameter != null" ><include refid="Example_Where_Clause" /></if></select><update id="updateByExampleSelective" parameterType="map" >update worker_node<set ><if test="record.id != null" >ID = #{record.id,jdbcType=BIGINT},</if><if test="record.hostName != null" >HOST_NAME = #{record.hostName,jdbcType=VARCHAR},</if><if test="record.port != null" >PORT = #{record.port,jdbcType=VARCHAR},</if><if test="record.type != null" >TYPE = #{record.type,jdbcType=INTEGER},</if><if test="record.launchDate != null" >LAUNCH_DATE = #{record.launchDate,jdbcType=DATE},</if><if test="record.modified != null" >MODIFIED = #{record.modified,jdbcType=TIMESTAMP},</if><if test="record.created != null" >CREATED = #{record.created,jdbcType=TIMESTAMP},</if></set><if test="_parameter != null" ><include refid="Update_By_Example_Where_Clause" /></if></update><update id="updateByExample" parameterType="map" >update worker_nodeset ID = #{record.id,jdbcType=BIGINT},HOST_NAME = #{record.hostName,jdbcType=VARCHAR},PORT = #{record.port,jdbcType=VARCHAR},TYPE = #{record.type,jdbcType=INTEGER},LAUNCH_DATE = #{record.launchDate,jdbcType=DATE},MODIFIED = #{record.modified,jdbcType=TIMESTAMP},CREATED = #{record.created,jdbcType=TIMESTAMP}<if test="_parameter != null" ><include refid="Update_By_Example_Where_Clause" /></if></update><update id="updateByPrimaryKeySelective" parameterType="org.com.spi.model.WorkerNode" >update worker_node<set ><if test="hostName != null" >HOST_NAME = #{hostName,jdbcType=VARCHAR},</if><if test="port != null" >PORT = #{port,jdbcType=VARCHAR},</if><if test="type != null" >TYPE = #{type,jdbcType=INTEGER},</if><if test="launchDate != null" >LAUNCH_DATE = #{launchDate,jdbcType=DATE},</if><if test="modified != null" >MODIFIED = #{modified,jdbcType=TIMESTAMP},</if><if test="created != null" >CREATED = #{created,jdbcType=TIMESTAMP},</if></set>where ID = #{id,jdbcType=BIGINT}</update><update id="updateByPrimaryKey" parameterType="org.com.spi.model.WorkerNode" >update worker_nodeset HOST_NAME = #{hostName,jdbcType=VARCHAR},PORT = #{port,jdbcType=VARCHAR},TYPE = #{type,jdbcType=INTEGER},LAUNCH_DATE = #{launchDate,jdbcType=DATE},MODIFIED = #{modified,jdbcType=TIMESTAMP},CREATED = #{created,jdbcType=TIMESTAMP}where ID = #{id,jdbcType=BIGINT}</update>
</mapper>

四, 編寫相關類

入口類: DefaultUidGenerator

package org.com.spi.utils.baidu;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.StringUtils;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.concurrent.TimeUnit;public class DefaultUidGenerator implements UidGenerator, InitializingBean {private static final Logger LOGGER = LoggerFactory.getLogger(DefaultUidGenerator.class);/** Bits allocate */protected int timeBits = 28;protected int workerBits = 22;protected int seqBits = 13;/** Customer epoch, unit as second. For example 2016-05-20 (ms: 1463673600000)*/protected String epochStr = "2016-05-20";protected long epochSeconds = TimeUnit.MILLISECONDS.toSeconds(1463673600000L);/** Stable fields after spring bean initializing */protected BitsAllocator bitsAllocator;protected long workerId;/** Volatile fields caused by nextId() */protected long sequence = 0L;protected long lastSecond = -1L;//    /** Spring property */
//    protected WorkerIdAssigner workerIdAssigner;public long getWorkerId() {return workerId;}public void setWorkerId(long workerId) {this.workerId = workerId;}@Overridepublic void afterPropertiesSet() throws Exception {// initialize bits allocatorbitsAllocator = new BitsAllocator(timeBits, workerBits, seqBits);//        // initialize worker id
//        workerId = workerIdAssigner.assignWorkerId();if (workerId > bitsAllocator.getMaxWorkerId()) {throw new RuntimeException("Worker id " + workerId + " exceeds the max " + bitsAllocator.getMaxWorkerId());}LOGGER.info("Initialized bits(1, {}, {}, {}) for workerID:{}", timeBits, workerBits, seqBits, workerId);}@Overridepublic long getUID() throws UidGenerateException {try {return nextId();} catch (Exception e) {LOGGER.error("Generate unique id exception. ", e);throw new UidGenerateException(e);}}@Overridepublic String parseUID(long uid) {long totalBits = BitsAllocator.TOTAL_BITS;long signBits = bitsAllocator.getSignBits();long timestampBits = bitsAllocator.getTimestampBits();long workerIdBits = bitsAllocator.getWorkerIdBits();long sequenceBits = bitsAllocator.getSequenceBits();// parse UIDlong sequence = (uid << (totalBits - sequenceBits)) >>> (totalBits - sequenceBits);long workerId = (uid << (timestampBits + signBits)) >>> (totalBits - workerIdBits);long deltaSeconds = uid >>> (workerIdBits + sequenceBits);Date thatTime = new Date(TimeUnit.SECONDS.toMillis(epochSeconds + deltaSeconds));String thatTimeStr = DateUtils.formatByDateTimePattern(thatTime);// format as stringreturn String.format("{\"UID\":\"%d\",\"timestamp\":\"%s\",\"workerId\":\"%d\",\"sequence\":\"%d\"}",uid, thatTimeStr, workerId, sequence);}/*** Get UID** @return UID* @throws UidGenerateException in the case: Clock moved backwards; Exceeds the max timestamp*/protected synchronized long nextId() {long currentSecond = getCurrentSecond();// Clock moved backwards, refuse to generate uidif (currentSecond < lastSecond) {long refusedSeconds = lastSecond - currentSecond;throw new UidGenerateException("Clock moved backwards. Refusing for %d seconds", refusedSeconds);}// At the same second, increase sequenceif (currentSecond == lastSecond) {sequence = (sequence + 1) & bitsAllocator.getMaxSequence();// Exceed the max sequence, we wait the next second to generate uidif (sequence == 0) {currentSecond = getNextSecond(lastSecond);}// At the different second, sequence restart from zero} else {sequence = 0L;}lastSecond = currentSecond;// Allocate bits for UIDreturn bitsAllocator.allocate(currentSecond - epochSeconds, workerId, sequence);}/*** Get next millisecond*/private long getNextSecond(long lastTimestamp) {long timestamp = getCurrentSecond();while (timestamp <= lastTimestamp) {timestamp = getCurrentSecond();}return timestamp;}/*** Get current second*/private long getCurrentSecond() {long currentSecond = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());if (currentSecond - epochSeconds > bitsAllocator.getMaxDeltaSeconds()) {throw new UidGenerateException("Timestamp bits is exhausted. Refusing UID generate. Now: " + currentSecond);}return currentSecond;}/*** Setters for spring property*/
//    public void setWorkerIdAssigner(WorkerIdAssigner workerIdAssigner) {
//        this.workerIdAssigner = workerIdAssigner;
//    }public void setTimeBits(int timeBits) {if (timeBits > 0) {this.timeBits = timeBits;}}public void setWorkerBits(int workerBits) {if (workerBits > 0) {this.workerBits = workerBits;}}public void setSeqBits(int seqBits) {if (seqBits > 0) {this.seqBits = seqBits;}}public void setEpochStr(String epochStr) {if (StringUtils.hasLength(epochStr)) {this.epochStr = epochStr;this.epochSeconds = TimeUnit.MILLISECONDS.toSeconds(DateUtils.parseByDayPattern(epochStr).getTime());}}public String getPodIp(){try {InetAddress localHost = InetAddress.getLocalHost();return localHost.getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();}return "127.0.0.1";}}

接口: UidGenerator

package org.com.spi.utils.baidu;public interface UidGenerator {/*** Get a unique ID** @return UID* @throws UidGenerateException*/long getUID() throws UidGenerateException;/*** Parse the UID into elements which are used to generate the UID. <br>* Such as timestamp & workerId & sequence...** @param uid* @return Parsed info*/String parseUID(long uid);
}

接口WorkerIdAssigner:

package org.com.spi.utils.baidu;public interface WorkerIdAssigner {/*** @return assigned worker id*/long assignWorkerId();
}

BitsAllocator類:

package org.com.spi.utils.baidu;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.util.Assert;public class BitsAllocator {/*** Total 64 bits*/public static final int TOTAL_BITS = 1 << 6;/*** Bits for [sign-> second-> workId-> sequence]*/private int signBits = 1;private final int timestampBits;private final int workerIdBits;private final int sequenceBits;/*** Max value for workId & sequence*/private final long maxDeltaSeconds;private final long maxWorkerId;private final long maxSequence;/*** Shift for timestamp & workerId*/private final int timestampShift;private final int workerIdShift;/*** Constructor with timestampBits, workerIdBits, sequenceBits<br>* The highest bit used for sign, so <code>63</code> bits for timestampBits, workerIdBits, sequenceBits*/public BitsAllocator(int timestampBits, int workerIdBits, int sequenceBits) {// make sure allocated 64 bitsint allocateTotalBits = signBits + timestampBits + workerIdBits + sequenceBits;Assert.isTrue(allocateTotalBits == TOTAL_BITS, "allocate not enough 64 bits");// initialize bitsthis.timestampBits = timestampBits;this.workerIdBits = workerIdBits;this.sequenceBits = sequenceBits;// initialize max valuethis.maxDeltaSeconds = ~(-1L << timestampBits);this.maxWorkerId = ~(-1L << workerIdBits);this.maxSequence = ~(-1L << sequenceBits);// initialize shiftthis.timestampShift = workerIdBits + sequenceBits;this.workerIdShift = sequenceBits;}/*** Allocate bits for UID according to delta seconds & workerId & sequence<br>* <b>Note that: </b>The highest bit will always be 0 for sign** @param deltaSeconds* @param workerId* @param sequence* @return*/public long allocate(long deltaSeconds, long workerId, long sequence) {return (deltaSeconds << timestampShift) | (workerId << workerIdShift) | sequence;}/*** Getters*/public int getSignBits() {return signBits;}public int getTimestampBits() {return timestampBits;}public int getWorkerIdBits() {return workerIdBits;}public int getSequenceBits() {return sequenceBits;}public long getMaxDeltaSeconds() {return maxDeltaSeconds;}public long getMaxWorkerId() {return maxWorkerId;}public long getMaxSequence() {return maxSequence;}public int getTimestampShift() {return timestampShift;}public int getWorkerIdShift() {return workerIdShift;}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);}
}

異常類UidGenerateException:

package org.com.spi.utils.baidu;public class UidGenerateException extends RuntimeException {/*** Serial Version UID*/private static final long serialVersionUID = -27048199131316992L;/*** Default constructor*/public UidGenerateException() {super();}/*** Constructor with message & cause** @param message* @param cause*/public UidGenerateException(String message, Throwable cause) {super(message, cause);}/*** Constructor with message** @param message*/public UidGenerateException(String message) {super(message);}/*** Constructor with message format** @param msgFormat* @param args*/public UidGenerateException(String msgFormat, Object... args) {super(String.format(msgFormat, args));}/*** Constructor with cause** @param cause*/public UidGenerateException(Throwable cause) {super(cause);}}

配置類: UidGeneratorConfig

package org.com.spi.config;import org.com.spi.dao.WorkerNodeMapper;
import org.com.spi.enums.ProjectTypeEnum;
import org.com.spi.model.WorkerNode;
import org.com.spi.model.WorkerNodeExample;
import org.com.spi.utils.ListUtils;
import org.com.spi.utils.baidu.DefaultUidGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
import java.util.List;@Configuration
public class UidGeneratorConfig {@Autowiredprivate WorkerNodeMapper workerNodeMapper;@Value("${server.port}")private String port;@Beanpublic DefaultUidGenerator defaultUidGenerator(){DefaultUidGenerator defaultUidGenerator = new DefaultUidGenerator();String podIp = defaultUidGenerator.getPodIp();System.out.println("ip:"+podIp+",port:"+port);//是否已存在workIdWorkerNodeExample example = new WorkerNodeExample();example.createCriteria().andHostNameEqualTo(podIp).andPortEqualTo(port);List<WorkerNode> workerNodes = workerNodeMapper.selectByExample(example);WorkerNode workerNode = null;if(!ListUtils.anyList(workerNodes)){//新增Date date = new Date();workerNode = new WorkerNode();workerNode.setCreated(date);workerNode.setHostName(podIp);workerNode.setModified(date);workerNode.setLaunchDate(date);workerNode.setPort(port);workerNode.setType(ProjectTypeEnum.DEMO.getType());int i = workerNodeMapper.insertSelective(workerNode);if(i > 0){workerNodes = workerNodeMapper.selectByExample(example);workerNode = workerNodes.get(0);}}else{workerNode = workerNodes.get(0);}defaultUidGenerator.setWorkerId(workerNode.getId());return defaultUidGenerator;}}

日期時間處理類DateUtils:

package org.com.spi.utils.baidu;import org.apache.commons.lang.time.DateFormatUtils;import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;public abstract class DateUtils extends org.apache.commons.lang.time.DateUtils {/*** Patterns*/public static final String DAY_PATTERN = "yyyy-MM-dd";public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";public static final String DATETIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";public static final Date DEFAULT_DATE = DateUtils.parseByDayPattern("1970-01-01");/*** Parse date by 'yyyy-MM-dd' pattern** @param str* @return*/public static Date parseByDayPattern(String str) {return parseDate(str, DAY_PATTERN);}/*** Parse date by 'yyyy-MM-dd HH:mm:ss' pattern** @param str* @return*/public static Date parseByDateTimePattern(String str) {return parseDate(str, DATETIME_PATTERN);}/*** Parse date without Checked exception** @param str* @param pattern* @return* @throws RuntimeException when ParseException occurred*/public static Date parseDate(String str, String pattern) {try {return parseDate(str, new String[]{pattern});} catch (ParseException e) {throw new RuntimeException(e);}}/*** Format date into string** @param date* @param pattern* @return*/public static String formatDate(Date date, String pattern) {return DateFormatUtils.format(date, pattern);}/*** Format date by 'yyyy-MM-dd' pattern** @param date* @return*/public static String formatByDayPattern(Date date) {if (date != null) {return DateFormatUtils.format(date, DAY_PATTERN);} else {return null;}}/*** Format date by 'yyyy-MM-dd HH:mm:ss' pattern** @param date* @return*/public static String formatByDateTimePattern(Date date) {return DateFormatUtils.format(date, DATETIME_PATTERN);}/*** Get current day using format date by 'yyyy-MM-dd HH:mm:ss' pattern** @return* @author yebo*/public static String getCurrentDayByDayPattern() {Calendar cal = Calendar.getInstance();return formatByDayPattern(cal.getTime());}
}

特點: 百度Uid generator是基于雪花算法實現,不同點在于其workId是動態的,即不同機器生成的workId不同,將主鍵ID作為wrokId,在項目啟動時完成workId的生成及獲取.遺憾的是 目前百度的這個開源算法已經停止了維護!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

金屬3D打印新材料嶄露頭角,性能卓越引領行業新潮流

在3D打印模具制造領域&#xff0c;材料的選擇對最終產品的性能有著至關重要的影響。隨著技術的不斷進步&#xff0c;金屬3D打印材料正迅速發展&#xff0c;展現出強大的競爭力和創新潛力。其中&#xff0c;3D打印企業毅速推出的多款不銹鋼粉末材料&#xff0c;如EM191、EM191S、…

字符串函數 strncpy() 詳解

什么是 strncpy() 函數&#xff1f; strncpy() 函數是 C 語言中的一個標準庫函數&#xff0c;它的作用是從一個字符串中按照指定的長度復制字符到另一個字符串中。它的原型如下&#xff1a; char *strncpy(char *dest, const char *src, size_t n);其中&#xff0c;dest 是目…

VMware Workstation Pro 17 虛擬機軟件安裝教程

VMware軟件介紹 VMware Workstation是一款功能強大的桌面虛擬計算機軟件&#xff0c;提供用戶可在宿主機操作系統上同時運行不同的操作系統(虛擬化技術)&#xff0c;所運行的操作系統可方便的進行復制和移動&#xff0c;突破傳統架構的限制。本文將以VMware Workstation Pro 1…

使用lnmp環境部署laravel框架需要注意的點

1&#xff0c;上傳項目文件后&#xff0c;需要chmod -R 777 storage授予文件權限&#xff0c;不然會報錯file_put_contents(/): failed to open stream: Permission denied。 如果后面還是報錯沒有權限的話&#xff0c;就執行ps -ef |grep php查詢php運行用戶。然后執行chown …

2024真正有效的蘋果mac電腦清理工具CleanMyMac X

一、前言 對于Mac用戶來說&#xff0c;電腦卡頓、運行緩慢無疑是一件令人頭疼的事情。而市面上的清理軟件又五花八門&#xff0c;效果參差不齊&#xff0c;如何才能找到一款真正有效的清理工具呢&#xff1f;今天&#xff0c;我們為大家推薦一款實力派電腦清理軟件——CleanMy…

【雙指針】刪除有序數組中重復元素,雙指針原地修改數組

刪除有序數組中重復元素 鏈接 . - 力扣&#xff08;LeetCode&#xff09;. - 備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-duplicates-from-sorted-array/…

宏定義中#與##的注意事項

1. #是字符串化操作符。它的作用是將宏參數轉換成字符串 2. ##是標記粘貼操作符。它的作用是將兩個標記連接起來形成一個新的標記 #define TEST1(a) #a #define TEST2(a) b##a/***********************************************************/ 舉例&#xff1a;TEST1(hello) 會…

python virtualenv創建虛擬環境

文章目錄 安裝virtualenv在當前目錄創建虛擬環境命令進入虛擬環境激活虛擬環境查看python版本退出虛擬環境 安裝virtualenv pip install virtualenv在當前目錄創建虛擬環境命令 python -m virtualenv venvPS E:\coding\bertopic> python -m virtualenv venv created virtu…

Linux:Nginx服務重寫功能

目錄 一、重寫功能 1.重寫功能作用 2.rewrite指令 if指令 return指令 set指令 break指令 3.rewrite標志 redirect標志 permanent標志 break標志 last標志 rewrite標志實驗 一、重寫功能 1.重寫功能作用 重寫功能(rewrite)用于實現URL的重寫&#xff0c;URL的重寫是非常有用…

LC打怪錄 283. moving zero

題目鏈接 力扣 class Solution:def moveZeroes(self, nums: List[int]) -> None:l0for r in range(len(nums)):if nums[r]:nums[l], nums[r] nums[r], nums[l]l 1return nums 方法一&#xff1a; 思路 雙指針 1. def moveZeroes(self, nums: List[int]) -> None: …

Stable Diffusion 3正式發布,旨在鞏固其在AI圖像領域相對于Sora和Gemini的領先地位

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

vue3 + vite 項目可以使用純Js開發嗎?

答案&#xff1a;可以 創建項目&#xff1a; 按照鏈接參考或者按官方&#xff1a; webstorm 創建vue3 vite 項目-CSDN博客 項目目錄 tsconfig.json 配置允許js allowJs指定是否編譯js文件&#xff0c;在任意文件當中,如果我們模塊使用js寫的&#xff0c;那么我們需要 將all…

地理空間分析15——Python在應急響應與地理空間分析中的創新應用

目錄 寫在開頭1.Python及其在地理空間分析中的應用地理空間數據處理庫地理空間數據可視化工具 2.應急響應中的Python應用實例2.1 災害風險評估2.2 實時數據分析與響應2.3資源優化分配 3 地震應急響應案例&#xff1a;利用Python進行數據分析3.1 背景介紹3.2 數據收集與處理3.3 …

鏈式插補 (MICE):彌合不完整數據分析的差距

導 讀 數據缺失可能會扭曲結果&#xff0c;降低統計功效&#xff0c;并且在某些情況下&#xff0c;導致估計有偏差&#xff0c;從而破壞從數據中得出的結論的可靠性。 處理缺失數據的傳統方法&#xff08;例如剔除或均值插補&#xff09;通常會引入自己的偏差或無法充分利用數…

機器學習:模型選擇和模型優化

進行數據處理之后&#xff0c;我們得到了x_train和y_train&#xff0c;我們就可以用來進行回歸或分類模型訓練啦~ 一、模型選擇 我們這里可能使用的是回歸模型&#xff08;Regression&#xff09;&#xff0c;值得注意的是&#xff0c;回歸和分類不分家。分類是預測離散值&…

策略的更新、加載與同步

C語言的C庫提供了策略的更新、加載與同步的方法&#xff0c;這里引入多線程&#xff0c;達到區分讀寫任務&#xff08;生產者——消費者 模型&#xff09;的目的。 示例&#xff1a; /*brief check strategy to update, reload, synchronized to read(stoped by SIGINT)author…

Mysql標量子查詢

目錄 子查詢標量子查詢數據準備 子查詢 SQL語句中嵌套select語句&#xff0c;稱為嵌套查詢&#xff0c;又稱子查詢。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查詢外部的語句可以是insert / update / delete / select 的任何一個&…

git的安裝、使用

文章目錄 安裝gitgit學習網站git初始配置具體配置信息 新建版本庫&#xff08;倉庫&#xff09;git的工作區域和文件狀態工作區域文件狀態git文件提交的基礎指令 git基礎指令1. 版本提交2. 分支創建3. 分支切換4. 分支合并(1) git merge(2) git rebase 5. 在git的提交樹上移動(…

Ps:銳化工具

銳化工具 Sharpen Tool可用于增強圖像局部區域的對比度&#xff0c;從而提高圖像的清晰度和細節&#xff0c;特別適用于提升照片的邊緣定義和紋理細節。 快捷鍵&#xff1a;無 ◆ ◆ ◆ 常用操作方法與技巧 1、如果直接在像素圖像上使用銳化工具&#xff0c;可嘗試使用“漸隱…

怎么優雅地訪問ChatGPT

ChatGPT&#xff0c;這顆璀璨的智能結晶&#xff0c;在2022年歲末之際&#xff0c;由OpenAI實驗室傾力鑄就&#xff0c;猶如夜空中躍動的智慧星辰&#xff0c;點亮了人工智能領域的新紀元。猶如汪洋中的一座燈塔&#xff0c;ChatGPT以其獨特的智慧光輝引人注目&#xff0c;然而…