在上一节中,我带大家学习了详解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: 8080 spring: 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: update
4. 创建一个缓存配置类
主要是在该类上添加@EnableCaching注解,开启缓存功能。
package com.yyg.boot.config; import org.springframework.cache.annotation.EnableCaching; /** * @Author 一一哥Sun * @Date Created in 2020/4/14 * @Description Description * EnableCaching启用缓存 */ @Configuration @EnableCaching public 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 @ToString public 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; @Service public 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") @Slf4j public 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; @SpringBootApplication public class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class, args); } }
10. 完整项目结构
11. 启动项目进行测试
我们首先调用添加接口,往数据库中添加一条数据。
可以看到数据库中,已经成功的添加了一条数据。
然后测试一下查询接口方法。
此时控制台打印的User对象的hashCode如下:
我们再多次执行查询接口,发现User对象的hashCode值不变,说明数据都是来自于缓存,而不是每次都重新查询。
至此,我们就实现了Spring Boot中默认的缓存方案。
总结
到此这篇关于SpringBoot中默认缓存实现方案的示例代码的文章就介绍到这了,更多相关SpringBoot默认缓存内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍springboot hazelcast缓存中间件的实例代码,包括了springboot hazelcast缓存中间件的实例代码的使用技巧和注意事项,需要的朋友参考一下 缓存来了 在dotnet平台有自己的缓存框架,在java springboot里当然了集成了很多,而且缓存的中间件也可以进行多种选择,向 redis , hazelcast 都是分布式的缓存中间件,今天主要说一下后者
本文向大家介绍springboot集成spring cache缓存示例代码,包括了springboot集成spring cache缓存示例代码的使用技巧和注意事项,需要的朋友参考一下 本文介绍如何在springboot中使用默认的spring cache, 声明式缓存 Spring 定义 CacheManager 和 Cache 接口用来统一不同的缓存技术。例如 JCache、 EhCache、
本文向大家介绍SpringBoot使用Redis缓存的实现方法,包括了SpringBoot使用Redis缓存的实现方法的使用技巧和注意事项,需要的朋友参考一下 (1)pom.xml引入jar包,如下: (2)修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下: (3)application.properties中配置Redis连接信息,如下: (4)新建Redis
我正在开发一个有ContentManager类的应用程序。该类从包中迁移文件,并在首次打开应用程序时执行其他检查。接下来,在一个相当长的ViewController链末端的view controller中使用它。据我所知,有两种实现方法: > 在第一个ViewController中实例化类,并将其通过segue传递到最终的ViewController。 在第一个ViewController中创建一
本文向大家介绍springboot的缓存技术的实现,包括了springboot的缓存技术的实现的使用技巧和注意事项,需要的朋友参考一下 引子 我门知道一个程序的瓶颈在于数据库,我门也知道内存的速度是大大快于硬盘的速度的。当我门需要重复的获取相同的数据的时候,我门一次又一次的请求数据库或者远程服务,导致大量的时间耗费在数据库查询或者远程方法的调用上,导致程序性能的恶化,这更是数据缓存要解决的问题。
本文向大家介绍electron实现静默打印的示例代码,包括了electron实现静默打印的示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 electron+vuecli3 实现设置打印机,静默打印小票功能 网上相关的资料比较少,这里给大家分享一下,希望大家可以少踩一些坑 github地址 必须要强调一下的是electron的版本必须是3.0.0不能,我尝试了4和5都没有实现 效果图 使用