SpringBoot中的Redis
在 SpringBoot2.x 之后,原来使用的jedis被替换为了lettuce?
jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接 池! 更像 BIO 模式
lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据 了,更像 NIO 模式
环境搭建与测试
1.创建一个SpringBoot项目。选择要导入的依赖。最重要的是导入Redis依赖。
2.编写配置文件。使用WIndows本地的Redis(确保Redis运行)
3.在测试类中进行测试
五大数据类型
- opsForValue() 操作字符串 类似String
- opsForList() 操作List 类似List
- opsForSet() 操作Set 类似Set
- opsForZSet() 操作ZSet 类似ZSet
- opsForHash() 操作Hash 类似Hash
特殊数据类型
- opsForGeo()
- opsForHyperLogLog()
@Test
void contextLoads() {
//五大数据类型
//opsForValue() 操作字符串 类似String
//opsForList() 操作List 类似List
//opsForSet() 操作Set 类似Set
//opsForZSet() 操作ZSet 类似ZSet
//opsForHash() 操作Hash 类似Hash
//特殊数据类型
//opsForGeo()
//opsForHyperLogLog()
//除了基本的操作,我们常用的方法都可以通过redisTemplate操作。比如事务,和基本的CRUD
redisTemplate.opsForValue().set("mykey", "kylin");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}
复制代码
自定义RedisTemplate
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
// 默认的 RedisTemplate 没有过多的设置,redis 对象都是需要序列化!
// 两个泛型都是 Object, Object 的类型,我们后使用需要强制转换 <String, Object>
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
// 由于 String 是redis中最常使用的类型,所以说单独提出来了一个bean!
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
复制代码
首先我们编写一个实体类User
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
//所有的pojo都要序列化
public class User implements Serializable {
private String name;
private int age;
}
复制代码
在测试类中测试像Redis存储一个User对象
@Test
void test2() {
//真实的开发一般都是用Json来传递对象
User user = new User("kylin", 18);
//String jsonUser = new ObjectMapper().writeValueAsString(user)
redisTemplate.opsForValue().set("user", user);
System.out.println(redisTemplate.opsForValue().get("user"));
}
复制代码
成功存储并获取到~
但是我们在使用redis-cli连接redis。发现在redis中存储的数据变成了像乱码一样的字符串。
只是因为redis默认序列化时会使用jdk序列化器。要想解决这样的问题题我们就要自定义配置RedisTemplate
1.首先我们创建一个config包在包下编写一个