1. Jedis vs Lettuce
| 特性 | Jedis | Lettuce |
|---|---|---|
| 线程安全 | 否(需连接池) | ✅(基于 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;
}
}
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。