redis ID生成器

package com.courier.alert.common.utils.uuid;

import com.courier.alert.common.constant.CacheConstants;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;


@Component
public class IdGenerator {

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    public String generateKey() {
        // 获取当前时间戳,格式为"yyyyMMddHHmmssSSS"
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String timestamp = sdf.format(new Date());

        // 定义Lua脚本
        String script = "local key = KEYS[1]\n" +
                "local current = redis.call('INCR', key)\n" +
                "if current > 999 then\n" +
                "    redis.call('SET', key, '1')\n" +
                "    return 1\n" +
                "else\n" +
                "    return current\n" +
                "end";

        // 设置Redis脚本
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptText(script);
        redisScript.setResultType(Long.class);

        // 执行Lua脚本获取计数器值
        List<String> keys = Collections.singletonList(CacheConstants.TIMESTAMP_COUNTER);
        Long counter = redisTemplate.execute(redisScript, keys);
        // 拼接时间戳和计数器生成ID
        return timestamp + String.format("%03d", counter);
    }

}
posted @ 2025-07-01 18:55  R.困兽  阅读(10)  评论(0)    收藏  举报