09. Java 客户端与 Spring Data Redis

Lettuce vs Jedis、Spring Data Redis Template、Cache 注解与连接池配置

1. Jedis vs Lettuce

特性JedisLettuce
线程安全否(需连接池)✅(基于 Netty)
连接方式阻塞 BIO异步非阻塞 NIO
连接池必须可选(通常不用)
集群支持较好更好
Spring Boot 默认2.x 以前2.x+

2. Spring Data Redis 配置

spring:
  data:
    redis:
      host: localhost
      port: 6379
      password: secret
      database: 0
      lettuce:
        pool:
          max-active: 8
          max-idle: 8
          min-idle: 0
        cluster:
          refresh:
            adaptive: true
            period: 60s

3. RedisTemplate

@Service
public class CacheService {
    @Autowired private StringRedisTemplate redisTemplate;
    @Autowired private RedisTemplate<String, Object> objectRedisTemplate;

    public void cacheUser(String userId, User user) {
        objectRedisTemplate.opsForValue().set(
            "user:" + userId, user, Duration.ofMinutes(30)
        );
    }

    public void addToList(String key, String item) {
        redisTemplate.opsForList().leftPush(key, item);
        redisTemplate.opsForList().trim(key, 0, 99);  // 保留100条
    }

    // 原子递增
    public Long increment(String key) {
        return redisTemplate.opsForValue().increment(key);
    }

    // 分布式锁
    public boolean tryLock(String key, String value, long seconds) {
        Boolean locked = redisTemplate.opsForValue()
            .setIfAbsent(key, value, Duration.ofSeconds(seconds));
        return Boolean.TRUE.equals(locked);
    }
}

4. @Cacheable 注解

@Configuration
@EnableCaching
public class CacheConfig {
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory cf) {
        return RedisCacheManager.builder(cf)
            .cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10))
                .serializeKeysWith(RedisSerializationContext
                    .SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext
                    .SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
            )
            .build();
    }
}

@Service
public class ProductService {
    @Cacheable(value = "products", key = "#id")
    public Product getProduct(String id) {
        return productRepo.findById(id);
    }

    @CacheEvict(value = "products", key = "#product.id")
    public void updateProduct(Product product) {
        productRepo.save(product);
    }

    @CachePut(value = "products", key = "#product.id")
    public Product refreshProduct(Product product) {
        return product;
    }
}

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「redis」更多文章

  1. Redis 性能调优与生产监控
  2. Redis 事务、Lua 脚本与原子操作
  3. Redis 主从复制与 Sentinel 高可用