时间:2021-05-20
在上一节中,我带大家学习了详解SpringBoot集成Redis来实现缓存技术方案,尤其是结合Spring Cache的注解的实现方案,接下来在本章节中,我带大家通过代码来实现。
一. Spring Boot实现默认缓存
1. 创建web项目
我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。
2. 添加依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId></dependency>3. 创建application.yml配置文件
server: port: 8080spring: application: name: cache-demo datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: syc url: jdbc:mysql://localhost:3306/spring-security?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&serverTimezone=UTC #cache: #type: generic #由redis进行缓存,一共有10种缓存方案 jpa: database: mysql show-sql: true #开发阶段,打印要执行的sql语句. hibernate: ddl-auto: update4. 创建一个缓存配置类
主要是在该类上添加@EnableCaching注解,开启缓存功能。
package com.yyg.boot.config; import org.springframework.cache.annotation.EnableCaching; /** * @Author 一一哥Sun * @Date Created in 2020/4/14 * @Description Description * EnableCaching启用缓存 */ @Configuration@EnableCachingpublic class CacheConfig {}5. 创建User实体类
package com.yyg.boot.domain; import lombok.Data;import lombok.ToString; import javax.persistence.*;import java.io.Serializable; @Entity@Table(name="user")@Data@ToStringpublic class User implements Serializable { //IllegalArgumentException: DefaultSerializer requires a Serializable payload // but received an object of type [com.syc.redis.domain.User] @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column private String username; @Column private String password; }6. 创建User仓库类
package com.yyg.boot.repository; import com.yyg.boot.domain.User;import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User,Long> {}7. 创建Service服务类
定义UserService接口
package com.yyg.boot.service; import com.yyg.boot.domain.User; public interface UserService { User findById(Long id); User save(User user); void deleteById(Long id); }实现UserServiceImpl类
package com.yyg.boot.service.impl; import com.yyg.boot.domain.User;import com.yyg.boot.repository.UserRepository;import com.yyg.boot.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service; @Servicepublic class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; //普通的缓存+数据库查询代码实现逻辑: //User user=RedisUtil.get(key); // if(user==null){ // user=userDao.findById(id); // //redis的key="product_item_"+id // RedisUtil.set(key,user); // } // return user; /** * 注解@Cacheable:查询的时候才使用该注解! * 注意:在Cacheable注解中支持EL表达式 * redis缓存的key=user_1/2/3.... * redis的缓存雪崩,缓存穿透,缓存预热,缓存更新... * condition = "#result ne null",条件表达式,当满足某个条件的时候才进行缓存 * unless = "#result eq null":当user对象为空的时候,不进行缓存 */ @Cacheable(value = "user", key = "#id", unless = "#result eq null") @Override public User findById(Long id) { return userRepository.findById(id).orElse(null); } /** * 注解@CachePut:一般用在添加和修改方法中 * 既往数据库中添加一个新的对象,于此同时也往redis缓存中添加一个对应的缓存. * 这样可以达到缓存预热的目的. */ @CachePut(value = "user", key = "#result.id", unless = "#result eq null") @Override public User save(User user) { return userRepository.save(user); } /** * CacheEvict:一般用在删除方法中 */ @CacheEvict(value = "user", key = "#id") @Override public void deleteById(Long id) { userRepository.deleteById(id); } }8. 创建Controller接口方法
package com.yyg.boot.web; import com.yyg.boot.domain.User;import com.yyg.boot.service.UserService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*; @RestController@RequestMapping("/user")@Slf4jpublic class UserController { @Autowired private UserService userService; @PostMapping public User saveUser(@RequestBody User user) { return userService.save(user); } @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable("id") Long id) { User user = userService.findById(id); log.warn("user="+user.hashCode()); HttpStatus status = user == null ? HttpStatus.NOT_FOUND : HttpStatus.OK; return new ResponseEntity<>(user, status); } @DeleteMapping("/{id}") public String removeUser(@PathVariable("id") Long id) { userService.deleteById(id); return "ok"; } }9. 创建入口类
package com.yyg.boot; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplicationpublic class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class, args); } }10. 完整项目结构
11. 启动项目进行测试
我们首先调用添加接口,往数据库中添加一条数据。
可以看到数据库中,已经成功的添加了一条数据。
然后测试一下查询接口方法。
此时控制台打印的User对象的hashCode如下:
我们再多次执行查询接口,发现User对象的hashCode值不变,说明数据都是来自于缓存,而不是每次都重新查询。
至此,我们就实现了Spring Boot中默认的缓存方案。
总结
到此这篇关于SpringBoot中默认缓存实现方案的示例代码的文章就介绍到这了,更多相关SpringBoot默认缓存内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Springboot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。但是要切换
这篇文章主要介绍了SpringBoot加入GuavaCache实现本地缓存代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
本篇介绍了SpringBoot缓存(EhCache2.x篇),分享给大家,具体如下:SpringBoot缓存在springBoot中,通过@EnableCach
本次内容主要介绍基于Ehcache3.0来快速实现SpringBoot应用程序的数据缓存功能。在SpringBoot应用程序中,我们可以通过SpringCach
本次内容主要介绍基于Ehcache3.0来快速实现SpringBoot应用程序的数据缓存功能。在SpringBoot应用程序中,我们可以通过SpringCach