借用redis实现自维护的主键或流水号生成策略

表的主键,大家都知道,表记录的唯一标识;流水号,即唯一识别码,独一无二实现精准匹配使用的。

表主键的设计原则:

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 

说明:命令模式下,命令不区分大小写。

                        借用redis实现自维护的主键或流水号生成策略_第1张图片

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;
    }


}

 

你可能感兴趣的:(解决方案)