網站首頁 編程語言 正文
Redis學習之旅--SpringBoot整合
在學習SpringBoot整合Redis之前我們先來了解一下Jedis。
Jedis
概念
Jedis 是 Redis 官方推薦的 java連接開發工具! 使用Java 操作Redis 中間件!
如果你要使用java操作redis,那么一定要對Jedis 十分的熟悉!
使用
- 1、導入對應的依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
- 2、編碼測試:
連接數據庫
操作命令
斷開連接!
代碼
/**
* 測試Jedis連接
*/
public class TestPing {
public static void main(String[] args) {
//1.new Jedis對象即可
Jedis jedis = new Jedis("127.0.0.1",6379);
//測試連接
System.out.println(jedis.ping());
}
}
常用的API,所有的api命令與Redis沒有區別。這里重點講一下事務的相關API,其他的API使用可以參考這里:
public class TestMulti {
public static void main(String[] args) {
//創建客戶端連接服務端,redis服務端需要被開啟
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.flushDB();
JSONObject jsonObject = new JSONObject();
jsonObject.put("hello", "world");
jsonObject.put("name", "java");
//開啟事務
Transaction multi = jedis.multi();
String result = jsonObject.toJSONString();
try {
//向redis存入一條數據
multi.set("json", result);
//再存入一條數據
multi.set("json2", result);
//這里引發了異常,用0作為被除數
int i = 100/0;
//如果沒有引發異常,執行進入隊列的命令
multi.exec();
} catch (Exception e) {
e.printStackTrace();
//如果出現異常,回滾
multi.discard();
} finally {
System.out.println(jedis.get("json"));
System.out.println(jedis.get("json2"));
//最終關閉客戶端
jedis.close();
}
}
}
SpringBoot
SpringBoot 操作數據:spring-data jpa jdbc mongodb redis!
SpringData 也是和 SpringBoot 齊名的項目!
說明: 在 SpringBoot2.x 之后,原來使用的jedis 被替換為了 lettuce?
- jedis : 采用的直連,多個線程操作的話,是不安全的,如果想要避免不安全的,使用 jedis pool 連接 池! 更像 BIO 模式
- lettuce : 采用netty,實例可以再多個線程中進行共享,不存在線程不安全的情況!可以減少線程數據 了,更像 NIO 模式
配置文件源碼分析:
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
//ConditionalOnSingleCandidate 如果沒有這個類,則使用這個類
//我們可以自己定義一個redisTemplate來替換這個默認的!
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//默認的 RedisTemplate 沒有過多地設置,redis對象都是需要序列化的!
//兩個泛型都是 Object類型,我們之后使用需要強制類型轉換 <String Object>
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
//由于string 是redis中最常使用的類型,所以說單獨提出來了一個bean!@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
return new StringRedisTemplate(redisConnectionFactory);
}
整合測試
1、導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置連接
# 配置redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
3、測試!
@SpringBootTest
class RedisSpringbootApplicationTests {
@Autowired
private RedisTemplate<String,String> redisTemplate;
@Test
void contextLoads() {
// redisTemplate 操作不同的數據類型,api和我們的指令是一樣的
// opsForValue 操作字符串 類似String
// opsForList 操作List 類似List
// opsForSet
// opsForHash
// opsForZSet
// opsForGeo
// opsForHyperLogLog
// 除了進本的操作,我們常用的方法都可以直接通過redisTemplate操作,比如事務,和基本的 CRUD
// 獲取redis的連接對象
// RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
// connection.flushDb();
// connection.flushAll();
redisTemplate.opsForValue().set("key","myValue");
System.out.println(redisTemplate.opsForValue().get("key"));
}
}
自己的 RedisTemplete
因為默認的序列化方式是JDK序列化,我們可能會用到Json來序列化,我們來編寫一個自己的 RedisTemplete,方便使用
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
原文鏈接:https://blog.csdn.net/qq_45661125/article/details/122491115
- 上一篇:redis——緩存穿透、緩存擊穿、緩存雪崩、分布式鎖
- 下一篇:HTML5新增標簽
相關推薦
- 2021-12-05 C語言SetConsoleCursorInfo函數使用方法_C 語言
- 2021-12-16 C++?OpenCV實現圖像雙三次插值算法詳解_C 語言
- 2023-10-15 動態演示操作系統進程調度算法,FCFS, RR, SPN, SRT, HRRN
- 2023-06-21 C++析構函數內部工作機制詳解_C 語言
- 2022-03-18 linux下修改文件權限chmod命令詳細解析_Linux
- 2023-01-31 React受控組件與非受控組件深入講解_React
- 2022-09-30 Docker容器Consul部署概述_docker
- 2022-08-20 oracle設置密碼復雜度及設置超時退出的功能_oracle
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支