手写基于redis-lua脚本实现分布式id生成器starter
以下是一个简化的Redis分布式ID生成器的示例代码。这个示例使用Lua脚本与Redis一起工作,以原子方式生成唯一的ID。
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import java.util.Collections;
public class RedisDistributedIdStarter {
private final StringRedisTemplate stringRedisTemplate;
private final DefaultRedisScript<Long> redisScript;
public RedisDistributedIdStarter(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
// Lua脚本用于生成分布式唯一ID
String script =
"local key = KEYS[1] " +
"local field = ARGV[1] " +
"local count = redis.call('HINCRBY', key, field, 1) " +
"return count - 1"; // 返回自增前的值作为ID
this.redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(script);
redisScript.setResultType(Long.class);
}
public long generateId(String keyPrefix, String idCategory) {
// 使用Lua脚本原子增加计数
Long id = stringRedisTemplate.execute(redisScript,
Collections.singletonList(keyPrefix), Collections.singletonList(idCategory));
return id;
}
}
使用方法:
RedisDistributedIdStarter idStarter = new RedisDistributedIdStarter(stringRedisTemplate);
long uniqueId = idStarter.generateId("prefix:", "category");
这个示例中,我们定义了一个RedisDistributedIdStarter
类,它使用提供的StringRedisTemplate
来执行Lua脚本。每次调用generateId
方法时,它都会使用指定的键前缀和类别来生成一个唯一的ID。这个ID实际上是在给定类别中调用次数减一的结果,因此它是递增的。
评论已关闭