springboot集成redis(一)项目搭建和配置
温馨提示:
本文最后更新于 2023年03月08日,已超过 587 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
springboot集成redis进行数据的操作
1. 创建springboot项目
2. 修改pom.xml文件 添加依赖
<!-- web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring data redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3. 编写测试类,测试插入数据
@Autowired
private RedisTemplate redisTemplate;
@Test
void init () {
ValueOperations ops = redisTemplate.opsForValue();
ops.set("username", "12");
}
注入RedisTemplate bean,然后通过opsForValue方法得到ValueOperations实例对象,调用这个实例对象即可进行操作数据的增加和删除,但是有个问题是插入的数据是二进制的数据,怎么回事呢?
直接就打不开哇!
4. 序列化问题导致存储二进制数据
原来是因为序列化的问题,默认情况下的模板 RedisTemplate<Object, Object>,默认序列化使用的是JdkSerializationRedisSerializer ,存储二进制字节码。这时需要自定义模板,当自定义模板后又想存储String 字符串时,可以使StringRedisTemplate的方式,他们俩并不冲突,我们注入这个bean,然后调用opsForValue试试。
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void init () {
ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue();
ops1.set("username", "test");
}
数据成功被添加进数据库中。
我们来看源码
StringRedisTemplate已经帮我们做好字符串的序列化问题了。
5. 存储object类型的数据如何存储
那么我们存储字符串以及成功了,如果我们想存储一个pojo类呢?object类型的数据该如何存储。
我们只需要创建redis配置类,进行配置,如下:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate (LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//为string类型的key设置序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//为value设置序列化器
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//设置hash key 和 value的序列化器
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
return redisTemplate;
}
}
我们只需要使用jackson的序列化器进行序列化就行了,
常用的序列化器有三个:
- JdkSerializationRedisSerializer 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class),但缺点是序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗 Redis 服务器的大量内存。
- Jackson2JsonRedisSerializer 使用 Jackson 库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。通过查看源代码,发现其只在反序列化过程中用到了类型信息。
- GenericJackson2JsonRedisSerializer 通用型序列化,这种序列化方式不用自己手动指定对象的 Class。
配置好之后就可以使用了。
我们继续执行之前的那个试试。
成功存储。那么我们试试pojo对象能否存储
@Test
public void testSerial () {
User user = new User();
user.setId(1);
user.setName("wangqi");
user.setAge(20);
ValueOperations<String, Object> ops = redisTemplate.opsForValue();
ops.set("user", user);
User user1 = (User) ops.get("user");
System.out.println(user1.toString());
}
控制台打印:
redis数据库:
成功存储,下次如果数据存储失败或者打开是二进制,记得看看配置文件有没有搞进去。
正文到此结束
- 本文标签: Spring Boot redis
- 本文链接: https://blog.wangqi2020.top/article/26
- 版权声明: 本文由王祁原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权