原创

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数据库:

成功存储,下次如果数据存储失败或者打开是二进制,记得看看配置文件有没有搞进去。

正文到此结束
本文目录