引入
org.springframework.data
spring-data-redis
2.0.9.RELEASE
连接 Redis
使用 Lettuce
或者 Jedis
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
}
@Configuration
class AppConfig {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
}
使用哨兵模式
/**
* jedis
*/
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new JedisConnectionFactory(sentinelConfig);
}
/**
* Lettuce
*/
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new LettuceConnectionFactory(sentinelConfig);
}
使用 RedisTemplate
Spring 提供了 RedisTemplate 类来操作 Redis,它高度抽象了 Redis 的各种操作, 根据不同的数据类型提供了对应的 operation,常用的如
因为我们通常使用 String 作为 key 和 value,所以 Spring 提供了 StringRedisTemplate
类,该类使用 StringRedisSerializer
进行序列化.
一个例子:
public class Example {
@Autowired
private StringRedisTemplate redisTemplate;
public void addLink(String userId, URL url) {
redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
}
}
序列化
Spring 提供了多种序列化方式
JdkSerializationRedisSerializer
RedisTemplate 默认序列化器,使用 JDK 原生序列化方式StringRedisSerializer
Jackson2JsonRedisSerializer
使用 Jackson, 以 JSON 格式存储数据GenericJackson2JsonRedisSerializer
使用 Jackson, 以 JSON 格式存储数据, JSON 中会存储对象类型我们在 Java 中经常要存储对象, 此时可配置 Jackson2JsonRedisSerializer
或者 GenericJackson2JsonRedisSerializer
@Bean
public RedisTemplate<String, Person> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<String, Person> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Person.class));
return redisTemplate;
}
或者
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
两者的区别是 GenericJackson2JsonRedisSerializer
在构造时不需要指定一个 Java 对象类型,当你需要存储不同的 Java 对象,又不想配置多个 RedisTemplate 的时候,就可以使用 GenericJackson2JsonRedisSerializer
,在 Redis 中查看数据,可以发现 GenericJackson2JsonRedisSerializer
存储的 JSON 数据会多一个 @Class
的键,存储了该 JSON 对应的 Java 数据类型.
管道
多个操作使用管道能减少网络通讯消耗的时间。RedisTemplate
提供了几个方法来进行管道操作,如果不关心返回值,则可直接使用 execute
方法,如果需要返回值,使用 executePipelined
方法。
List<Object> results = stringRedisTemplate.executePipelined(
new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for(int i=0; i< batchSize; i++) {
stringRedisConn.rPop("myqueue");
}
return null;
}
});
RedisCallback 中 doInRedis 的返回值必须为 null
另一个重载的方法传递 SessionCallback
public List<Object> getLockers(List<Integer> ids) {
return redisTemplate.executePipelined(new SessionCallback<Locker>() {
@Override
public <K, V> Locker execute(RedisOperations<K, V> operations) throws DataAccessException {
return null;
}
});
}