最近也不知道寫啥,看之前寫過Kafka整合Springboot的文章,大家反響還挺熱烈的,嘿嘿嘿,就感覺幫助到大家了還挺好的,也算是達到了自己的目的,正好,今天業務模塊是springboot整合redis,因為之前做過,所以有現成的代碼,cv一下之后就可以了,所以時間比較多,那就給大家整理一下Springboot整合Redis的代碼實現吧,從項目搭建到源碼實現,下面全都有,耐心看完,相信會對你有所幫助的
好了,話不多說,我們開始吧,同樣的,還是建議能夠自己在自己的PC端實現一下
個人公眾號:Java架構師聯盟,每日更新技術好文
一、使用Spring Initializr創建項目web項目
1、File→New→Project
2、點擊Next如圖所示,命名好Group和Artifact
3、Next后如圖所示,勾選中需要的依賴,Spring Initializr會自動導入所需的starter
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號員工,如圖所示。
2、再次訪問時,控制臺并沒有sql日志,如圖所示。
3、此時使用RedisDesktopManager工具查看redis時有數據,并且cacheName為emp,如圖所示
只是emp對象被序列化了。查看源碼可知Redis默認使用Jdk進行序列化。
1
2
3
|
static RedisSerializer<Object> java( @Nullable ClassLoader classLoader) { return new JdkSerializationRedisSerializer(classLoader); } |
查看RedisSerializer接口的實現有以下幾種:
我們常用的就是以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框架內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/biwz/archive/2020/12/08/14102204.html