最近有点工作说不忙吧也忙,说忙吧也不忙,对接各种卡,你能想象一下你平常开车能开到八十迈却因为堵车只能慢慢挪的节奏,蛋蛋的忧伤。
-
原因:
十一月份进项目起就发现各种表的主键都TM,UUID,真是各种骚操作都有了。因为种种原因,忍到现在趁着堵车的时间,搞了一套主键生成策略(PS:我以前老总监的东西,改改就拿来用了)。
-
思路:
因为这套主键策略是用于分布式场景业务(例如我售后订单业务,我希望售后业务ID格式位prefix + yyyy-MM-dd + 9位数自增数值,不满足0补位。生成结果:SH20190116000000001 ),所以我们需要考虑它的唯一性或者说分布式锁机制,大家都知道redis 针对操作来说是单线程的,所以这边我利用了它的自增特性来解决了这个核心的问题。关于redis 自增存取的key值 key = tableName+yyyy-MM-dd格式,例如:我库表有一百张表,每天生产的key 一百个,一年就是365 X 100=3.65W个key,随着时间的递增key会越来越多,所以建议这部分数据最好存取到指定区域(分片、hash取模)方便管理,后期也方便用来做统计报表。当然你只想做单纯分布式主键key = tableName就可以了。
-
代码片段:
一、DATE工具类
package com.honghu.cloud.utils;
import java.sql.Timestamp;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.lang.time.FastDateFormat;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Date Utility Class. And please use Apache common DateUtils to add, judge
* equality, round, truncate date.
* @Date 2019年1月14日 - 下午6:14:07
* @Info 初始版本
* @Version 1.0
* @see org.apache.commons.lang.time.DateUtils
*/
public class DateUtil
{
protected static final Log log = LogFactory.getLog(DateUtil.class);
/**
* FastDateFormat cache map
*/
protected static Map<String, FastDateFormat> dateFormatMap = new HashMap<String, FastDateFormat>();
/**
* Date format pattern
*/
public final static String FORMAT_DATE_DEFAULT = "yyyy-MM-dd";
public final static String FORMAT_DATE_YYYYMMDD = "yyyyMMdd";
public final static String FORMAT_DATE_YYYY_MM_DD = "yyyy-MM-dd";
public final static String FORMAT_DATE_SLASH_YYYY_MM_DD = "yyyy/MM/dd";
public final static String FORMAT_DATE_SLASH_YYYY_M_DD = "yyyy/M/dd";
public final static String FORMAT_DATE_SLASH_YYYY_MM_D = "yyyy/MM/d";
public final static String FORMAT_DATE_SLASH_YYYY_M_D = "yyyy/M/d";
public final static String FORMAT_DATE_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
/**
* DateTime format pattern
*/
public final static String FORMAT_DATETIME_DEFAULT = "yyyy-MM-dd HH:mm";
public final static String FORMAT_DATETIME_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public final static String FORMAT_DATETIME_YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
public final static String FORMAT_DATETIME_YYYY_MM_DD_HHMM = "yyyy-MM-dd HHmm";
public final static String FORMAT_DATETIME_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
public final static String FORMAT_DATETIME_YYYY_MM_DD_HHMMSS = "yyyy-MM-dd HHmmss";
public final static String FORMAT_DATETIME_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public final static String FORMAT_DATETIME_EXIF = "yyyy:MM:dd HH:mm:ss";
public final static String FORMAT_DATETIME_YYYY_MM_DDHH_MM = "yyyy-MM-ddHH:mm";
/**
* Time format pattern
*/
public final static String FORMAT_TIME_DEFAULT = "HH:mm";
public final static String FORMAT_TIME_HH_MM = "HH:mm";
public final static String FORMAT_TIME_HHMM = "HHmm";
public final static String FORMAT_TIME_HH_MM_SS = "HH:mm:ss";
public final static Strin