redis數據庫教程欄目介紹從零搭建springBoot2.X教程
推薦(免費):redis數據庫教程
最近也不知道寫啥,看之前寫過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文件中的依賴如下
<?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號員工,如圖所示。
2、再次訪問時,控制臺并沒有sql日志,如圖所示。
3、此時使用RedisDesktopManager工具查看redis時有數據,并且cacheName為emp,如圖所示
只是emp對象被序列化了。查看源碼可知Redis默認使用Jdk進行序列化。
static?RedisSerializer<object>?java(@Nullable?ClassLoader?classLoader)?{ ?return?new?JdkSerializationRedisSerializer(classLoader); ?}</object>
查看RedisSerializer接口的實現有以下幾種:
我們常用的就是以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的格式進行序列化,如圖所示。