Springboot項(xiàng)目中使用redis的配置詳解
程序結(jié)構(gòu):

一、配置
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>
<!--始終從倉(cāng)庫(kù)中獲取-->
<!--<relativePath/>-->
</parent>
<dependencies>
<!--web應(yīng)用基本環(huán)境,如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數(shù)據(jù)庫(kù)索引(默認(rèn)為0)
database: 0
# Redis服務(wù)器地址
host: 127.0.0.1
# Redis服務(wù)器連接端口
port: 6379
# Redis服務(wù)器連接密碼(默認(rèn)為空)
# password: 123456
3. 通過配置類,設(shè)置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;
/**
* @author :apollo
* @since :Created in 2019/2/22
*/
@Configuration
@EnableCaching
public class RedisConfig {
@Autowired
private ObjectMapper objectMapper;
/**
* 自定義springSessionDefaultRedisSerializer對(duì)象,將會(huì)替代默認(rèn)的SESSION序列化對(duì)象。
* 默認(rèn)是JdkSerializationRedisSerializer,缺點(diǎn)是需要類實(shí)現(xiàn)Serializable接口。
* 并且在反序列化時(shí)如果異常會(huì)拋出SerializationException異常,
* 而SessionRepositoryFilter又沒有處理異常,故如果序列化異常時(shí)就會(huì)導(dǎo)致請(qǐng)求異常
*/
@Bean(name = "springSessionDefaultRedisSerializer")
public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
/**
* JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer的區(qū)別:
* GenericJackson2JsonRedisSerializer在json中加入@class屬性,類的全路徑包名,方便反系列化。
* JacksonJsonRedisSerializer如果存放了List則在反系列化的時(shí)候,
* 如果沒指定TypeReference則會(huì)報(bào)錯(cuò)java.util.LinkedHashMap cannot be cast。
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
// 使用Jackson2JsonRedisSerialize 替換默認(rèn)序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
new Jackson2JsonRedisSerializer(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
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;
/**
* @author :apollo
* @since :Created in 2019/2/22
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. 實(shí)體類
實(shí)體類Animal如下:
package com.apollo.bean;
/**
* @author :apollo
* @since :Created in 2019/2/22
*/
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;
/**
* @author :apollo
* @since :Created in 2019/2/22
*/
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;
}
//這個(gè)方法和Builder設(shè)計(jì)模式二選一即可,功能是重復(fù)的
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();
}
//靜態(tài)內(nèi)部類,這里使用Builder設(shè)計(jì)模式
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方法,這里的方法一定不能少,否則返回時(shí)無(wú)法將對(duì)象序列化
}
4. 請(qǐng)求處理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;
/**
* @author :apollo
* @since :Created in 2019/2/22
*/
@RestController
@RequestMapping(value = "/redis")
public class RedisController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 測(cè)試向redis中添加數(shù)據(jù)
* @param id
* @return
*/
@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();
}
/**
* 測(cè)試從redis中獲取數(shù)據(jù)
* @return
*/
@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對(duì)象,需要將返回的對(duì)象序列化,所以ApiResult中的get/set方法是必須的,否則會(huì)報(bào)錯(cuò):HttpMessageNotWritableException: No converter found for return value of type: class com.apollo.common.ApiResult,找不到ApiResult類型的轉(zhuǎn)換器。
三、測(cè)試
1. 測(cè)試添加
使用postman請(qǐng)求http://localhost:11011/api/v1/redis/5,返回結(jié)果:
{
"status": 0,
"desc": "添加成功",
"result": null
}
登錄到redis,使用命令dbsize查看存儲(chǔ)的數(shù)據(jù)量:

數(shù)據(jù)量為3,對(duì)應(yīng)我們上邊程序中的3步操作。
2. 測(cè)試獲取
使用postman請(qǐng)求http://localhost:11011/api/v1/redis/redis-data,返回結(jié)果:
{
"status": 0,
"desc": "獲取成功",
"result": {
"third": {
"weight": 100,
"height": 200,
"name": "二狗子"
},
"first": 5,
"second": "hello world"
}
}
與我們之前存入的數(shù)據(jù)對(duì)比,是正確的。
四、代碼地址
github地址:https://github.com/myturn0/redis-test.git
到此這篇關(guān)于Springboot項(xiàng)目中使用redis的配置詳解的文章就介紹到這了,更多相關(guān)Springboot redis配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用JAVA實(shí)現(xiàn)郵件發(fā)送功能的圖文教程
郵件發(fā)送其實(shí)是一個(gè)非常常見的需求,用戶注冊(cè),找回密碼等地方,都會(huì)用到,下面這篇文章主要給大家介紹了關(guān)于使用JAVA實(shí)現(xiàn)郵件發(fā)送功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
java基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)全局唯一ID的示例
本文主要介紹了java基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)全局唯一ID的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)省市區(qū)轉(zhuǎn)換成樹形結(jié)構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
哈希表在算法題目中的實(shí)際應(yīng)用詳解(Java)
散列表(Hash?table,也叫哈希表)是根據(jù)關(guān)鍵碼值(Key?value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于哈希表在算法題目中的實(shí)際應(yīng)用,文中介紹的方法是Java,需要的朋友可以參考下2024-03-03
Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解
這篇文章主要介紹了Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解,棧(Stack) 是一種基本的數(shù)據(jù)結(jié)構(gòu),具有后進(jìn)先出(LIFO)的特性,類似于現(xiàn)實(shí)生活中的一疊盤子,棧用于存儲(chǔ)一組元素,但只允許在棧頂進(jìn)行插入(入棧)和刪除(出棧)操作,需要的朋友可以參考下2023-10-10
解決mybatis批量更新(update foreach)失敗的問題
這篇文章主要介紹了解決mybatis批量更新(update foreach)失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
小議Java中final關(guān)鍵字使用時(shí)的注意點(diǎn)
final關(guān)鍵字代表著最后、不可改變,無(wú)論是在用final修飾類、修飾方法還是修飾變量時(shí),都要注意內(nèi)存分配的問題.這里來小議Java中final關(guān)鍵字使用時(shí)的注意點(diǎn):2016-06-06

