SpringBoot整合Redis實(shí)現(xiàn)序列化存儲(chǔ)Java對(duì)象的操作方法
之前介紹過(guò) http://www.dhdzp.com/article/223539.htm 我們可以看出,在 SpringBoot 對(duì) Redis 做了一系列的自動(dòng)裝配,使用還是非常方便的
一、背景
1、思考
通過(guò)我們前面的學(xué)習(xí),我們已經(jīng)可以往 Redis 中存入字符串,那么我們要往 Redis 中存入 Java 對(duì)象該怎么辦呢?
2、方案
我們可以將 Java 對(duì)象轉(zhuǎn)化為 JSON 對(duì)象,然后轉(zhuǎn)為 JSON 字符串,存入 Redis,那么我們從 Redis 中取出該數(shù)據(jù)的時(shí)候,我們也只能取出字符串,并轉(zhuǎn)為 Java 對(duì)象,這一系列的操作是不是顯得有些麻煩呢?
二、源碼分析

- 以上是 RedisAutoConfiguration 類(lèi)中的源碼片段,可以看出 SpringBoot 對(duì) Redis 做自動(dòng)化配置的時(shí)候,在容器中注入了 redisTemplate 和 stringRedisTemplate
- 其中,RedisTemplate<Object, Object> 表示,key 的類(lèi)型為 Object,value 的類(lèi)型為 Object,但是我們往往需要的是 RedisTemplate<String, Object>,這就需要我們重新注入一個(gè) RedisTemplate 的 Bean,它的泛型為 RedisTemplate<String, Object>,并設(shè)置 key,value 的序列化方式
- 看到這個(gè)@ConditionalOnMissingBean注解后,就知道如果Spring容器中有了RedisTemplate對(duì)象了,這個(gè)自動(dòng)配置的RedisTemplate不會(huì)實(shí)例化。因此我們可以直接自己寫(xiě)個(gè)配置類(lèi),配置RedisTemplate。
三、注入RedisTemplate
1、引入依賴
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>以上引入了 redis 的依賴,其余依賴請(qǐng)自行添加
2、Redis 連接信息
spring:
# Redis配置
redis:
host: 127.0.0.1
port: 6379
database: 10
jedis:
pool:
# 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制)
max-active: 50
# 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制)
max-wait: 3000ms
# 連接池中的最大空閑連接數(shù)
max-idle: 20
# 連接池中的最小空閑連接數(shù)
min-idle: 5
# 連接超時(shí)時(shí)間(毫秒)
timeout: 5000ms3、Redis 核心配置類(lèi)
Redis 的核心配置我們放在 RedisConfig.java 文件中
package com.zyxx.redistest.common;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @ClassName RedisConfig
* @Description
* @Author Lizhou
* @Date 2020-10-22 9:48:48
**/
@Configuration
public class RedisConfig {
/**
* RedisTemplate配置
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 配置redisTemplate
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 設(shè)置序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(om);
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// Hash key序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// Hash value序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
我們注入了一個(gè)名稱為 redisTemplate,類(lèi)型為 RedisTemplate<String, Object> 的 Bean,key 采用 StringRedisSerializer 序列化方式,value 采用 Jackson2JsonRedisSerializer 序列化方式
4、Redis工具類(lèi)
我們將對(duì) Redis 進(jìn)行的一系列操作放在 RedisUtils.java 文件中
package com.zyxx.redistest.common;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
* @ClassName RedisUtils
* @Description
* @Author Lizhou
* @Date 2020-10-22 10:10:10
**/
@Slf4j
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 根據(jù)key讀取數(shù)據(jù)
*/
public Object get(final String key) {
if (StringUtils.isBlank(key)) {
return null;
}
try {
return redisTemplate.opsForValue().get(key);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 寫(xiě)入數(shù)據(jù)
*/
public boolean set(final String key, Object value) {
if (StringUtils.isBlank(key)) {
return false;
}
try {
redisTemplate.opsForValue().set(key, value);
log.info("存入redis成功,key:{},value:{}", key, value);
return true;
} catch (Exception e) {
log.error("存入redis失敗,key:{},value:{}", key, value);
e.printStackTrace();
}
return false;
}
}
我們寫(xiě)入了 get,set 兩個(gè)方法用于測(cè)試
四、測(cè)試
1、創(chuàng)建 Java 實(shí)體類(lèi) UserInfo
package com.zyxx.redistest.common;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @ClassName UserInfo
* @Description
* @Author Lizhou
* @Date 2020-10-22 10:12:12
**/
@Data
public class UserInfo implements Serializable {
/**
* id
*/
private Integer id;
/**
* 姓名
*/
private String name;
/**
* 創(chuàng)建時(shí)間
*/
private Date createTime;
}2、測(cè)試用例
package com.zyxx.redistest;
import com.zyxx.redistest.common.RedisUtils;
import com.zyxx.redistest.common.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
class RedisTestApplicationTests {
@Autowired
private RedisUtils redisUtil;
@Test
void contextLoads() {
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setName("jack");
userInfo.setCreateTime(new Date());
// 放入redis
redisUtil.set("user", userInfo);
// 從redis中獲取
System.out.println("獲取到數(shù)據(jù):" + redisUtil.get("user"));
}
}我們向 Redis 中存入了一個(gè) key 為 ”user“,value 為 UserInfo 對(duì)象的數(shù)據(jù),然后再根據(jù) key 獲取該數(shù)據(jù)
3、測(cè)試結(jié)果

可以看出,我們往 Redis 中成功存入 Java 對(duì)象數(shù)據(jù),并成功獲取到了該對(duì)象
到此這篇關(guān)于SpringBoot整合Redis實(shí)現(xiàn)序列化存儲(chǔ)Java對(duì)象的文章就介紹到這了,更多相關(guān)SpringBoot整合Redis序列化存儲(chǔ)Java對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis Key的數(shù)量上限及優(yōu)化策略分享
Redis 作為高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),廣泛應(yīng)用于緩存、會(huì)話存儲(chǔ)、排行榜等場(chǎng)景,但在實(shí)際使用中,開(kāi)發(fā)者常常會(huì)關(guān)心一個(gè)問(wèn)題:Redis 的 Key 數(shù)量是否有上限?本文將從 Redis Key 的理論上限 出發(fā),深入探討 Redis Key 的管理策略,需要的朋友可以參考下2025-03-03
Redis Template實(shí)現(xiàn)分布式鎖的實(shí)例代碼
使用Redis的SETNX命令獲取分布式鎖的步驟,接下來(lái)通過(guò)本文給大家介紹Redis Template實(shí)現(xiàn)分布式鎖的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-09-09
redis3.2配置文件redis.conf詳細(xì)說(shuō)明
redis3.2配置詳解,Redis啟動(dòng)的時(shí)候,可以指定配置文件,詳細(xì)說(shuō)明請(qǐng)看本文說(shuō)明2018-03-03
redis的hGetAll函數(shù)的性能問(wèn)題(記Redis那坑人的HGETALL)
這篇文章主要介紹了redis的hGetAll函數(shù)的性能問(wèn)題,需要的朋友可以參考下2016-02-02
一文詳解如何使用Redis實(shí)現(xiàn)分布式鎖
這篇文章主要介紹了一文詳解如何使用Redis實(shí)現(xiàn)分布式鎖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09

