一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - 從零搭建SpringBoot2.X整合Redis框架的詳細教程

從零搭建SpringBoot2.X整合Redis框架的詳細教程

2021-01-07 17:10Java愛coding Redis

這篇文章主要介紹了從零搭建SpringBoot2.X整合Redis框架的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

最近也不知道寫啥,看之前寫過Kafka整合Springboot的文章,大家反響還挺熱烈的,嘿嘿嘿,就感覺幫助到大家了還挺好的,也算是達到了自己的目的,正好,今天業務模塊是springboot整合redis,因為之前做過,所以有現成的代碼,cv一下之后就可以了,所以時間比較多,那就給大家整理一下Springboot整合Redis的代碼實現吧,從項目搭建到源碼實現,下面全都有,耐心看完,相信會對你有所幫助的

好了,話不多說,我們開始吧,同樣的,還是建議能夠自己在自己的PC端實現一下
個人公眾號:Java架構師聯盟,每日更新技術好文

 

一、使用Spring Initializr創建項目web項目

 

1、File→New→Project

從零搭建SpringBoot2.X整合Redis框架的詳細教程

2、點擊Next如圖所示,命名好Group和Artifact

從零搭建SpringBoot2.X整合Redis框架的詳細教程

3、Next后如圖所示,勾選中需要的依賴,Spring Initializr會自動導入所需的starter

從零搭建SpringBoot2.X整合Redis框架的詳細教程

4、創建項目成功后,pom.xml文件中的依賴如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.heny</groupId>
    <artifactId>spring-boot-redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-redis</name>
    <description>Demo project for Spring Boot</description>
 
    <properties>
        <java.version>1.8</java.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
 
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
</project>

5、在pom.xml文件中添加redis的starter

?
1
2
3
4
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

6、創建JavaBean用于封裝數據庫數據,需要實現Serializable

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.henya.springboot.bean;
 
import java.io.Serializable;
 
public class Employee implements Serializable{
    
    private Integer id;
    private String lastName;
    private String email;
    private Integer gender; //性別 1男 0女
    private Integer dId;
    
    
    public Employee() {
        super();
    }
 
    
    public Employee(Integer id, String lastName, String email, Integer gender, Integer dId) {
        super();
        this.id = id;
        this.lastName = lastName;
        this.email = email;
        this.gender = gender;
        this.dId = dId;
    }
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Integer getGender() {
        return gender;
    }
    public void setGender(Integer gender) {
        this.gender = gender;
    }
    public Integer getdId() {
        return dId;
    }
    public void setdId(Integer dId) {
        this.dId = dId;
    }
    @Override
    public String toString() {
        return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + ", dId="
                + dId + "]";
    }
}

注意:
在寫JavaBean對象時需要實現Serializable接口否則會報以下錯誤:

Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException

7、整合Mybatis操作數據庫,在application.properties配置文件中配置數據源信息

?
1
2
3
4
5
6
7
8
9
#serverTimezone用于指定時區,不然會報錯
spring.datasource.url=jdbc:mysql://localhost:3306/cache?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
 
# 開啟駝峰命名法規則
mybatis.configuration.map-underscore-to-camel-case=true
#日志級別
logging.level.com.henya.springboot.mapper=debug

8、使用注解版Mybatis創建Mapper

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.henya.springboot.mapper;
 
 
import com.henya.springboot.bean.Employee;
import org.apache.ibatis.annotations.*;
 
@Mapper
public interface EmployeeMapper {
 
 @Select("SELECT * FROM employee WHERE id=#{id}")
 public Employee getEmpById(Integer id);
 
 @Update("UPDATE employee SET lastName=#{lastName},email=#{email},gender=#{gender},d_id=#{dId} WHERE id=#{id}")
 public void updateEmp(Employee employee);
 
 @Delete("DELETE FROM emlpoyee WHERE id=#{id}")
 public void delEmpById(Integer id);
 
 @Insert("INSERT INTO employee(lastName, email, gender, d_id) VALUES (#{lastName}, #{email}, #{gender}, #{dId})")
 public Employee insertEmp(Employee employee);
 
 @Select("SELECT * FROM employee WHERE lastName=#{lastName}")
 public Employee getEmpByLastName(String lastName);
}

注意:
需要使用使用@MapperScan注解掃描Mapper所在的接口,只需要加在主程序類上即可。除此之外,還要使用@EnableCaching用于開啟緩存。

?
1
2
3
4
5
6
7
8
9
@MapperScan("com.henya.springboot.mapper")
@SpringBootApplication
@EnableCaching //開啟緩存
public class SpringBootRedisApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringBootRedisApplication.class, args);
    }
}

9、編寫Service類,用于訪問數據庫或redis緩存

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.henya.springboot.service;
import com.henya.springboot.bean.Employee;
import com.henya.springboot.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;
 
@CacheConfig(cacheNames = "emp") //抽取緩存的公共配置
@Service
public class EmployeeService {
 @Autowired
 EmployeeMapper employeeMapper;
 
 /**
 * @param id
 * @return
 */
 @Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator")
 public Employee getEmpById(Integer id) {
 System.err.println("開始查詢"+ id +"號員工");
 Employee employee = employeeMapper.getEmpById(id);
 return employee;
 }
 
 /**
 * @CachePut:既調用方法(這個方法必須要執行),又更新緩存數據
 * @param employee
 * @return
 */
 @CachePut(value = "emp",key = "#result.id")
 public Employee updateEmp(Employee employee){
 System.err.println("開始更新" + employee.getId() + "號員工");
 employeeMapper.updateEmp(employee);
 return employee;
 }
 
 /**
 * @CacheEvict:緩存清除
 * @param id
 */
 @CacheEvict(value = "emp",beforeInvocation = true)
 public void deleteEmp(Integer id){
 System.err.println("刪除" + id + "員工");
 int i = 10/0;
 }

10、編寫Controller類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.henya.springboot.controller;
 
 
import com.henya.springboot.bean.Employee;
import com.henya.springboot.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @Description:
 * @Author:HenYa
 * @CreatTime:2019/12/1 12:44
 */
@RestController
public class EmployeeController {
 @Autowired
 EmployeeService employeeService;
 
 @GetMapping("/emp/{id}")
 public Employee getEmpById(@PathVariable("id") Integer id){
 Employee employee = employeeService.getEmpById(id);
 return employee;
 }
 
 @GetMapping("/emp")
 public Employee updateEmp(Employee employee){
 Employee emp = employeeService.updateEmp(employee);
 return emp;
 }
}

 

二、測試SpringBoot整合Redis是否成功

 

1、在瀏覽器訪問,也可以使用測試類,筆者使用了瀏覽器訪問http://localhost:8080/emp/1進行測試,初次訪問時,控制臺會提示開始查詢1號員工,如圖所示。

從零搭建SpringBoot2.X整合Redis框架的詳細教程

2、再次訪問時,控制臺并沒有sql日志,如圖所示。

從零搭建SpringBoot2.X整合Redis框架的詳細教程

3、此時使用RedisDesktopManager工具查看redis時有數據,并且cacheName為emp,如圖所示

從零搭建SpringBoot2.X整合Redis框架的詳細教程

只是emp對象被序列化了。查看源碼可知Redis默認使用Jdk進行序列化。

?
1
2
3
static RedisSerializer<Object> java(@Nullable ClassLoader classLoader) {
 return new JdkSerializationRedisSerializer(classLoader);
 }

查看RedisSerializer接口的實現有以下幾種:

從零搭建SpringBoot2.X整合Redis框架的詳細教程

我們常用的就是以json的格式進行序列化。但是需要自定義RedisCacheManager。

 

三、自定義RedisCacheManager

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.henya.springboot.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
 
/**
 * @Description:
 * @Author:HenYa
 * @CreatTime:2019/12/6 20:50
 */
@Configuration
public class MyRedisConfig {
 @Bean
 public RedisCacheManager empCacheManager(RedisConnectionFactory redisConnectionFactory){
 //RedisCacheManager redisCacheManager = new RedisCacheManager(redisConnectionFactory);
 RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
 
 RedisSerializer<Object> redisSerializer = new GenericJackson2JsonRedisSerializer();
 
 RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer);
 RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
 // 默認會將CacheName作為key的前綴
 return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
 }
 }

此時,Redis中緩存數據就以Json的格式進行序列化,如圖所示。

從零搭建SpringBoot2.X整合Redis框架的詳細教程

到此這篇關于從零搭建SpringBoot2.X整合Redis框架的詳細教程的文章就介紹到這了,更多相關SpringBoot2.X整合Redis框架內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/biwz/archive/2020/12/08/14102204.html

延伸 · 閱讀

精彩推薦
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
主站蜘蛛池模板: 久久热国产在线视频 | 51香蕉视频| bestialityvideo另类| 亚洲视频久久 | 亚洲高清视频在线观看 | 精品国产人成亚洲区 | 国产在线拍 | 国产精品思瑞在线观看 | 日本视频一区在线观看免费 | 欧美又大又粗又爽视频 | 精品一久久香蕉国产二月 | 色中文字幕 | 爱爱调教 | 欧美人在线一区二区三区 | 消息称老熟妇乱视频一区二区 | 被强迫调教的高辣小说 | 厨房里摸着乳丰满在线观看 | 国产老村长足疗店对白 | 久久艹影院 | 日本高清视频网站www | 日韩毛片在线视频 | 亚洲成综合人影院在院播放 | 成全视频在线观看免费 | 色偷偷亚洲综合网亚洲 | 国产欧美又粗又猛又爽老 | 国产成人一区二区三区 | 按摩椅play啊太快了h | 国产精品一区牛牛影视 | 午夜a一级毛片 | 日韩欧美亚洲一区二区综合 | 欧美靠逼 | 国产精品久久久久毛片真精品 | 国产欧美日韩精品在线 | 青青青手机视频在线观看 | 亚洲 制服 欧美 中文字幕 | 国产午夜视频在线观看网站 | 91拍拍 | 日本一区二区三区精品 | 香蕉视频在线观看网站 | 97久久久亚洲综合久久88 | 成人看片免费无限观看视频 |