您好,登錄后才能下訂單哦!
今天小編給大家分享一下SpringBoot怎么整合Redis實現(xiàn)序列化存儲Java對象的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
通過我們前面的學(xué)習(xí),我們已經(jīng)可以往 Redis 中存入字符串,那么我們要往 Redis 中存入 Java 對象該怎么辦呢?
我們可以將 Java 對象轉(zhuǎn)化為 JSON 對象,然后轉(zhuǎn)為 JSON 字符串,存入 Redis,那么我們從 Redis 中取出該數(shù)據(jù)的時候,我們也只能取出字符串,并轉(zhuǎn)為 Java 對象,這一系列的操作是不是顯得有些麻煩呢?
以上是 RedisAutoConfiguration 類中的源碼片段,可以看出 SpringBoot 對 Redis 做自動化配置的時候,在容器中注入了 redisTemplate 和 stringRedisTemplate
其中,RedisTemplate<Object, Object> 表示,key 的類型為 Object,value 的類型為 Object,但是我們往往需要的是 RedisTemplate<String, Object>,這就需要我們重新注入一個 RedisTemplate 的 Bean,它的泛型為 RedisTemplate<String, Object>,并設(shè)置 key,value 的序列化方式
看到這個@ConditionalOnMissingBean注解后,就知道如果Spring容器中有了RedisTemplate對象了,這個自動配置的RedisTemplate不會實例化。因此我們可以直接自己寫個配置類,配置RedisTemplate。
<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
以上引入了 redis 的依賴,其余依賴請自行添加
spring: # Redis配置 redis: host: 127.0.0.1 port: 6379 database: 10 jedis: pool: # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制) max-active: 50 # 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制) max-wait: 3000ms # 連接池中的最大空閑連接數(shù) max-idle: 20 # 連接池中的最小空閑連接數(shù) min-idle: 5 # 連接超時時間(毫秒) timeout: 5000ms
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; } }
我們注入了一個名稱為 redisTemplate,類型為 RedisTemplate<String, Object> 的 Bean,key 采用 StringRedisSerializer 序列化方式,value 采用 Jackson2JsonRedisSerializer 序列化方式
我們將對 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; } /** * 寫入數(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; } }
我們寫入了 get,set 兩個方法用于測試
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)建時間 */ private Date createTime; }
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 中存入了一個 key 為 ”user“,value 為 UserInfo 對象的數(shù)據(jù),然后再根據(jù) key 獲取該數(shù)據(jù)
可以看出,我們往 Redis 中成功存入 Java 對象數(shù)據(jù),并成功獲取到了該對象。
以上就是“SpringBoot怎么整合Redis實現(xiàn)序列化存儲Java對象”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。