您好,登錄后才能下訂單哦!
SpringBoot
?是為了簡化?Spring
?應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程
Spring Boot
?除了支持常見的ORM框架外,更是對常用的中間件提供了非常好封裝,隨著Spring Boot2.x
的到來,支持的組件越來越豐富,也越來越成熟,其中對Redis
的支持不僅僅是豐富了它的API,更是替換掉底層Jedis
的依賴,取而代之換成了Lettuce(生菜)
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。相比Memcached
它支持存儲的類型相對更多(字符、哈希、集合、有序集合、列表、GEO),同時Redis是線程安全的。2010年3月15日起,Redis的開發工作由VMware主持,2013年5月開始,Redis的開發由Pivotal
贊助。
Lettuce
?和?Jedis
?的都是連接Redis Server
的客戶端程序。Jedis
在實現上是直連redis server,多線程環境下非線程安全,除非使用連接池,為每個Jedis實例增加物理連接。Lettuce
基于Netty的連接實例(StatefulRedisConnection),可以在多個線程間并發訪問,且線程安全,滿足多線程環境下的并發訪問,同時它是可伸縮的設計,一個連接實例不夠的情況也可以按需增加連接實例。
在?pom.xml
?中spring-boot-starter-data-redis
的依賴,Spring Boot2.x
?后底層不在是Jedis
如果做版本升級的朋友需要注意下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
在?application.properties
?文件中配置如下內容,由于Spring Boot2.x
?的改動,連接池相關配置需要通過spring.redis.lettuce.pool
或者?spring.redis.jedis.pool
?進行配置了
spring.redis.host=localhost
spring.redis.password=battcn
# 連接超時時間(毫秒)
spring.redis.timeout=10000
# Redis默認情況下有16個分片,這里配置具體使用的分片,默認是0
spring.redis.database=0
# 連接池最大連接數(使用負值表示沒有限制) 默認 8
spring.redis.lettuce.pool.max-active=8
# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
spring.redis.lettuce.pool.max-wait=-1
# 連接池中的最大空閑連接 默認 8
spring.redis.lettuce.pool.max-idle=8
# 連接池中的最小空閑連接 默認 0
spring.redis.lettuce.pool.min-idle=0
Spring Boot
對Redis
的支持已經非常完善了,良好的序列化以及豐富的API足夠應對日常開發
創建一個User
類
package com.battcn.entity;
import java.io.Serializable;
/**
* @author Levin
* @since 2018/5/10 0007
*/
public class User implements Serializable {
private static final long serialVersionUID = 8655851615465363473L;
private Long id;
private String username;
private String password;
// TODO 省略get set
}
默認情況下的模板只能支持RedisTemplate<String, String>
,也就是只能存入字符串,這在開發中是不友好的,所以自定義模板是很有必要的,當自定義了模板又想使用String
存儲這時候就可以使用StringRedisTemplate
的方式,它們并不沖突…
package com.battcn.config;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.io.Serializable;
/**
* TODO 修改database
*
* @author Levin
* @since 2018/5/10 0022
*/
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisCacheAutoConfiguration {
@Bean
public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Serializable> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
完成準備事項后,編寫一個junit
測試類來檢驗代碼的正確性,有很多人質疑過Redis
線程安全性,故下面也提供了響應的測試案例,如有疑問歡迎指正
package com.battcn;
import com.battcn.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.Serializable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;
/**
* @author Levin
* @since 2018/5/10 0010
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter8ApplicationTest {
private static final Logger log = LoggerFactory.getLogger(Chapter8ApplicationTest.class);
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisTemplate<String, Serializable> redisCacheTemplate;
@Test
public void get() {
// TODO 測試線程安全
ExecutorService executorService = Executors.newFixedThreadPool(1000);
IntStream.range(0, 1000).forEach(i ->
executorService.execute(() -> stringRedisTemplate.opsForValue().increment("kk", 1))
);
stringRedisTemplate.opsForValue().set("k1", "v1");
final String k1 = stringRedisTemplate.opsForValue().get("k1");
log.info("[字符緩存結果] - [{}]", k1);
// TODO 以下只演示整合,具體Redis命令可以參考官方文檔,Spring Data Redis 只是改了個名字而已,Redis支持的命令它都支持
String key = "battcn:user:1";
redisCacheTemplate.opsForValue().set(key, new User(1L, "u1", "pa"));
// TODO 對應 String(字符串)
final User user = (User) redisCacheTemplate.opsForValue().get(key);
log.info("[對象緩存結果] - [{}]", user);
}
}
其它類型
下列的就是Redis
其它類型所對應的操作方式
spring-data-redis文檔:?https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/reference/html/#new-in-2.0.0
Redis 文檔:?https://redis.io/documentation
Redis 中文文檔:?http://www.redis.cn/commands.html
目前很多大佬都寫過關于?SpringBoot?的教程了,如有雷同,請多多包涵,本教程基于最新的?spring-boot-starter-parent:2.0.1.RELEASE
編寫,包括新版本的特性都會一起介紹
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。