Redis篇章------通过Redis Incr 命令生成唯一编号

记录下实际开发中遇到生成唯一有序的编号需求如ZZ190500001末尾自增,一开始想到数据库来生成但是过于麻烦就直接把这个想法给干掉,之后想了一圈 想到想到了Redis incr命令。

一、了解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命令实现编号需求

通过一和二我们可以基本了解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"));
  }

}

至此工具类也就写好了,如果各位有更好的方式不妨一起讨论下。

你可能感兴趣的:(Redis)