Redis Plugin
对应模块:
io.gitee.lcgyl:lcgyl-redis-plugin
基于 Lettuce 的高性能响应式 Redis 客户端集成。
✨ 特性
- ✅ 全栈支持 - 同时支持 Reactive API 和 Synchronous API
- ✅ 连接池管理 - 内置 Commons Pool 2 连接池配置
- ✅ 分布式锁 - 集成 RedLock 算法实现
- ✅ Lua 脚本 - 便捷的脚本执行封装
- ✅ Codec 支持 - 内置 JSON (Jackson), String, Protobuf 序列化
🚀 快速开始
依赖引入
gradle
implementation 'io.gitee.lcgyl:lcgyl-redis-plugin:2.2.0'配置
yaml
lcgyl:
redis:
host: localhost
port: 6379
password: ""
database: 0
pool:
max-active: 8
max-idle: 8
min-idle: 0
timeout: 3s基础操作
java
@Service
public class UserCacheService {
@Inject
private RedisTemplate<String, Object> redisTemplate;
// String 操作
public void cacheUser(User user) {
String key = "user:" + user.getId();
redisTemplate.opsForValue().set(key, user, Duration.ofMinutes(30));
}
public User getUser(String userId) {
return (User) redisTemplate.opsForValue().get("user:" + userId);
}
// Hash 操作
public void cacheUserProfile(String userId, Map<String, String> profile) {
redisTemplate.opsForHash().putAll("profile:" + userId, profile);
}
// List 操作
public void addToQueue(String queueName, Object item) {
redisTemplate.opsForList().rightPush(queueName, item);
}
// Set 操作
public void addToSet(String userId, String... tags) {
redisTemplate.opsForSet().add("user:tags:" + userId, tags);
}
// ZSet 操作:排行榜
public void updateScore(String userId, double score) {
redisTemplate.opsForZSet().add("leaderboard", userId, score);
}
public Set<Object> getTop10() {
return redisTemplate.opsForZSet().reverseRange("leaderboard", 0, 9);
}
}响应式 API
java
@Service
public class ReactiveRedisService {
@Inject
private ReactiveRedisTemplate<String, Object> reactiveTemplate;
public Mono<Boolean> cacheAsync(String key, Object value) {
return reactiveTemplate.opsForValue()
.set(key, value, Duration.ofMinutes(30));
}
public Flux<Object> scanKeys(String pattern) {
return reactiveTemplate.keys(pattern)
.flatMap(key -> reactiveTemplate.opsForValue().get(key));
}
}Lua 脚本执行
java
@Service
public class RedisScriptService {
@Inject
private RedisScriptExecutor scriptExecutor;
// 原子性扣减库存
public boolean deductStock(String productId, int quantity) {
String script = """
local stock = redis.call('GET', KEYS[1])
if stock and tonumber(stock) >= tonumber(ARGV[1]) then
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1
end
return 0
""";
Long result = scriptExecutor.execute(script,
List.of("stock:" + productId),
String.valueOf(quantity));
return result == 1;
}
}Pipeline 批量操作
java
@Service
public class BatchRedisService {
@Inject
private RedisTemplate<String, Object> redisTemplate;
public void batchSet(Map<String, Object> data) {
redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
data.forEach((key, value) -> {
connection.stringCommands().set(
key.getBytes(),
serialize(value)
);
});
return null;
});
}
}