借用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 

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

                        

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


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风化作秋雨

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值