SpringBoot整合Redis(解决乱码)以及Redis工具类的编写

SpringBoot整合Redis

SpringBoot整合Redis简单的主要分为以下步骤:

1.添加redis依赖(redis启动器)

		<!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.0.4.RELEASE</version>
        </dependency>

2.添加redis配置

spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    jedis:
      pool:
        max-active: 100
        max-idle: 10
        max-wait: 100000
    timeout: 5000

如果有密码的还需要配置密码

3.启动本地Redis,具体下载教程参考Redis下载启动

4.编写简单测试方法查看是否可以正常存取

在测试类中注入RedisTemplate,并进行简单测试:

	@Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Test
    public void testRedisString() {
   
        redisTemplate.opsForValue().set("myKey", "myValue");
        System.out.println(redisTemplate.opsForValue().get("myKey"));
    }

使用Redis可视化管理工具查看会发现:
存入Redis成功
此时已经成功存入到Redis中了,上面存入到的值是一个字符串,但如果先要存入一个对象怎么办呢?多数想法下会想到把RedisTemplate<String, String>的类型改成RedisTemplate<String, Object>就可以了,没错,事实就是这么干的。
我们只需要注入

	@Autowired
    private RedisTemplate<String, String> redisTemplate;

即可,但是会发现报了个错误:
报错
鼠标悬浮会发现提示没有这个Bean,原来是RedisTemplate并没有提供这种类型的(RedisTemplate<String, Object>)Bean,如果想要注入,需要用@Resource注解,该注解可以注入RedisTemplate,这样就可以接着使用RedisTemplate<String, Object>
注入成功
此时新建一个类,实现序列化:

public class User implements Serializable {
   
    private String name;
    private int age;

    public User() {
   
    }

    public User(String name, int age) {
   
        this.name = name;
        this.age = age;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public int getAge() {
   
        return age;
    }

    public void setAge(int age) {
   
        this.age = age;
    }

    @Override
    public String toString() {
   
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

紧接着编写测试方法:

	@Test
    public void testRedisObject() {
   
        User user = new User("fanhuaIIIIII", 12);
        redisTemplate.opsForValue().set("myUser", user);
        System.out.println(redisTemplate.opsForValue().get("myUser"));
    }

此时测试执行通过,可视化工具中查看发现:
发现乱码

可以发现存入的对象出现了乱码,这是什么原因呢?
我们知道,在Java中,一切皆对象,如果想要将对象存储,则需要将对象序列化。RedisTemplate<String, String>则是提供了序列化的配置,这也就是为什么存字符串未出现乱码,而存对象出现乱码的原因。追踪RedisTemplate<String, String>的源码发现这样一段代码:

	public StringRedisTemplate() {
   
		setKeySerializer(RedisSerializer.string());
		setValueSerializer(RedisSerializer.string());
		setHashKeySerializer(RedisSerializer.string());
		setHashValueSerializer(RedisSerializer.string());
	}

这就是RedisTemplate<String, String>提供的序列化的设置,而RedisTemplate提供的是JdkSerializationRedisSerializer序列化,如果我们想实现RedisTemplate<String, Object>的序列化,则需要手动设置,提供两种方式:

第一种

在测试方法中使用redisTemplate之前,先实现Redis键值的序列化设置

	@Test
    public void testRedisObject() {
   
    	// redis的键采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // redis的值采用jackson的序列化方式
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        User user = new User("fanhuaIIIIII", 12);
        redisTemplate.opsForValue().set("myUser", user);
        System.out.println
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值