springboot简单操作redis
1.导包
<!--springboot整合redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.编写启动类
@SpringBootApplication(scanBasePackages = "com.zyx")
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class,args);
}
}
3.编写测试controller,执行http://localhost:8080/demo
@RestController
public class RedisController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/demo")
public void test(){
//往redis中存入name:xiaoming
redisTemplate.opsForValue().set("name","xiaoming");
}
}
虚拟机连接redis,查询发现结果是空的,通过代码拿取存储的值
Object name = redisTemplate.opsForValue().get("name");
System.out.println("拿到的redis值:"+name);
控制台拿到存入的值,redis客户端,也有存入值,这是为什么呢?
这是因为redis存储的结果string类型字符串,但是实际开发中我们是需要存储复杂的数据类型肯定不只是单单的string类型.spring帮我们把存储的值给序列化了,通过虚拟机操作redis的时候,不可能帮我们去进行反序列化的,所以就找不到一个key为name的值,就会出现(nil).
人为让spring框架不用自作主张序列化我们存入的值
@RestController
public class RedisController {
@Autowired
private RedisTemplate redisTemplate;
/**
* 初始化操作
*/
@PostConstruct
public void init(){
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
}
@RequestMapping("/demo")
public void test(){
redisTemplate.opsForValue().set("name","xiaoming");
//Object name = redisTemplate.opsForValue().get("name");
//System.out.println("拿到的redis值:"+name);
}
}
删除存入的name,重新添加name,虚拟机get name,可以看到已经取到值了,也可以看到redis客户端是没有序列化的
如果用了这个init方法,也就意味着我们舍弃了spring给我们提供的存储复杂类型,意味着我们只能存string类型的key和value.根据实际情况进行取舍.
方式2:不想自己写init方法,spring框架提供了 StringRedisTemplate反序列化
@Autowired
private StringRedisTemplate stringRedisTemplate;
查看源码,可以看到,StringRedisTemplate也是帮我们写了init里一样的反序列化
两种方法都可以实现,反序列化.
@RestController
public class RedisController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/demo")
public void test(){
stringRedisTemplate.opsForValue().set("name","xiaoming");
}
}