Redis02-Springboot集成Redis
1.RedisTemplateRedis事务操作
void redisTest01() {
// redisTemplate不保证以相同的连接运行事务中的所有操作,即一个事务中的多个命令可能会被多个客户端运行。
// 所以想要使用redisTemplate保证事务,就需要使用SessionCallback。
// 或者使用 @EnableTransactionManagement 注解配置redisTemplate支持事务
List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations operations) throws DataAccessException {
// multi 开启事务
operations.multi();
// 事务中的一些列操作
operations.opsForValue().set("name", "tom");
// 提交事务
return operations.exec();
}
});
//System.out.println(txResults);
System.out.println(redisTemplate.opsForValue().get("name"));
}
2.RedisTemplate基本数据类型的操作
void redisTest02() {
redisTemplate.opsForValue(); // String
redisTemplate.opsForHash(); // Hash
redisTemplate.opsForList(); // List
redisTemplate.opsForSet(); // Set
redisTemplate.opsForZSet(); // ZSet
redisTemplate.opsForGeo(); // Geospatial
redisTemplate.opsForHyperLogLog(); //HyperLogLog
// 操作数据库的连接
redisTemplate.getConnectionFactory().getConnection().flushDb();
redisTemplate.getConnectionFactory().getConnection().flushAll();
// 切换数据库
redisTemplate.getConnectionFactory().getConnection().select(0);
// bitmap的操作
byte[] key = new byte[10];
redisTemplate.getConnectionFactory().getConnection().setBit(key, 1, true);
// bitmap的操作
redisTemplate.opsForValue().setBit("name", 1, true);
}
3.RedisTemplate保存对象
- 将对象转换为Json。
void redisTest03() {
// Redis保存对象的方式一,将User转换为JSON字符串的形式保存,此时User不需要实现Serializable接口
User user = new User();
user.setId(1);
user.setName("tom");
String jsonString = JSON.toJSONString(user);
redisTemplate.opsForValue().set("user:1", jsonString);
// {"id":1,"name":"tom"}
System.out.println(redisTemplate.opsForValue().get("user:1"));
}
- 直接保存对象
void redisTest04() {
// Redis保存对象的方式二,直接保存User对象,此时User需要实现Serializable接口。
// 如果没有实现Serializable接口。,会抛出异常。
// DefaultSerializer requires a Serializable payload but received an object of type [com.my.springboot.pojo.User]
User user = new User();
user.setId(1);
user.setName("tom");
redisTemplate.opsForValue().set("user:2", user);
// {"id":1,"name":"tom"}
System.out.println(redisTemplate.opsForValue().get("user:2"));
}
- 序列化RedisTemplate
void redisTest05() {
// Redis保存对象的方式三,在RedisConfig中定义Redis序列化方式。
// 此时直接保存User对象,而User不需要实现Serializable接口,也不会报错,因为已经在
// RedisConfig中定义了String类型的value的序列化方式。
// 并且使用自定义序列化方式后,在Redis中保存的key和value也不会被转义。
User user = new User();
user.setId(1);
user.setName("tom");
redisTemplate.opsForValue().set("user:2", user);
// {"id":1,"name":"tom"}
System.out.println(redisTemplate.opsForValue().get("user:2"));
}
// 序列化RedisTemplate的配置
@Configuration
public class RedisConfig {
/**
* 自定义RedisTemplate,设置序列化的方式
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> template(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化(默认采用的是JDK序列化)
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
StringRedisSerializer serializer = new StringRedisSerializer();
// String的key使用StringRedisSerializer序列化方式
redisTemplate.setKeySerializer(serializer);
redisTemplate.setHashKeySerializer(serializer);
// String的value使用Jackson2JsonRedisSerializer的序列化方式
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
// 将配置写入Properties文件
//redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}