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

redis數據庫教程欄目介紹從零搭建springBoot2.X教程

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

推薦(免費):redis數據庫教程

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

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

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

1、File→New→Project

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

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

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

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

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

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

<?xml  version="1.0" encoding="UTF-8"?><project 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></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

<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-data-redis</artifactid></dependency>

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

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配置文件中配置數據源信息

#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

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用于開啟緩存。

@MapperScan("com.henya.springboot.mapper") @SpringBootApplication @EnableCaching?//開啟緩存 public?class?SpringBootRedisApplication?{  	public?static?void?main(String[]?args)?{ 		SpringApplication.run(SpringBootRedisApplication.class,?args); 	} }

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

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類

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號員工,如圖所示。

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

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

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

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

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

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

static?RedisSerializer<object>?java(@Nullable?ClassLoader?classLoader)?{ ?return?new?JdkSerializationRedisSerializer(classLoader); ?}</object>

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

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

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

三、自定義RedisCacheManager

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); ?} ?}</object></object>

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

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享