Redis学习笔记——java操作Redis

本文介绍了SpringDataRedis在操作Redis时遇到的序列化问题,以及如何通过配置自定义序列化器如GenericJackson2JsonRedisSerializer来解决乱码问题。同时,讨论了使用StringRedisTemplate避免存储对象类型信息导致的内存浪费,并展示了使用Fastjson进行对象与JSON字符串转换的实践代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,使用

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);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值