[Redis-客户端] RedisTemplate与StringRedisTemplate

目录

 🥞1. 项目源码🥞

🍎2. Maven依赖🍎

🌭3. RedisTemplate入门使用🌭

🍔4.SpringDataRedis序列化🍔

🍟5.SpringDataRedis返序列化🍟

🍖6. StringRedisTemplate 解决存储对象的内存开销🍖


 🥞1. 项目源码🥞

链接: https://pan.baidu.com/s/1iv2_vqLuLkJ-MhSw6VMMHw

提取码: m7cw


🍎2. Maven依赖🍎

        <!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

🌭3. RedisTemplate入门使用🌭

这里先用单元测试带大家简单入门一下, redisTemplate写入数据和读取数据

代码 : 

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        // 写入一条String数据
        redisTemplate.opsForValue().set("name", "张三");
        // 获取string数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}

输出结果 : 

但是回到我们的图形化客户端后发现, 数据的并不是我们想象的那样 

这是因为spring.data.redis可以接受任何类型的对象, 最后转换成redis可以处理的字节, 所以存进去name, 张三, 都以Java对象的形式存储, 所以我们接下来要解决redis的序列化问题


🍔4.SpringDataRedis序列化🍔

代码 : 

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        System.out.println("开始redis序列化.....");
        //创建RedisTempLate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置Key的序列化(UTF_8格式)
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return template;
    }
}

序列化后的输出结果


🍟5.SpringDataRedis返序列化🍟

这次采用存储对象, 并通过反序列化直接接受对象的参数

代码 : 

    @Test
    void testSaveUser() {
        //写入数据
        redisTemplate.opsForValue().set("user:100", new User("李四", 28));
        //获取数据(采用对象接受,也就是反序列化)
        User user = (User) redisTemplate.opsForValue().get("user:100");
        System.out.println("反序列化结果 : >> " + user);
    }

输出结果 : 

可以看出, 存储的值也是JSON格式

 最后控制台的输出, 也是对象的形式去展示, 这是因为JSON值当中包含了一个class的属性, 并读取到了User类的名称


🍖6. StringRedisTemplate 解决存储对象的内存开销🍖

在redis中存储了"@class": "redis.pojo.User",存储了User字节码 带来的问题就是占用了内存开销

这里我们采用StringRedisTemplate, 采用String的序列化策略来解决性能开销问题

代码 : 


    private static final ObjectMapper MAPPER = new ObjectMapper();
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void stringRedisTemplateTest() throws JsonProcessingException {
        //创建对象
        User user = new User("张大仙", 32);
        //手动序列化
        String json = MAPPER.writeValueAsString(user);
        //写入数据
        stringRedisTemplate.opsForValue().set("user:200", json);

        //获取数据
        String userJson = stringRedisTemplate.opsForValue().get("user:200");
        //手动反序列化
        User user1 = MAPPER.readValue(userJson, User.class);
        System.out.println("user1 = " + user1);
    }

输出结果 :  

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Max恒

为了开源加油 ! !

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值