一,使用
1、Spring中的SpringData,是对各种数据的操作,其中SpringDataRedis就是对Redis中数据的操作,它整合了Lettuce和Jedis两种Redis客户端,引入依赖(Redis的和连接池的)就可以使用了。
2、使用时装配一个RedisTemplate对象即可操作Redis
二,问题与解决
可以看到,key与value都是“乱码”,这是因为key与value都被序列化了,而默认的序列化器是JdkSerializationRedisSerializer。
要解决这个问题,最直观的的办法就是换一个序列化器,做一个配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory r){
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setConnectionFactory(r);
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
template.setValueSerializer(serializer);
template.setHashValueSerializer(serializer);
return template;
}
}
@Bean:Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中
当然还有另一种办法,装配时,不再装配RedisTemplate对象,而是换成StringRedisTemplate
这样就解决了序列化问题
但是问题又来了,
当储存一个对象时,会自动把对象的类型存储到redis中,浪费内存
(因为对象存入Redis需要序列化成json,而取出数据时得把它转化成对象,因此要想自动转换它是必要的)
要解决这个问题,需要手动转换,我习惯用fastjson,存储时,把对象用fastjson转换成json字符串,取时在用fastjson转换成对象即可。
附上测试代码:
@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void contextLoads() {
// redisTemplate.opsForValue().set("student:name","jack");
// redisTemplate.opsForValue().set("name","jack");
redisTemplate.opsForValue().set("student:1",new Student("jim",20));
// Object name = redisTemplate.opsForValue().get("name");
// redisTemplate.delete("name");
// redisTemplate.delete("student");
System.out.println(redisTemplate.delete("name"));
// System.out.println(redisTemplate.delete("student:name"));
// System.out.println(redisTemplate.delete("student:1"));
}
@Test
void contextLoads2() {
// stringRedisTemplate.opsForValue().set("student:name","jack");
Student student = new Student();
student.setName("jack");
student.setAge(18);
stringRedisTemplate.opsForValue().set("student:2",JSON.toJSONString(student));
// Object name = stringRedisTemplate.opsForValue().get("name");
// stringRedisTemplate.delete("name");
// stringRedisTemplate.delete("student");
// System.out.println(stringRedisTemplate.delete("name"));
// System.out.println(stringRedisTemplate.delete("student:name"));
// System.out.println(stringRedisTemplate.delete("student:2"));
Object parse = JSON.parse(stringRedisTemplate.opsForValue().get("student:2"));
System.out.println(parse);
}
}