记录下实际开发中遇到生成唯一有序的编号需求如ZZ190500001末尾自增,一开始想到数据库来生成但是过于麻烦就直接把这个想法给干掉,之后想了一圈 想到想到了Redis incr命令。
Redis Incr 命令将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
redis Incr 命令基本语法如下:
redis 127.0.0.1:6379> INCR KEY_NAME
实例
redis> SET page_view 20 OK redis> INCR page_view (integer) 21 redis> GET page_view # 数字值在 Redis 中以字符串的形式保存 "21"
通过一和二我们可以基本了解Incr的作用,现在基本就是编号代码怎么处理,第一步编写一个util工具类
public class SeqUtils{
//获取时间格式为1903
public static String getTimeYYMM() {
String year = new SimpleDateFormat("yy", Locale.CHINESE).format(Calendar.getInstance().getTime());
String month = new SimpleDateFormat("MM", Locale.CHINESE).format(Calendar.getInstance().getTime());
String dateString = year + "-" + month;
return dateString;
}
//获取当月的天数
public static int getCurrentMonthDay(){
Calendar dar=Calendar.getInstance();
dar.set(Calendar.DATE,1);
dar.roll(Calendar.DATE,-1);
int maxDate=dar.get(Calendar.DATE);
return maxDate;
}
/从0开始
public static String getScaleSeq(String key, String number, RedisUtil redisUtil){
String order = "";
Long incr = redisUtil.redisIncr(key, getCurrentMonthDay());
order = number + format + incr;
return order;
}
//从1开始
public static String getSeqNumber(String key, String number, String format, RedisUtil redisUtil){
String order = "";
String dateString = getTimeYYMM();
Long incr = redisUtil.redisIncr(key + dateString, getCurrentMonthDay());
if (incr.longValue() == 0L) {
incr = redisUtil.redisIncr(key + dateString, getCurrentMonthDay());
}
DecimalFormat df = new DecimalFormat(format);
String[] drs = dateString.split("-");
for (int i = 0; i < drs.length; i++) {
order = order + drs[i];
}
order = number + order + df.format(incr);
return order;
}
public static void main(String[] args) {
System.out.println(SeqUtils.getScaleSeq("ZZ","000000"));
System.out.println(SeqUtils.getSeqNumber("WZ","ZZ","00000"));
}
}
至此工具类也就写好了,如果各位有更好的方式不妨一起讨论下。