您好,登錄后才能下訂單哦!
SpringBoot
?是為了簡化?Spring
?應(yīng)用的創(chuàng)建、運行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個 WEB 工程
Spring Boot
?除了支持常見的ORM框架外,更是對常用的中間件提供了非常好封裝,隨著Spring Boot2.x
的到來,支持的組件越來越豐富,也越來越成熟,其中對Redis
的支持不僅僅是豐富了它的API,更是替換掉底層Jedis
的依賴,取而代之換成了Lettuce(生菜)
Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。相比Memcached
它支持存儲的類型相對更多(字符、哈希、集合、有序集合、列表、GEO),同時Redis是線程安全的。2010年3月15日起,Redis的開發(fā)工作由VMware主持,2013年5月開始,Redis的開發(fā)由Pivotal
贊助。
Lettuce
?和?Jedis
?的都是連接Redis Server
的客戶端程序。Jedis
在實現(xiàn)上是直連redis server,多線程環(huán)境下非線程安全,除非使用連接池,為每個Jedis實例增加物理連接。Lettuce
基于Netty的連接實例(StatefulRedisConnection),可以在多個線程間并發(fā)訪問,且線程安全,滿足多線程環(huán)境下的并發(fā)訪問,同時它是可伸縮的設(shè)計,一個連接實例不夠的情況也可以按需增加連接實例。
在?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
?文件中配置如下內(nèi)容,由于Spring Boot2.x
?的改動,連接池相關(guān)配置需要通過spring.redis.lettuce.pool
或者?spring.redis.jedis.pool
?進(jìn)行配置了
spring.redis.host=localhost
spring.redis.password=battcn
# 連接超時時間(毫秒)
spring.redis.timeout=10000
# Redis默認(rèn)情況下有16個分片,這里配置具體使用的分片,默認(rèn)是0
spring.redis.database=0
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制) 默認(rèn) 8
spring.redis.lettuce.pool.max-active=8
# 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制) 默認(rèn) -1
spring.redis.lettuce.pool.max-wait=-1
# 連接池中的最大空閑連接 默認(rèn) 8
spring.redis.lettuce.pool.max-idle=8
# 連接池中的最小空閑連接 默認(rèn) 0
spring.redis.lettuce.pool.min-idle=0
Spring Boot
對Redis
的支持已經(jīng)非常完善了,良好的序列化以及豐富的API足夠應(yīng)對日常開發(fā)
創(chuàng)建一個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
}
默認(rèn)情況下的模板只能支持RedisTemplate<String, String>
,也就是只能存入字符串,這在開發(fā)中是不友好的,所以自定義模板是很有必要的,當(dāng)自定義了模板又想使用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;
}
}
完成準(zhǔn)備事項后,編寫一個junit
測試類來檢驗代碼的正確性,有很多人質(zhì)疑過Redis
線程安全性,故下面也提供了響應(yīng)的測試案例,如有疑問歡迎指正
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("[字符緩存結(jié)果] - [{}]", k1);
// TODO 以下只演示整合,具體Redis命令可以參考官方文檔,Spring Data Redis 只是改了個名字而已,Redis支持的命令它都支持
String key = "battcn:user:1";
redisCacheTemplate.opsForValue().set(key, new User(1L, "u1", "pa"));
// TODO 對應(yīng) String(字符串)
final User user = (User) redisCacheTemplate.opsForValue().get(key);
log.info("[對象緩存結(jié)果] - [{}]", user);
}
}
其它類型
下列的就是Redis
其它類型所對應(yīng)的操作方式
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
目前很多大佬都寫過關(guān)于?SpringBoot?的教程了,如有雷同,請多多包涵,本教程基于最新的?spring-boot-starter-parent:2.0.1.RELEASE
編寫,包括新版本的特性都會一起介紹
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。