Java-高性能缓存Redis Lua 脚本

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);
    }
}
相关推荐
兮动人1 小时前
Eureka注册中心通用写法和配置
java·云原生·eureka
爱编程的小白L3 小时前
基于springboot志愿服务管理系统设计与实现(附源码)
java·spring boot·后端
聪明的笨猪猪5 小时前
Java Redis “持久化”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
聪明的笨猪猪5 小时前
Java Redis “核心基础”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
奋斗的小monkey7 小时前
Spring Boot 3.x核心特性与性能优化实战
java·spring boot·微服务·性能优化·响应式编程
程序猿DD8 小时前
将 GPU 级性能带到企业级 Java:CUDA 集成实用指南
java·架构
一成码农9 小时前
JavaSE面向对象(上)
java
qq_574656259 小时前
java-代码随想录第66天|Floyd 算法、A * 算法精讲 (A star算法)
java·算法·leetcode·图论
我是好小孩9 小时前
【Android】六大设计原则
android·java·运维·服务器·设计模式