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