表的主键,大家都知道,表记录的唯一标识;流水号,即唯一识别码,独一无二实现精准匹配使用的。
表主键的设计原则:
1、表主键倾向设计为数值类型
一般情况下,主键定义为数值类型,比如:int类型,bigint类型。
目的:
1)从小累加,使用空间小;
2)方便比较,因为有小到大,自然有序,查询时候方便锁定数据范围,借用主键索引,提高查询效率;比如查询大于某时间范围的,其中主键大小可以确定是大于某值的。
2、使用数据库主键自增机制
在生产中,表主键生成策略,一般是使用数据库的自增机制。如下表:
CREATE TABLE `user` (
`uid` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`age` int(3) DEFAULT NULL,
`phone` varchar(120) DEFAULT NULL,
`passwd` varchar(12) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8
3、流水号的自增维护
在集群模式下,不使用数据库实现流水号的生成功能,可以借用redis。
其中命令有一下两种:
INCRBY rank 1
INCR rank
说明:命令模式下,命令不区分大小写。
4、代码实现自增的订单号
import com.sinosig.dao.OrderDetailDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* Created by Liuxd
*/
@Component("ddcloudIdGenerator")
public class DdcloudIdGenerator {
private static final Logger log = LoggerFactory.getLogger(DdcloudIdGenerator.class);
public static final String showIdkey = "showIdkey";
@Resource
private RedisTemplate redisTemplate;
@Resource
private OrderDetailDao orderDetailDao;
public String getNewShowId() {
String showId = "";
try {
long showIdValue = redisTemplate.opsForValue().increment(showIdkey, 1);
if (showIdValue<10000) {
redisTemplate.delete(showIdkey);
showId = orderDetailDao.getMaxShowId();
long value = Long.parseLong(showId) + 1;
long result = redisTemplate.opsForValue().increment(showIdkey, value);
showId = String.valueOf(result);
} else {
showId = String.valueOf(showIdValue);
}
} catch (Exception e) {
log.info("生成主键报错");
e.printStackTrace();
}
return showId;
}
}