- 基礎篇:講解Redis常用數據結構
- 實戰篇:黑馬點評實戰
- 高級篇:Redis高級知識點
- 原理篇:Redis原理
- 面試篇:Redis八股
??第一章:基礎篇??
1. Redis介紹
Redis是一個key-value的數據庫,key一般是String類型,不過value的類型多種多樣。最重要的是5種基本類型。String, Hash, List, Set和SortedSet。
Redis通用命令:
2. String
String類型,也就是字符串類型,是Redis中最簡單的存儲類型。
- String
- string: 普通字符串
- int: 整數類型,可以做自增、自減操作
- float: 浮點類型,可以做自增、自減操作
不管是哪種格式,底層都是字節數組形式存儲,只不過是編碼方式不同。字符串類型的最大空間不能超過512m。
String類型常見的命令:
3. Hash
4. List
5. Set
6. SortedSet
7. Redis的Java客戶端
7.1 客戶端對比
- Spring擅長整合,SpringDataRedis底層既可以用Jedis實現,也可以用Lettuce實現。
- 很多企業喜歡用舊的Jedis
- 如果要實現分布式鎖,會用到Redisson
因此,后面主要介紹三種Redis的Java客戶端:
- Jedis:傳統Redis的Java客戶端
- SpringDataRedis: 整合了傳統的Jedis和Lettuce
- Redisson:分布式鎖使用
7.2 Jedis
7.2.1 Jedis使用的基本步驟
- 引入Jedis依賴
- 創建Jedis對象,建立連接
- 使用Jedis,方法名與Redis命令一致
- 釋放資源
(1)創建Maven工程,引入Jedis依賴
<dependencies><!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!--單元測試--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-launcher</artifactId><version>1.7.0</version><scope>test</scope></dependency>
</dependencies>
(2)使用Jedis對象操作Redis
package com.heima.test;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;public class JedisTest {private Jedis jedis;@BeforeEachvoid setUp(){// 1. 建立連接jedis = new Jedis("192.168.31.20", 6379);// 2. 設置密碼jedis.auth("123456");// 3. 選擇庫jedis.select(4);}@Testvoid testString(){// 存入數據String result = jedis.set("name", "xxx");System.out.println("result = " + result);// 獲取數據String name = jedis.get("name");System.out.println("name = " + name);}@AfterEachvoid tearDown(){if (jedis != null){jedis.close();}}
}
7.2.2 Jedis的連接池
Jedis本身是線程不安全的,并且頻繁的創建和銷毀連接會有性能損耗,因此我們推薦大家使用Jedis連接池代替Jedis的直連方式。
7.3 SpringDataRedis
SpringData是Spring中數據操作的模塊,包含對各種數據庫的集成,其中對Redis的集成模塊就叫做SpringDataRedis,官網地址:https://spring.io/projects/spring-data-redis
- 提供了對不同Redis客戶端的整合(Lettuce和Jedis)
- 提供了RedisTemplate統一API來操作Redis
- 支持Redis的發布訂閱模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的響應式編程
- 支持基于JDK、JSON、字符串、Spring對象的數據序列化及反序列化
- 支持基于Redis的JDKCollection實現
SpringDataRedis快速入門:
(1)創建SpringBoot項目
創建SpringBoot工程的時候,引入Lombok和Spring Data Redis依賴
(2)引入依賴
注意:spring-boot-starter-data-redis依賴在上一步創建SpringBoot工程時已經引入。
(3)配置文件
spring:data:redis:host: 192.168.31.20port: 6379password: 123456database: 5lettuce:pool:max-active: 8 # 最大連接max-idle: 8 # 最大空閑連接min-idle: 0 # 最小空閑連接max-wait: 100 # 連接等待時間
(4)使用
@SpringBootTest
class RedisSemoApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid testString(){// 寫入一條String數據redisTemplate.opsForValue().set("name", "虎");// 獲取String數據Object name = redisTemplate.opsForValue().get("name");System.out.println(name);}
}
?Java默認采用JdkSerializationRedisSerializer來序列化。
7.3.2 RedisSerializer
- GenericJackson2JsonRedisSerializer:建議value使用該序列化器,將 Java 對象序列化為?JSON 字符串?存入 Redis。
- StringRedisSerializer: 建議key使用該序列化器,直接將?
String
?編碼為 UTF-8 字節流,反向解碼也簡單。 - JdkSerializationRedisSerializer:使用 Java 原生序序列化機制將對象(
ObjectOutputStream
?/?ObjectInputStream
)序列化為二進制字節流。
RedisTemplate有兩種序列化實踐方案:自定義RedisTemplate和使用StringRedisTemplate
7.3.3?自定義RedisTemplate
- key使用string序列化
- value使用json序列化
缺點:
優點:可以直接將Java對象序列化成Json字符串
7.3.4?StringRedisTemplate
缺點:需要手動序列化Java對象為Json字符串
優點:不會帶來額外的內存
StringRedisTemplate使用步驟:
@SpringBootTest
class RedisSemoApplicationTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testvoid testString(){// 寫入一條String數據stringRedisTemplate.opsForValue().set("name", "虎哥");// 獲取String數據Object name = stringRedisTemplate.opsForValue().get("name");System.out.println(name);}private static final ObjectMapper objectMapper = new ObjectMapper();@Testvoid testSaveUser() throws JsonProcessingException {// 創建Java對象User user = new User("小明",18);// 手動序列化對象String jsonUser = objectMapper.writeValueAsString(user);System.out.println(jsonUser);// 寫入數據stringRedisTemplate.opsForValue().set("user", jsonUser);// 獲取數據String jsonUser1 = stringRedisTemplate.opsForValue().get("user");// 手動反序列化User user1 = objectMapper.readValue(jsonUser1, User.class);System.out.println(user1);}
}
??第二章:實戰篇??
0. 項目環境
- MySQL配置
- ip: 192.168.31.20
- port: 3306
- username: mysql_gtc
- password: gtc123
- Redis配置
- ip: 192.168.31.20
- port: 6379
- password: 123456
- 項目后端配置
- ip: localhost(192.168.31.10)
- port: 8081
- 項目前端配置
- ip: 192.168.31.20
- port: 8080