前言
這篇博文我們介紹SpringBoot如何整合Redis來訪問非關(guān)系型數(shù)據(jù)庫毅往,帶你深入了解Redis的自動原理牵咙,并結(jié)合具體案例進(jìn)行實(shí)操,分享所有的源碼攀唯。
01 為什么選擇Spring Data Redis洁桌?
Spring Data Redis是Spring Data家族中最重要的一分子,它提供了從Spring應(yīng)用程序輕松配置并訪問Redis的功能革答。它提供了用于與存儲交互的低級和高級抽象战坤,使用戶擺脫了對基礎(chǔ)設(shè)施的擔(dān)憂。
Spring Framework 是領(lǐng)先的全棧 Java/JEE 應(yīng)用程序框架残拐。它通過使用依賴注入、AOP 和可移植服務(wù)抽象提供了一個輕量級容器和一個非侵入式編程模型碟嘴。
Spring Data Redis (SDR) 框架通過 Spring 出色的基礎(chǔ)架構(gòu)支持消除了與存儲交互所需的冗余任務(wù)和樣板代碼溪食,從而可以輕松編寫使用 Redis 鍵值存儲的 Spring 應(yīng)用程序。
02 Spring Boot整合Redis
2.1 導(dǎo)入依賴項
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
自動引入的依賴娜扇,如圖所示:
2.2 自動配置原理
自動配置類RedisAutoConfiguration
- RedisProperties屬性類错沃,用于對Redis的基本屬性配置
- LettuceConnectionConfiguration、JedisConnectionConfiguration雀瓢,Redis的客戶端類型枢析,其中配置了連接工廠,連接池等刃麸,默認(rèn)為Lettuce醒叁,底層引入了Lettuce客戶端jar包
- 自動注入了RedisTemplate**<Object, **Object> : xxxTemplate;自動注入了StringRedisTemplate;k:v都是String
底層只要我們使用StringRedisTemplate把沼、RedisTemplate就可以操作redis
2.3 默認(rèn)整合Lettuce
2.3.1 添加配置
server:
port: 8083
spring:
application:
name: springboot-redis
redis:
# Redis服務(wù)器地址
host: localhost
# Redis服務(wù)器連接端口
port: 6379
# Redis服務(wù)器連接密碼(默認(rèn)為空)
password:
# Redis數(shù)據(jù)庫索引(默認(rèn)為0)
database: 0
# 連接超時時間(毫秒)
timeout : 300
client-type: lettuce #切換jedis客戶端啊易,改成jedis
lettuce: #切換jedis客戶端,改成jedis
pool:
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
max-active: 8
# 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)
max-wait: -1
# 連接池中的最大空閑連接
max-idle: 8
# 連接池中的最小空閑連接
min-idle: 0
2.4 切換至Jedis
2.4.1 導(dǎo)入jar
<!--導(dǎo)入jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
注意:配置基本同上饮睬,只需要將lettuce換成jedis即可租谈。
2.5 配置序列化方式
RedisTemplate默認(rèn)的序列化方式為JdkSerializationRedisSerializer,會把對象序列化存儲到Redis中(二進(jìn)制形式)捆愁,StringRedisTemplate的默認(rèn)序列化方式為StringRedisSerializer割去。絕大多數(shù)情況下,不推薦使用 JdkSerializationRedisSerializer 進(jìn)行序列化昼丑,主要是不方便人工排查數(shù)據(jù)呻逆。所以我們需要切換序列化方式。
Spring Data底層為我們實(shí)現(xiàn)了七種不同的序列化方式矾克,大家可以根據(jù)需要進(jìn)行選擇页慷,如下圖所示:
我們以Jackson2JsonRedisSerializer為例,展示如何切換序列化方式胁附。
@Configuration
public class RedisConfig {
/**
* 默認(rèn)是JDK的序列化策略酒繁,這里配置redisTemplate采用的是Jackson2JsonRedisSerializer的序列化策略
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認(rèn)使用JDK的序列化方式)
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 配置連接工廠
redisTemplate.setConnectionFactory(redisConnectionFactory);
//使用StringRedisSerializer來序列化和反序列化redis的key值
//redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);
// 值采用json序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/***
* stringRedisTemplate默認(rèn)采用的是String的序列化策略
* @param redisConnectionFactory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
return stringRedisTemplate;
}
}
03 代碼示例
我為廣大粉絲朋友提供了詳細(xì)使用案例,以便更好地學(xué)習(xí)Redis控妻。只展示其中一部分的代碼州袒,更加詳細(xì)的代碼,大家可以通過源碼地址來查看弓候。
@SpringBootTest
public class RedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testRedis(){
ValueOperations<String, String> operations = redisTemplate.opsForValue();
operations.set("hello","world");
String hello = operations.get("hello");
System.out.println(hello);
}
/**
* 操作字符串
*/
@Test
public void testString() {
//設(shè)置值
stringRedisTemplate.opsForValue().set("String", "Mao");
//獲取值
String string = stringRedisTemplate.opsForValue().get("String");
System.out.println(string);
//設(shè)置值且設(shè)置超時時間
stringRedisTemplate.opsForValue().set("Middle", "Yu", 3, TimeUnit.MINUTES);
String middle = stringRedisTemplate.opsForValue().get("Middle");
System.out.println(middle);
//刪除數(shù)據(jù)
Boolean isDelete = stringRedisTemplate.delete("String");
Assert.isTrue(isDelete, "刪除失敗");
}
/**
* 操作列表
*/
@Test
public void testList() {
ListOperations listOp = redisTemplate.opsForList();
//往 List 左側(cè)插入一個元素
listOp.leftPush("nameList", "mike");
listOp.leftPush("nameList", "kim");
//往 List 右側(cè)插入一個元素
listOp.rightPush("nameList", "jimmy");
listOp.rightPush("nameList", "chuck");
//List 大小
Long size = listOp.size("nameList");
//遍歷整個List
List nameList1 = listOp.range("nameList", 0, size);
System.out.println(JSON.toJSONString(nameList1));
//遍歷整個List郎哭,-1表示倒數(shù)第一個即最后一個
List nameList = listOp.range("nameList", 0, -1);
System.out.println(JSON.toJSONString(nameList));
//從 List 左側(cè)取出第一個元素,并移除
Object name1 = listOp.leftPop("nameList", 200, TimeUnit.MILLISECONDS);
System.out.println("is kim:" + name1.equals("kim"));
//從 List 右側(cè)取出第一個元素菇存,并移除
Object name2 = listOp.rightPop("nameList");
System.out.println("is chuck:" + name2.equals("chuck"));
}
夸研。。依鸥。亥至。。贱迟。開源項目中還有內(nèi)容哦姐扮。。衣吠。茶敏。。缚俏。
}
本文示例讀者可以通過查看下面?zhèn)}庫中的項目惊搏,如下所示:
<module>springboot-redis</module>
作者:程序猿小亮
原文鏈接:https://blog.csdn.net/jiuqiyuliang/article/details/118677483?spm=1001.2014.3001.5502