SpringDataRedis入門和序列化方式解決內(nèi)存占用問題小結(jié)
spring-data-redis簡介
spring-data-redis是spring-data模塊的一部分,專門用來支持在spring管理項目對redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis jredis也都屬于redis的java客戶端,他們之間是無法兼容的,如果你在一個項目中使用了jedis,然后后來決定棄用掉改用jdbc-redis就比較麻煩了,spring-data-redis提供了redis的java客戶端的抽象,在開發(fā)中可以忽略掉切換具體的客戶端所帶來的影響,而且他本身就屬于spring的一部分,比起單純的使用jedis,更加穩(wěn)定.管理起來更加自動化.(當然jedis的缺點不止以上).
spring-data-redis的特性
自動管理連接池,提供了一個高度封裝的RedisTemplate類
針對jedis客戶端的大量api進行了歸類封裝,把同一類型的操作封裝成了operation接口.支持redis中的五種數(shù)據(jù)類型的操作.
針對數(shù)據(jù)的"序列化與反序列化"]提供了多種可以選擇的策略(RedisSerializer)
JdkSerializationRedisserializer:當需要存儲java對象時使用.
stringRedisSerializer:當需要存儲string類型的字符串時使用.
JacksonJsonRedisSerializer:將對象序列化成json的格式存儲在redis中,需要jackson-json工具的支持(目前我還沒使用過,不了解)
SpringCloud章節(jié)復(fù)習(xí)已經(jīng)過去,新的章節(jié)Redis開始了,這個章節(jié)中將會回顧Redis
主要依照以下幾個原則
基礎(chǔ)+實戰(zhàn)的Demo和Coding上傳到我的代碼倉庫在原有基礎(chǔ)上加入一些設(shè)計模式,stream+lamdba等新的糖通過DeBug調(diào)試,進入組件源碼去分析底層運行的規(guī)則和設(shè)計模式
代碼會同步在我的gitee中去,覺得不錯的同學(xué)記得一鍵三連求關(guān)注,感謝:
自定義RedisTemplate序列化-鏈接: DefineRedistemplate
StringRedisTemplate解決內(nèi)存占用-鏈接: StringRedisTemplate
可以進入去看,覺得不錯的博主記得一鍵三連支持下
基本介紹
- 1、什么是 SpringDataRedis?
2.常用API
實例Demo
自定義RedisTemplate序列化
引入依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!--JackSon依賴:為了手動序列化使用--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
配置yaml文件,配置連接池屬性
spring: redis: host: 127.0.0.1 port: 6379 password: lettuce: pool: max-active: 8 #最大連接 max-idle: 8 #最大空閑連接 min-idle: 0 # 最小 max-wait: 100ms # 連接等待時間
配置自定義的RedisTemplate
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<String, Object> template = new RedisTemplate<>(); //設(shè)置連接工廠 template.setConnectionFactory(redisConnectionFactory); //key和hashkey使用String序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); //設(shè)置序列化工具 GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); //value和hashValue采用JSON序列化方式 template.setValueSerializer(serializer); template.setHashValueSerializer(serializer); return template; } }
通過注入屬性拿 @Autowired private RedisTemplate<String, Object> redisTemplate;
@SpringBootTest public class RedisTest { @Autowired private RedisTemplate<String, Object> redisTemplate; @BeforeEach void testBefore(){ System.out.println("開始測試"); } @AfterEach void testAfter(){ System.out.println("結(jié)束測試"); } @Test void testString(){ redisTemplate.opsForValue().set("name4", "li"); Object name = redisTemplate.opsForValue().get("name1"); System.out.println(name); } @Test void testUser(){ User user = new User(1, "張大樹"); redisTemplate.opsForValue().set("user1", user); User user1 = (User) redisTemplate.opsForValue().get("user1"); System.out.println(user1); }
自定義的RestTemplate的內(nèi)存占用問題
這種方式會自帶類型數(shù)據(jù),存放一萬個數(shù)據(jù),就會花費一萬個類型數(shù)據(jù)的空間,是非常浪費的
@Test void testUser(){ User user = new User(1, "張大樹"); redisTemplate.opsForValue().set("user1", user); User user1 = (User) redisTemplate.opsForValue().get("user1"); System.out.println(user1); }
StringRedisTemplate解決內(nèi)存占用問題
<!--JackSon依賴--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
@SpringBootTest public class RedisTest1 { @Autowired private StringRedisTemplate redisTemplate1; private static final ObjectMapper mapper = new ObjectMapper(); @BeforeEach void testBefore(){ System.out.println("開始測試"); } @AfterEach void testAfter(){ System.out.println("結(jié)束測試"); } @Test void testString(){ redisTemplate1.opsForValue().set("name4", "li"); Object name = redisTemplate1.opsForValue().get("name1"); System.out.println(name); } @Test void testUser(){ User user = new User(1, "張大樹"); try { String value = mapper.writeValueAsString(user); redisTemplate1.opsForValue().set("user:"+ user.getName(), value); String user1 = redisTemplate1.opsForValue().get("user:張大樹"); User readValue = mapper.readValue(user1, User.class); System.out.println(readValue); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
總結(jié)
到此這篇關(guān)于SpringDataRedis入門和序列化方式解決內(nèi)存占用問題的文章就介紹到這了,更多相關(guān)SpringDataRedis序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之棧的基本定義與實現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之棧的基本定義與實現(xiàn)方法,簡單描述了數(shù)據(jù)結(jié)構(gòu)中棧的功能、原理,并結(jié)合java實例形式分析了棧的基本定義與使用方法,需要的朋友可以參考下2017-10-10解讀SpringBoot中addCorsMappings配置跨域與攔截器互斥問題的原因
這篇文章主要介紹了解讀SpringBoot中addCorsMappings配置跨域與攔截器互斥問題的原因,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12java 合并排序算法、冒泡排序算法、選擇排序算法、插入排序算法、快速排序算法的描述
算法是程序設(shè)計的精髓,程序設(shè)計的實質(zhì)就是構(gòu)造解決問題的算法,將其解釋為計算機語言。2009-06-06Spring Cloud Stream分區(qū)分組原理圖解
這篇文章主要介紹了Spring Cloud Stream的分區(qū)和分組,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03JAVA代碼調(diào)用ffmpeg程序進行視頻轉(zhuǎn)碼和推流方式
本文介紹了如何通過Java代碼調(diào)用FFmpeg進行多媒體視頻處理,包括兩種方式:使用第三方封裝的jar包和使用ProcessBuilder類創(chuàng)建進程,兩種方式各有優(yōu)缺點,選擇時需根據(jù)具體需求和場景2025-02-02如何解決java.util.zip.ZipFile解壓后被java占用問題
這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06