1. import com.tuling.TulingmallOrderApplication;
    2. import com.tuling.tulingmall.util.RedisOpsUtil;
    3. import lombok.Getter;
    4. import lombok.Setter;
    5. import org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator;
    6. import java.text.SimpleDateFormat;
    7. import java.util.Date;
    8. import java.util.Properties;
    9. import java.util.concurrent.TimeUnit;
    10. /**
    11. * @description: 全局唯一主键生成器【分库分表专用】
    12. **/
    13. public class OrderByRedisKeyGenerator implements ShardingKeyGenerator {
    14. @Getter
    15. private final String type = "CUSTOM";
    16. @Getter
    17. @Setter
    18. private Properties properties = new Properties();
    19. /**
    20. * 生成18位订单编号:8位日期+3位平台ID+7位以上自增id
    21. * 需在分表策略当中配置如下属性
    22. * spring.shardingsphere.sharding.tables.oms_order.key-generator.column=id
    23. * spring.shardingsphere.sharding.tables.oms_order.key-generator.type=CUSTOM
    24. * spring.shardingsphere.sharding.tables.oms_order.key-generator.props.worker.id=123
    25. * spring.shardingsphere.sharding.tables.oms_order.key-generator.props.redis.prefix=order:id:prefix:
    26. */
    27. @Override
    28. public Comparable<?> generateKey() {
    29. StringBuilder sb = new StringBuilder();
    30. RedisOpsUtil redisOpsUtil = TulingmallOrderApplication.getBean("redisOpsUtil");
    31. String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
    32. String key = properties.getProperty("redis.prefix") + date;
    33. //增长值
    34. Long increment = null;
    35. if(redisOpsUtil.hasKey(key)){
    36. increment = redisOpsUtil.incr(key,1);
    37. }else{
    38. increment = redisOpsUtil.incr(key,1);
    39. redisOpsUtil.expire(key,24, TimeUnit.HOURS);
    40. }
    41. sb.append(date);
    42. sb.append(String.format("%03d", Integer.parseInt(properties.getProperty("worker.id"))));
    43. String incrementStr = increment.toString();
    44. if (incrementStr.length() <= 7) {
    45. sb.append(String.format("%07d", increment));
    46. } else {
    47. sb.append(incrementStr);
    48. }
    49. return Long.parseLong(sb.toString());
    50. }
    51. }