use std::sync::LazyLock; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use redis::Script; use crate::error::{CacheError, CacheResult}; use crate::keys; use crate::kv::{Cache, millis}; const RELEASE_CODE: &str = r#" if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) end return 0 "#; const REFRESH_CODE: &str = r#" if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('PEXPIRE', KEYS[1], ARGV[2]) end return 0 "#; const INCR_EX_CODE: &str = r#" local value = redis.call('INCR', KEYS[1]) if value == 1 then redis.call('PEXPIRE', KEYS[1], ARGV[1]) end return value "#; /// 验证码原子消费:值匹配时同时删除验证码与尝试计数,匹配失败不动键。 const CONSUME_MATCHING_CODE: &str = r#" if redis.call('GET', KEYS[1]) == ARGV[1] then redis.call('DEL', KEYS[1]) redis.call('DEL', KEYS[2]) return 1 end return 0 "#; const LOCK_MANY_CODE: &str = r#" for index = 1, #KEYS do if redis.call('SET', KEYS[index], ARGV[1], 'PX', ARGV[2], 'NX') == false then for released = 1, index - 1 do redis.call('DEL', KEYS[released]) end return 0 end end return 1 "#; static RELEASE: LazyLock