Redis( 基础篇 ==> StringRedisTemplate的使用

本章导学:

  • 为什么要使用StringRedisTemplate
  • StringRedisTemplate操作String类型数据
  • StringRedisTemplate操作Hash类型数据

一、 为什么要使用StringRedisTemplate

在我们为RedisTemplate指定序列化方式后(key为RedisSerializer.string(),value为GenericJackson2JsonRedisSerializer),我们存储value为实体类对象时,会产生如下现象:

这是因为,当我们传入的Value为实体类对象的时候,会用 GenericJackson2JsonRedisSerializer序列化器把java对象转为JSON格式,然后再存入Redis库中,在我们使用redisTemplate.opsForValue().get方法获取数据时,通过存入的@class属性,把JSON反序列化成JAVA对象。

这样一来我们在IDEA的控制器上很直观的就可以看到数据,但是也存在了一个缺点->浪费内存,因为我们要存放@class这一段额外的数据来反序列化JSON字符串

那为了节约内存,我们在处理Value时不使用GenericJackson2JsonRedisSerializer序列化器,时用RedisSerializer.string序列化器。这样一下,我们只需要在存入数据时,手动的把JAVA对象转变为JSON格式字符串,然后取数据时,再把JSON转回JAVA对象就好了。

而StringRedisTemplate它的key和Value默认就是String方式,我们不用自己再去定义RedisTemplate的配置类。

当然你要定义也可以,代码如下

package com.brrbaii.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;


@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        //创建RedisTemplate对象
        RedisTemplate<String, String> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置KEY的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置VALUE的序列化,不用jsonRedisSerializer
//        template.setValueSerializer(jsonRedisSerializer);
//        template.setHashValueSerializer(jsonRedisSerializer);
        template.setValueSerializer(RedisSerializer.string());
        template.setHashValueSerializer(RedisSerializer.string());
        //返回
        return template;
    }
}

我们写一个测试类,注入StringRedisTemplate,然后手动进行序列化和反序列化

代码如下

    @Test
    public void testJavaBean(){
        User user = new User("brrbaii", 22);
        //手动把user对象转为JSON字符串,这里使用Hutool工具类里的JSONUtil
        String UserToStr = JSONUtil.toJsonStr(user);
        //存入数据
        stringRedisTemplate.opsForValue().set("user:1",UserToStr);
        //取出数据,这里取出来的是JSON格式
        String StrUser = stringRedisTemplate.opsForValue().get("user:1");
        //手动把JSON字符串转回user对象
        User userResult = JSONUtil.toBean(StrUser, User.class);
        System.out.println(userResult);
    }

查看Redis可视化界面,这时候"@class":"com.brrbaii.entity.User"就没了

查看IDEA控制台输出结果

 

二、StringRedisTemplate操作String类型数据

StringRedisTemplate它的key和Value默认就是String方式,我们直接存就好了,没什么好讲的 

三、 StringRedisTemplate操作Hash类型数据

 

使用StringRedisTemplate.opsForHash时用的方法不是按照Redis命令来命名了,而是采用java里的HashMap用的方法来命名

存单个field我们用put方法,批量存field我们用putAll方法,我们创建个map集合,put多个key-value就好了

取单个field时我们用get方法,取全部field时我们用entries方法

代码如下:

    @Test
    public void testHash(){
        //存单个field
        stringRedisTemplate.opsForHash().put("hash01","hashName","brr");
        Object o = stringRedisTemplate.opsForHash().get("hash01", "hashName");
        System.out.println(o);

        //存多个field
        Map map = new HashMap();
        map.put("name","bb");
        map.put("sex","jender");
        map.put("hobby","ball");
        stringRedisTemplate.opsForHash().putAll("hash02",map);
        Map<Object, Object> hash02 = stringRedisTemplate.opsForHash().entries("hash02");
        System.out.println(hash02);
    }

运行结果

 

 

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白日日白

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值