目錄
1.起步
還是老規矩,直接開始,先用最簡單的配置運行起來:
pom.xml依賴 (只列出重要依賴)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
applicaiton.yml 配置:
spring:
# redis 配置
redis:
database: 8
# 地址
host: 127.0.0.1
# 端口,默認爲6379
port: 6379
# 密碼
password:
# 連接超時時間
timeout: 10s
lettuce:
pool:
# 連接池中的最小空閒連接
min-idle: 0
# 連接池中的最大空閒連接
max-idle: 8
# 連接池的最大數據庫連接數
max-active: 8
# #連接池最大阻塞等待時間(使用負值表示沒有限制)
max-wait: -1ms
寫一個簡單的工具類:RedisUtils
public class RedisUtils {
/**
* 此處使用的是Spring 默認提供的redisTemplate,(使用 JackSon 做序列化)
*/
@Resource
public RedisTemplate redisTemplate;
/**
* 插入緩存對象,Integer、String、實體類等
*
* @param key 緩存的鍵值
* @param value 緩存的值
* @param timeout 時間
* @param timeUnit 時間顆粒度
* @return 緩存的對象
*/
public <T> ValueOperations<String, T> setCacheObject(String key, T value, Integer timeout, TimeUnit timeUnit) {
ValueOperations<String, T> operation = redisTemplate.opsForValue();
operation.set(key, value, timeout, timeUnit);
return operation;
}
/**
* 獲得緩存的基本對象。
*
* @param key 緩存鍵值
* @return 緩存鍵值對應的數據
*/
public <T> T getCacheObject(String key) {
ValueOperations<String, T> operation = redisTemplate.opsForValue();
T t = operation.get(key);
return t;
}
}
簡單測試一下:(這裏要記得先在命令行使用命令 redis-server 啓動 redis 服務)
@Test
public void test1() {
redisUtils.setCacheObject("username", "swing");
System.out.println((String) redisUtils.getCacheObject("username"));
}
//結果:swing
2.鑽進去康一康
簡單的例子可以運行了,現在我們來簡要分析一下原理
redis和MySQL一樣,都是數據庫,只不過redis是非關係型的,而MySQL是關係型的,但他們還是有很多共同點的,
java 使用 JDBC 連接數據庫,JDBC提供了一套標準的接口(例如Connection,Statement等),而這套接口的實現由各大數據庫的廠家提供(也就是平時所說的數據庫連接驅動)
同樣,sprign-redis 也爲 redis 提供了一些這樣的接口,這裏重點說一下 RedisConnection
and RedisConnectionFactory
2.1.RedisConnection
RedisConnection提供了Redis通信的核心構建塊, 和JDBC中的Connection類似
RedisConnection 需要使用 RedisConnectionFactory獲取
2.2.RedisConnectionFactory
RedisConnectionFactory 常用的有兩種連接器的實現: Lettuce Connector 和 Jedis Connector,兩種實現方式的配置也很簡單,如下:
- Lettuce (spring-boot-redis的默認RedisConnectionFactory的默認實現)
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.3.1.RELEASE</version>
</dependency>
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
- Jedis
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
@Bean
public JedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
return new JedisConnectionFactory(config);
}
2.3. RedisTemplate
RedisConnection提供了接受和返回二進制值(字節數組)的低級方法,我們直接去使用RedisConnection操作redis的話無意效率太低(使用原生JDBC便能體會到這一點)所以便有了RedisTemplate , 它負責序列化和連接管理,使用戶無需處理此類細節。 使操作redis 更簡單高效
2.4.數據的序列化
Redis中存儲的數據僅爲字節。雖然Redis本身支持各種類型,但在大多數情況下,它們是指數據的存儲方式,而不是其表示的內容。由用戶決定是否將信息轉換爲字符串或任何其他對象。 在Spring Data中,用戶(自定義)類型和原始數據之間的轉換(反之亦然)由org.springframework.data.redis.serializer包中序列化器處理。
spring內置了這幾種序列化器:(所有的序列化器都是 RedisSerializer 的實現)
redis支持對鍵和值提供不同的序列化方式,如下實例:
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//指定鍵的序列化器
template.setKeySerializer(new StringRedisSerializer());
//指定值的序列化器
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
同樣,也支持自定義序列化器,例如使用FastJson 等