SpringBoot整合Redis
使用Redis數據庫
Redis簡介
Redis(官網地址:https://redis.io/)是一個非關係型的高性能緩存數據庫,使用ANSI C語言開發,是一種Key-Value模式的數據庫,以Key-Value的形式存儲數據,支持多種value類型,如string(字符串)、list(鏈表)、set(集合)、zset(sorted set,有序集合)和hash(哈希類型)。
Redis支持多種開發語言,如Java、C/C++、C#、PHP、JavaScript、Perl、Objective-C、Python、Ruby、Erlang等。同時,Redis還支持數據的持久化,不只可以將數據存儲在內存中,還可以將數據存儲到硬盤內,不需要擔心數據的丟失。在性能方面,Redis官方(官網地址:https://redis.io/)提供了這樣的數據:讀的速度是110 000次/s,寫的速度是81 000次/s,是一個真正的高性能數據庫。
對於Redis來說,我們可能對它使用的更多的是緩存,畢竟它可以高效地對數據進行操作。其實它還具備很多功能,比如消息隊列、發佈、訂閱消息等。另外,它提供了持久化的方式。Spring Boot使用Redis數據庫分爲兩步:
(1)在pom文件中加入依賴
(2)在配置文件中加入配置
添加redis的起步依賴
在創建項目之前,需要啓動Redis。啓動Redis後,
在Windows 啓動 redis-server.exe redis服務端
這個項目項目,實在SpringBoot整合Spring Data JPA基礎上添加的,
在pom文件中加入Redis依賴
<!-- 配置使用redis啓動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置redis的連接信息
application.properties
在配置文件中配置Redis信息,這裏只配置Redis服務地址和端口,嗯。
#Redis
#Redis服務器地址
spring.redis.host=127.0.0.1
spring.redis.port=6379
注入RedisTemplate測試redis操作
從redis中獲得數據 數據的形式 json字符串
判斷redis中是否存在數據
不存在數據,從數據庫拿再放到Redis數據庫
將數據在控制檯打印
存在,直接緩存拿數據 ,沒有在其他的地方拿 。
注入RedisTemplate,用於對Redis緩存進行操作。創建兩個方法:Set方法和Get方法,分別用於使用RedisTemplate進行存放數據和取出數據
package cn.liuawen;
import cn.liuawen.domain.User;
import cn.liuawen.repository.UserRepository;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJpaApplication.class)
public class RedisTest {
@Autowired
private UserRepository userRepository;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Test
public void test() throws JsonProcessingException {
//從redis緩存中獲得指定的數據
String userListData = redisTemplate.boundValueOps("user.findAll").get();
//如果redis中沒有數據的話
if(null==userListData){
//查詢數據庫獲得數據
List<User> all = userRepository.findAll();
//轉換成json格式字符串
ObjectMapper om = new ObjectMapper();
userListData = om.writeValueAsString(all);
//將數據存儲到redis中,下次在查詢直接從redis中獲得數據,不用在查詢數據庫
redisTemplate.boundValueOps("user.findAll").set(userListData);
System.out.println("===============從數據庫獲得數據===============");
}else{
System.out.println("===============從redis緩存中獲得數據===============");
}
System.out.println(userListData);
}
}
開始redis沒有數據
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
執行一次
===============從數據庫獲得數據===============
[{"id":1,"username":"菜雞文","password":"123"},{"id":2,"username":"柳小子","password":"123"}]
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> keys *
1) "user.findAll"
127.0.0.1:6379> get user.findAll
"[{\"id\":1,\"username\":\"\xe8\x8f\x9c\xe9\xb8\xa1\xe6\x96\x87\",\"password\":\"123\"},{\"id\":2,\"username\":\"\xe6\x9f\xb3\xe5\xb0\x8f\xe5\xad\x90\",\"password\":\"123\"}]"
127.0.0.1:6379>
redis有數據了
再執行一次test(), 從redis緩存中拿到數據了
===============從redis緩存中獲得數據===============
[{"id":1,"username":"菜雞文","password":"123"},{"id":2,"username":"柳小子","password":"123"}]