记录一个小bug

记录一次bug

项目中生成店铺时需要生成唯一的店铺码。利用redis的自增。昨天redis换了,原有的key并没有同步过来。当新增店铺时就会报错。
通过本地测试打印日志发现了问题
原有sql

1
2
3
4
5
6
7
SELECT
substring( shop.shop_code, 5, 10 ) AS codeNum
FROM
catering_shop shop
ORDER BY
codeNum + 0 DESC
LIMIT 1;

店铺码是六位的,这里取的是从第五个位置开始取,取长度为10的字符。不晓得这里为啥这么写。当数字超过一百,就取不到最大的店铺码了
这里改了下

1
2
3
4
5
6
7
SELECT
CAST(shop.shop_code AS SIGNED) AS codeNum
FROM
catering_shop shop
ORDER BY
codeNum + 0 DESC
LIMIT 1;

因为店铺码是左位补0的,这里不用CAST函数也行,返回的用integer接收就好了。
下面是生成的部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public String shopCode(Integer max) {
// MC+年份(20)
String prefix = CodeGenerator.shopCodePrefix();

if (shopCodeCache.hasKey(prefix)) {
Long num = shopCodeCache.increment(prefix, 1);
return CodeGenerator.autoGenericCode(String.valueOf(num), 6);
}

if (max != null) {
Long num = shopCodeCache.increment(prefix, max);
return CodeGenerator.autoGenericCode(String.valueOf(num), 6);
}
return null;
}

这里的increment方法是jetCache里面的,返回的是已经自加了的数字。又在autoGenericCode方法里面加1了一次。最终redis里面保存的最大店铺码比数据库的要少1。

评论

:D 一言句子获取中...