springboot快速搭建redis环境

文章讲述了如何使用SpringBoot集成Redis来提升课程作业后台的性能,通过将常用资源存储在内存中,先查询Redis,未命中再查询MySQL。同时,作者遇到了Redis默认使用JDK序列化导致对象存储为字节码的问题,然后介绍了如何配置RedisTemplate以实现JSON序列化,以便更直观地存储和读取POJO对象。
摘要由CSDN通过智能技术生成

这两台在学习redis,不得不说redis作为非关系型数据库,其功能非常强大,我打算用redis对课程作业的后台进行升级,在一些经常访问的资源使用redis存储在服务器的内存中,当进行查找的时候,如果能使用redis查找到那么就直接返回,否则再使用mysql到数据库中进行查找。redis集成springboot也非常简单,下面记录一下我搭建环境的过程。

1.在pom.xml中加入依赖:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.在application.properties中加入连接redis的配置:
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=

3.之后就可以进行一些简单的redis操作了
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @ResponseBody
    @RequestMapping("test")
    public String test(){
        stringRedisTemplate.opsForValue().set("md","2");
        return stringRedisTemplate.opsForValue().get("wxw");
    }

但是现在还有一些问题,因为当我们现在向redis存储POJO对象的时候,redis默认是使用JDK的序列化方式,写入redis的都是字节码:
我new一个POJO类,

package com.wxw.myredis;

import java.io.Serializable;

public class User implements Serializable {
    private String name;

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

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



将POJO对象写入redis:

    @ResponseBody
    @RequestMapping("test")
    public String test(){
        User user = new User("wxw",19);
        redisTemplate.opsForValue().set("POJO",user);
        return stringRedisTemplate.opsForValue().get("wxw");
    }

得到的结果是这样的:

可见都是字节码,所以接下来

4.实现redis的json序列化:
new一个配置类:

package com.wxw.myredis.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    //还是使用springboot默认配置的RedisConnectionFactory
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    // 默认用的是用JdkSerializationRedisSerializer进行序列化的
    @Bean
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        // 注入数据源
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // key-value结构序列化数据结构
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash数据结构序列化方式,必须这样否则存hash 就是基于jdk序列化的
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        /// redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }


}



重新启动,重新请求url:
redis写入的结果是这样的:

可见实现了json存储。

如果想要取出:

(User)redisTemplate.opsForValue().get("md")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值