Skip to content

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;
        });
    }
}

Released under the Apache License 2.0