文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Springboot项目中使用redis的配置详解

2024-04-02 19:55

关注

程序结构:

一、配置

 1. 在pom.xml中添加依赖

pom.xml文件如下:


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.lyy</groupId>
    <artifactId>redis-test</artifactId>
    <version>0.1-SNAPSHOT</version>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <!--始终从仓库中获取-->
        <!--<relativePath/>-->
    </parent>
 
    <dependencies>
        <!--web应用基本环境,如mvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <!--redis包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
</project>

其中,spring-boot-starter-web包含springmvc。

2. 配置application.yml

application.yml文件如下:


server:
  port: 11011
  servlet:
    context-path: /api/v1
 
spring:
  redis:
    # Redis数据库索引(默认为0)
    database: 0
    # Redis服务器地址
    host: 127.0.0.1
    # Redis服务器连接端口
    port: 6379
#     Redis服务器连接密码(默认为空)
#    password: 123456

3. 通过配置类,设置redis

RedisConfig类如下:


package com.apollo.config;
 
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.EnableCaching;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 

@Configuration
@EnableCaching
public class RedisConfig {
 
    @Autowired
    private ObjectMapper objectMapper;
 
    
    @Bean(name = "springSessionDefaultRedisSerializer")
    public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
 
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
 
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
                            new Jackson2JsonRedisSerializer(Object.class);
 
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
 
        redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
 
        redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setEnableDefaultSerializer(true);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

二、逻辑代码

1. 程序入口


package com.apollo;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 

@SpringBootApplication
public class Application  {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2. 实体类

实体类Animal如下:


package com.apollo.bean;
 

public class Animal {
    private Integer weight;
    private Integer height;
    private String name;
 
    public Animal(Integer weight, Integer height, String name) {
        this.weight = weight;
        this.height = height;
        this.name = name;
    }
 
    ……这里是get、set方法
}

3. 公共返回类


package com.apollo.common;
 

public class ApiResult {
    public static final Integer STATUS_SUCCESS = 0;
    public static final Integer STATUS_FAILURE = -1;
 
    public static final String DESC_SUCCESS = "操作成功";
    public static final String DESC_FAILURE = "操作失败";
 
    private Integer status;
    private String desc;
    private Object result;
 
    private ApiResult() {}
 
    private ApiResult(Integer status, String desc, Object result) {
        this.status = status;
        this.desc = desc;
        this.result = result;
    }
 
    //这个方法和Builder设计模式二选一即可,功能是重复的
    public static ApiResult success(Object result) {
        return success(DESC_SUCCESS, result);
    }
 
    //同上
    public static ApiResult success(String desc, Object result) {
        return new ApiResult(STATUS_SUCCESS, desc, result);
    }
 
    //同上
    public static ApiResult failure(Integer status) {
        return failure(status, null);
    }
 
    //同上
    public static ApiResult failure(Integer status, String desc) {
        return failure(status, desc, null);
    }
 
    //同上
    public static ApiResult failure(Integer status, String desc, Object result) {
        return new ApiResult(status, desc, result);
    }
 
    public static Builder builder() {
        return new Builder();
    }
 
    //静态内部类,这里使用Builder设计模式
    public static class Builder {
        private Integer status;
        private String desc;
        private Object result;
 
        public Builder status(Integer status) {
            this.status = status;
            return this;
        }
 
        public Builder desc(String desc) {
            this.desc = desc;
            return this;
        }
 
        public Builder result(Object result) {
            this.result = result;
            return this;
        }
 
        public ApiResult build() {
            return new ApiResult(status, desc, result);
        }
    }
 
    ……这里是get、set方法,这里的方法一定不能少,否则返回时无法将对象序列化
}

4. 请求处理Controller

RedisController类如下:


package com.apollo.controller;
 
import com.apollo.bean.Animal;
import com.apollo.common.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
 
import java.util.HashMap;
import java.util.Map;
 

@RestController
@RequestMapping(value = "/redis")
public class RedisController {
 
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
 
    
    @GetMapping(value = "/{id}")
    public ApiResult addData2Redis(@PathVariable("id") Integer id) {
 
        redisTemplate.opsForValue().set("first", id);
        redisTemplate.opsForValue().set("second", "hello world");
        redisTemplate.opsForValue().set("third",
                new Animal(100, 200, "二狗子"));
 
        return ApiResult.builder()
                        .status(ApiResult.STATUS_SUCCESS)
                        .desc("添加成功")
                        .build();
    }
 
    
    @GetMapping("/redis-data")
    public ApiResult getRedisData() {
        Map<String, Object> result = new HashMap<>();
        result.put("first", redisTemplate.opsForValue().get("first"));
        result.put("second", redisTemplate.opsForValue().get("second"));
        result.put("third", redisTemplate.opsForValue().get("third"));
 
        return ApiResult.builder()
                .status(ApiResult.STATUS_SUCCESS)
                .desc("获取成功")
                .result(result)
                .build();
    }
}

注意:这里是返回ApiResult对象,需要将返回的对象序列化,所以ApiResult中的get/set方法是必须的,否则会报错:HttpMessageNotWritableException: No converter found for return value of type: class com.apollo.common.ApiResult,找不到ApiResult类型的转换器。

三、测试

1. 测试添加

使用postman请求http://localhost:11011/api/v1/redis/5,返回结果:


{
    "status": 0,
    "desc": "添加成功",
    "result": null
}

登录到redis,使用命令dbsize查看存储的数据量:

数据量为3,对应我们上边程序中的3步操作。

2. 测试获取

使用postman请求http://localhost:11011/api/v1/redis/redis-data,返回结果:


{
    "status": 0,
    "desc": "获取成功",
    "result": {
        "third": {
            "weight": 100,
            "height": 200,
            "name": "二狗子"
        },
        "first": 5,
        "second": "hello world"
    }
}

与我们之前存入的数据对比,是正确的。

四、代码地址

github地址:https://github.com/myturn0/redis-test.git

到此这篇关于Springboot项目中使用redis的配置详解的文章就介绍到这了,更多相关Springboot redis配置内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯