Redis实现数字自增并且排除指定范围的数据

1.维护排除列表:在 Redis 中维护一个已导入的 my_id 列表,存储所有导入过程中出现的特殊 my_id 数字部分(例如,F9999999 的数字部分为 9999999)。

2.自增时跳过已存在的 my_id:每次生成新的 my_id 时,先检查自增值是否在排除列表中,若在,则继续自增,直到找到不在排除列表中的值为止。

public class MyIdGeneratorService {
    
    @Autowired
    private StringRedisTemplate redisTemplate;

    private static final String MY_ID_KEY = "capex_draft_tool:my_id";
    private static final String EXCLUDED_KEY = "capex_draft_tool:excluded_ids";

    // 生成 my_id
    public String generateMyId(String fab) {
        String prefix = getPrefixByFab(fab);
        Long idValue;
        do {
            // 自增并获取新的 id
            idValue = redisTemplate.opsForValue().increment(MY_ID_KEY);
        } while (redisTemplate.opsForSet().isMember(EXCLUDED_KEY, idValue.toString()));

        String formattedNumber = String.format("%07d", idValue);
        return prefix + formattedNumber;
    }

    // 导入时将my_id的数值部分记录到排除列表
    public void importMyId(String importedMyId) {
        int importedNumber = Integer.parseInt(importedMyId.substring(1));
        redisTemplate.opsForSet().add(EXCLUDED_KEY, String.valueOf(importedNumber));
    }

    // 根据 fab 获取前缀
    private String getPrefixByFab(String fab) {
        switch (fab) {
            case "A1":
                return "F";
            default:
                return "X";
        }
    }
}

方案说明

  • EXCLUDED_KEY:这是一个 Redis Set 集合,用于存储导入过程中已存在的特殊 my_id 数字部分
  • 生成新 my_id
    1.每次自增得到新值后,先查询 EXCLUDED_KEY 集合,判断该值是否被占用。
    2.若占用则继续自增,直到找到不在排除列表中的值为止
  • 当导入的 my_id不符合生成规则时,将其数字部分添加到 EXCLUDED_KEY 集合中,以确保后续生成不会重复

优点

  • 避免浪费中间未使用的数值:通过排除列表,只占用必要的特殊数值,保留中间未使用的范围
  • 可扩展性强:可以灵活应对后续其他特殊 my_id 的导入,不影响自增策略。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值