Redis-11-在Java中操作Redis-使用Spring-Data-Redis操作Redis-基础环境&设置序列化器
在Java中操作Redis
1.Spring Data Redis
在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对jedis客户端中大量API进行了归类封装,将同一类型操作封装为operation接口,
具体分类如下:
1.ValueOperations:简单K-V操作
2.SetOperations:set类型数据操作
3.ZSetOperations:zset类数据操作
4.HashOperations:针对map类型的数据操作
5.ListOperations:针对list类型的数据操作
application.yml配置文件:
spring:
application:
name: springdataredis_demo
#Redis相关配置
redis:
host: localhost
port: 6379
#password: 123456
database: 0 #操作的是0号数据库 Redis跑起来之后,默认给我们提供了16个数据库,这个数量可以在配置文件里面修改,在配置文件的170行。
jedis:
#Redis连接池配置
pool:
max-active: 8 #最大连接数
max-wait: 1ms #连接池最大阻塞等待时间
max-idle: 4 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest2 {
//我们没有自己去创建这个对象,为什么直接通过Autowird就能注入进来呢
//这是因为我们这个RedisTemplate其实是由我们的SpringBoot这个框架自动装配的,也就是说,只要我们配置文件中
//写了Redis的那段配置,他就可以给我们注进来这么一个对象。
//进入RedisAutoConfiguration这个配置类,里面有个redisTemplate方法,这个方法的返回值就是RedisTemplate,
//方法上面加了@Bean注解,说明我们这个对象是由Spring框架去负责维护和管理的。
//还有一个@ConditionOnMissingBean(name = "redisTemplate")注解,这其实是一个条件,也就是说我们当前这个方法,
//他其实是在特定条件下才会被调用,什么条件??missingBean就是当我们这个Spring工厂里面没有redisTemplate这种对象的时候,
//他才会调用这个方法,然后把这个对象给他创建出来
//比如我们自己写代码,我们自己创建了这么一个bean,并且把他放到我们的Spring容器里面了,这个时候就不再去调用redisTemplate这个方法了
//因为当前我们没有redisTemplate,所以他在启动的时候,就会把这个对象给我们创建出来。正是因为他已经创建出来了,所以在测试方法这个位置可以
//通过Autowird这种方式自动注入
/*
*@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
* */
@Autowired
private RedisTemplate redisTemplate;
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private RedisTemplate redisTemplate;
@org.junit.Test
public void testString() {
redisTemplate.opsForValue().set("city", "beijing");
}
}
为什么出现乱码了??
默认的序列化方式把key存进去过后就变形了,如何改变?
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
value也有序列化器,但是不用去管他,因为程序中获取出来的时候还会反序列化