Redis LuacnaRedis Lua 脚本
日期+ 自增Id(位数不足前面补零)
例:
日期:20210309 + 自增(5位)
2021030900001
local key = tostring(KEYS[1]);
local count = tonumber(KEYS[2]);
local dateStr = tostring(KEYS[3]);
local newKey = key .. "_" .. dateStr;
local numRedis = redis.call("incr", newKey);
print(numRedis);
if (numRedis == 1) then
redis.call("expire",newKey,60);
end
-- 计算数字的位数
local function DightNum(num)
if math.floor(num) ~= num or num < 0 then
return -1;
elseif 0 == num then
return 1;
else
local tmp_dight = 0;
while num > 0 do
num = math.floor(num/10);
tmp_dight = tmp_dight + 1;
end
return tmp_dight;
end
end
-- 在整数数字前面加0
-- dest_dight 标识最终生成位数,例如 AddZeroFrontNum(5, 1) 计算后是00001
local function AddZeroFrontNum(dest_dight, num)
local num_dight = DightNum(num);
if -1 == num_dight then
return -1;
elseif dest_dight <= num_dight then
return tostring(num);
else
local str_e = ""
for var =1, dest_dight - num_dight do
str_e = str_e .. "0";
end
return str_e .. tostring(num);
end
end
local idStr = AddZeroFrontNum(count, numRedis);
return dateStr .. idStr;
注:windows 下面redis-cli 执行lua脚本,必须git bash 下面执行,cmd下面没有cat命令,所以不能执行
./redis-cli -a root@123 script load "$(cat getGenerateId.lua)"
sha :8b760e96cba49659ae2e2e33eeeefa9347dcccbd
参数说明: evalsha sha numkeys key1 key2 key3
参数总数量 key1 key2 key3
./redis-cli -a root@123 evalsha 8b760e96cba49659ae2e2e33eeeefa9347dcccbd 3 orderid 5 20210310
Java Springboot
@Service
public class RedisGenerateIdServiceImpl {
private static final DateFormat df = new SimpleDateFormat("yyyyMMdd");
@Autowired
private RedisTemplate<String, String> redisTemplate;
private DefaultRedisScript<String> redisScript;
@PostConstruct
public void init(){
redisScript = new DefaultRedisScript<>();
redisScript.setResultType(String.class);
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("luascript/getGenerateId.lua")));
}
public String executeScript(DefaultRedisScript<String> script, final List<String> keys) {
return redisTemplate.execute(script, keys);
}
/**
* 每秒从 1 开始生成唯一标识,包括时间戳:yyyyMMdd
* 最终格式为:yyyyMMdd + 四位有序数字
* @param sha redis中生成lua脚本的序列号
* @param key redis中存放id的key前缀
* @param length 后面生成有序数字的位数
* @return
*/
public Long fetchUUID(DefaultRedisScript<String> script, String key, String length){
if(Objects.isNull(script)){
script = redisScript;
}
List<String> keys = new ArrayList<>();
keys.add(key);
keys.add(length);
Calendar now = new GregorianCalendar();
String datetime = df.format(now.getTime());
keys.add(datetime);
String result = executeScript(script, keys);
return Long.parseLong(result);
}
}