我是靠谱客的博主 俭朴高跟鞋,这篇文章主要介绍基于redis的规则流水号生成(二),现在分享给大家,希望可以做个参考。

上文主要包含的最基础的redis自增生成规则流水号。

但仔细分析会发现有几个问题:

1、流水号规则调整了怎么办?只能去改代码?

2、redis切换了怎么办?数据不迁移或者redis挂了从头生成流水号会导致重复怎么办?

3、redis异常怎么办?

 

设计方案:

1、建立流水号规则配置表:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE `crl_serial_number_rule` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `rule_code` varchar(30) NOT NULL COMMENT '规则编码', `rule_desc` varchar(60) NOT NULL COMMENT '规则描述', `prefix` varchar(10) NULL COMMENT '前缀', `date_formatter` varchar(20) NULL COMMENT '日期格式', `random_mark` varchar(10) NOT NULL COMMENT '随机位', `number_type` varchar(10) NOT NULL COMMENT '序号类型,numberTypeEnum:RANDOM 随机;ORDER 顺序', `number_length` varchar(2) NOT NULL COMMENT '序号位数', `number_start` varchar(10) DEFAULT NULL COMMENT '序号起始位', `number_end` varchar(10) DEFAULT NULL COMMENT '序号结束位', `current_number` varchar(10) DEFAULT NULL COMMENT '当前序号', `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modified_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE INDEX `uniq_idx_rule_code` (`rule_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='流水号规则表';

2、针对redis切换,在1中其实已经设计好数据库表,其中的随机位即可降低切换时的重复概率。

3、针对redis异常可以做出补充方案,确保可以生成一个流水号。

附代码(部分引入涉及敏感工程已去除):

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import java.util.concurrent.TimeUnit; /** * @description: * @author: xxx * @date: 2018-06-13 下午3:17 */ @Service public class CrlSerialNumberServiceImpl implements CrlSerialNumberService { private static final Logger logger = LoggerFactory.getLogger(CrlSerialNumberServiceImpl.class); /*每次增长数值*/ private static int increase=100; /*超时时间:代码中与TimeUnit.SECONDS共用*/ private static int expireTime=10; /*重试次数*/ private static int retryCount=5; @Resource private CrlSerialNumberRuleService crlSerialNumberRuleService; @Resource private DistributedLocker distributedLocker; @Resource private CacheBizService cacheClient; @Override public String generateSerialNumberByRuleCode(String ruleCode){ String methodDesc = "按规则编码生成流水号"; StringBuilder crlSerialNumber = new StringBuilder(); logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|查询流水号规则开始" + "|ruleCode:" + ruleCode); CrlSerialNumberRule crlSerialNumberRule = crlSerialNumberRuleService.getSerialNumberRuleByRuleCode(ruleCode); if (null == crlSerialNumberRule) { logger.warn("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|查询流水号规则为空,请检查流水号规则配置" + "|ruleCode:" + ruleCode); return crlSerialNumber.append("ERR").append(new SimpleDateFormat(DateFormatterEnum.yyMMddHHmmss.getCode()).format(new Date())).append(String.valueOf(new Random().nextInt(9))).append(new Random().nextInt(getMaxValueString("8"))).toString(); } logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|查询流水号规则结束" + "|ruleCode:" + ruleCode + "|crlSerialNumberRule:" + crlSerialNumberRule); String dateFormatter = crlSerialNumberRule.getDateFormatter(); String dateString=""; if (StringUtils.isNotBlank(dateFormatter)) { dateString = new SimpleDateFormat(dateFormatter).format(new Date()); } if (NumberTypeEnum.RANDOM.getCode().equals(crlSerialNumberRule.getNumberType())) { String randomMark=""; if(StatusEnum.VALID.getCode().equals(crlSerialNumberRule.getRandomMark())){ randomMark=String.valueOf(new Random().nextInt(9)); } int random=new Random().nextInt(getMaxValueString(crlSerialNumberRule.getNumberLength())); return crlSerialNumber.append(crlSerialNumberRule.getPrefix()).append(dateString).append(randomMark).append(getCurrentValueString(crlSerialNumberRule.getNumberLength(),String.valueOf(random))).toString(); } else if (NumberTypeEnum.ORDER.getCode().equals(crlSerialNumberRule.getNumberType())) { try { logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|加分布式锁开始" + "|ruleCode:" + ruleCode); CrlCommonResponse<String> crlCommonResponse = distributedLocker.lockRetry(ruleCode, expireTime,TimeUnit.SECONDS,retryCount); if(!crlCommonResponse.isSuccess()){ throw new Exception(methodDesc+"加分布式锁失败"); } logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|加分布式锁结束" + "|ruleCode:" + ruleCode + "|crlCommonResponse:"+crlCommonResponse); logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|获取当前key的value值开始" + "|ruleCode:" + ruleCode+"|dateFormatter:"+dateFormatter); String cacheCurrentValue=cacheClient.rpop(crlSerialNumberRule.getPrefix() + dateFormatter + crlSerialNumberRule.getNumberLength()); if(StringUtils.isBlank(cacheCurrentValue)){ /*1 初始化*/ int numberStart; int numberEnd; if (StringUtils.isBlank(crlSerialNumberRule.getCurrentNumber())) { logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|数据库当前值不存在|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); /*1.1 赋初值*/ numberStart=1; numberEnd=numberStart+increase; /*1.2 起始值处理*/ if (StringUtils.isNotBlank(crlSerialNumberRule.getNumberStart())) { logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了起始值,设置为队列起始值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); numberStart=Integer.parseInt(crlSerialNumberRule.getNumberStart()); numberEnd=numberStart+increase; }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号未限制起始值,设置1为队列起始值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); } /*1.3 结束值处理*/ if (StringUtils.isNotBlank(crlSerialNumberRule.getNumberEnd())) { if(numberEnd>Integer.parseInt(crlSerialNumberRule.getNumberEnd())){ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了结束值,比队列结束值小,设置为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); numberEnd=Integer.parseInt(crlSerialNumberRule.getNumberEnd()); }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号未限制结束值,比队列结束值大,设置队列起始值+99为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); } } }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|数据库当前值存在|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); Integer currentNumber= Integer.valueOf(crlSerialNumberRule.getCurrentNumber()); /*2.1 赋初值*/ numberStart=1+currentNumber; numberEnd=1+currentNumber+increase; /*2.2.1 能够够获取值,左空右配置*/ if(StringUtils.isBlank(crlSerialNumberRule.getNumberStart())&&StringUtils.isNotBlank(crlSerialNumberRule.getNumberEnd())){ /*2.2.1.1 当前值与流水号结束值*/ if (currentNumber>=Integer.parseInt(crlSerialNumberRule.getNumberEnd())) { logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了结束值|数据库当前值达到位数最大值,设置1为队列起始值|ruleCode:" + ruleCode+"|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|currentNumber:" + currentNumber); numberStart=1; numberEnd=numberStart+increase; }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了最大值|数据库当前值未达到位数最大值,设置数据库当前值+1为队列起始值|ruleCode:" + ruleCode+"|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue); } /*2.2.1.2 队列结束值与流水号结束值*/ if(numberEnd>Integer.parseInt(crlSerialNumberRule.getNumberEnd())){ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了结束值,比队列结束值小,则设置为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); numberEnd=Integer.parseInt(crlSerialNumberRule.getNumberEnd()); }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了结束值,比队列结束值大,设置队列起始值+99为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); } } /*2.2.2 能够够获取值,左配置右空*/ if(StringUtils.isNotBlank(crlSerialNumberRule.getNumberStart())&&StringUtils.isBlank(crlSerialNumberRule.getNumberEnd())){ /*2.2.2.1 当前值与流水号起始值*/ if(currentNumber<Integer.parseInt(crlSerialNumberRule.getNumberStart())){ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|配置了流水号区间|可能由于修改了规则导致数据库当前值比左区间小,设置为队列起始值|ruleCode:" + ruleCode+"|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|currentNumber:" + currentNumber+"|numberStart:"+crlSerialNumberRule.getNumberStart()); numberStart=Integer.parseInt(crlSerialNumberRule.getNumberStart()); numberEnd=numberStart+increase; }/*2.2.2.1 当前值与长度最大值*/ else if (currentNumber==getMaxValueString(crlSerialNumberRule.getNumberLength())) { logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|数据库当前值达到位数最大值,设置为队列起始值|ruleCode:" + ruleCode+"|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|currentNumber:" + currentNumber); numberStart=Integer.parseInt(crlSerialNumberRule.getNumberStart()); numberEnd=numberStart+increase; } /*2.2.2.2 队列结束值与流水号结束值*/ if(numberEnd>getMaxValueString(crlSerialNumberRule.getNumberLength())){ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号未限制结束值,长度最大值设置为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); numberEnd=getMaxValueString(crlSerialNumberRule.getNumberLength()); }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号未限制结束值,设置队列起始值+99为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); } } /*2.2.3 能够够获取值,左右区间未配置*/ if(StringUtils.isBlank(crlSerialNumberRule.getNumberStart())&&StringUtils.isBlank(crlSerialNumberRule.getNumberEnd())){ /*2.2.3.1 当前值与长度最大值*/ if (currentNumber==getMaxValueString(crlSerialNumberRule.getNumberLength())) { logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|未配置流水号区间,数据库当前值达到位数最大值,从1自增|ruleCode:" + ruleCode+"|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|currentNumber:" + currentNumber); numberStart=1; numberEnd=numberStart+increase; } /*2.2.3.2 队列结束值与长度最大值*/ if(numberEnd>getMaxValueString(crlSerialNumberRule.getNumberLength())){ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|未配置流水号区间,长度最大值设置为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); numberEnd=getMaxValueString(crlSerialNumberRule.getNumberLength()); }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|未配置流水号区间,设置队列起始值+99为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); } } /*2.2.4 能够获取值,左右区间配置*/ if(StringUtils.isNotBlank(crlSerialNumberRule.getNumberStart())&&StringUtils.isNotBlank(crlSerialNumberRule.getNumberEnd())){ /*2.2.4.1 当前值与流水号起始值*/ if(currentNumber<Integer.parseInt(crlSerialNumberRule.getNumberStart())){ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|配置了流水号区间|可能由于修改了规则导致数据库当前值比左区间小,缓存按起始值set|ruleCode:" + ruleCode+"|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|currentNumber:" + currentNumber+"|numberStart:"+crlSerialNumberRule.getNumberStart()); numberStart=Integer.parseInt(crlSerialNumberRule.getNumberStart()); numberEnd=numberStart+increase; }/*2.2.4.1 当前值与流水号结束值*/ else if (currentNumber>=Integer.parseInt(crlSerialNumberRule.getNumberEnd())) { logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了结束值|数据库当前值达到位数最大值,设置1为队列起始值|ruleCode:" + ruleCode+"|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|currentNumber:" + currentNumber); numberStart=Integer.parseInt(crlSerialNumberRule.getNumberStart()); numberEnd=numberStart+increase; } /*2.2.4.2 队列结束值与流水号结束值*/ if(numberEnd>Integer.parseInt(crlSerialNumberRule.getNumberEnd())){ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|配置了流水号区间,比队列结束值小,则设置为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); numberEnd=Integer.parseInt(crlSerialNumberRule.getNumberEnd()); }else{ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|配置了流水号区间,比队列结束值大,设置队列起始值+99为队列结束值|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()); } } } /*2 调用公共方法*/ cacheCurrentValue = updateAndPushAndPop(ruleCode,crlSerialNumberRule, dateFormatter, cacheCurrentValue, numberStart, numberEnd); } String randomMark=""; if(StatusEnum.VALID.getCode().equals(crlSerialNumberRule.getRandomMark())){ randomMark=String.valueOf(new Random().nextInt(9)); } String currentValue = getCurrentValueString(crlSerialNumberRule.getNumberLength(), cacheCurrentValue); logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|释放分布式锁开始" + "|ruleCode:" + ruleCode + "|resData:"+crlCommonResponse.getResData()); distributedLocker.unlock(ruleCode, crlCommonResponse.getResData()); logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|释放分布式锁结束" + "|ruleCode:" + ruleCode + "|resData:"+crlCommonResponse.getResData()); return crlSerialNumber.append(crlSerialNumberRule.getPrefix()).append(dateString).append(randomMark).append(currentValue).toString(); } catch (Exception e) { logger.error("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "异常" + "|ruleCode:" + ruleCode + "|exception:" + e); int i = new Random().nextInt(getMaxValueString(crlSerialNumberRule.getNumberLength())); return crlSerialNumber.append(crlSerialNumberRule.getPrefix()).append(dateString).append(9).append(String.valueOf(i)).toString(); } } return crlSerialNumber.toString(); } /** * 更新数据库当前值、队列入队处理、队列出队获取 * @param ruleCode * @param crlSerialNumberRule * @param dateFormatter * @param cacheCurrentValue * @param numberStart * @param numberEnd * @return * @throws Exception */ private String updateAndPushAndPop(String ruleCode,CrlSerialNumberRule crlSerialNumberRule, String dateFormatter, String cacheCurrentValue, Integer numberStart, Integer numberEnd) throws Exception { String methodDesc = "按规则编码生成流水号"; /*2.1 更新数据库当前值为队列结束值*/ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|更新流水号规则中当前值开始" + "|ruleCode:" + ruleCode+"|numberEnd:"+numberEnd); int updateNum = crlSerialNumberRuleService.updateCurrentNumberByRuleCode(String.valueOf(numberEnd), ruleCode); if(updateNum<=0){ throw new Exception(methodDesc+"更新流水号规则中当前值失败"); } logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|更新流水号规则中当前值结束" + "|ruleCode:" + ruleCode+"|numberEnd:"+numberEnd+"|updateNum:"+updateNum); /*2.2 队列入队开始*/ logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了起始值,入队队列开始|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()+"|numberStart:"+numberStart+"|numberEnd:"+numberEnd); for(int i=numberStart;i<=numberEnd;i++){ cacheClient.lpush(crlSerialNumberRule.getPrefix() + dateFormatter + crlSerialNumberRule.getNumberLength(), String.valueOf(i)); } logger.info("CrlSerialNumberRuleServiceImpl|getSerialNumberRuleByRuleCode|" + methodDesc + "|当前缓存值不存在|流水号限制了起始值,入队队列结束|ruleCode:" + ruleCode + "|prefix:" + crlSerialNumberRule.getPrefix() + "|length:" + crlSerialNumberRule.getNumberLength() + "|cacheCurrentValue:" + cacheCurrentValue+"|currentNumber:"+crlSerialNumberRule.getCurrentNumber()+"|numberStart:"+numberStart+"|numberEnd:"+numberEnd); /*2.3 二次出队获取当前缓存值*/ String str = cacheClient.rpop(crlSerialNumberRule.getPrefix() + dateFormatter + crlSerialNumberRule.getNumberLength()); if (StringUtils.isNotBlank(str)) { cacheCurrentValue=str; }else{ throw new Exception(methodDesc + "入队数据后rpop命令执行失败"); } return cacheCurrentValue; } /** * 字符串补足方法 * @param length * @param currentValue * @return */ private String getCurrentValueString(String length, String currentValue) { String cValue=currentValue; for(int i=cValue.length();i<Integer.parseInt(length);i++){ cValue="0"+cValue; } return cValue; } /** * 字符串最大值 * @param length * @return */ private int getMaxValueString(String length) { String value=""; for(int i=0;i<Integer.parseInt(length);i++){ value="9"+value; } return Integer.parseInt(value); } }

 

最后

以上就是俭朴高跟鞋最近收集整理的关于基于redis的规则流水号生成(二)的全部内容,更多相关基于redis内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(121)

评论列表共有 0 条评论

立即
投稿
返回
顶部