后端开发总是要保证数据返回的速度越快越好,可是数据库查询就是那么个速度,通过优化SQL和数据库配置都不是最合理的方法。所以今天我们来看一下缓存。
话说缓存,我们总是第一时间想到redis,可是最关键的是redis需要自己启动客户端,这就比较麻烦了。我们只是需要缓存简单的数据怎么办?springboot为我们想到了这个问题,于是默认添加了缓存ConcurrentMapCacheManager。
不再赘述,参考之前的文章即可
<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-web</artifactId> </dependency>
这里我们使用jpa。
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '姓名', `address` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '地址', `age` int NULL DEFAULT NULL COMMENT '年龄', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
/** * 实体类 * @author zhouzhaodong */ @Entity public class User implements Serializable { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private int id; private String name; private String address; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '/'' + ", address='" + address + '/'' + ", age=" + age + '}'; } }
/** * 数据库访问层 * @author zhouzhaodong */ public interface UserRepository extends JpaRepository<User, Integer> { /** * 根据id更新 * * @param id * @param name * @param address * @param age */ @Modifying @Query(value = "update user u set u.name = :name, u.address = :address, u.age = :age where u.id = :id", nativeQuery = true) User updateById(@Param("id") Integer id, @Param("name") String name, @Param("address") String address, @Param("age") int age); }
/** * Service * @author zhouzhaodong */ @Service public interface UserService { /** * 新增 * @param user * @return */ User insert(User user); /** * 删除 * @param id * @return */ void delete(int id); /** * 更新 * @param user * @return */ void update(User user); /** * 根据id查询 * @param id * @return */ Object findById(int id); }
/** * 实现类 * @author zhouzhaodong */ @Service public class UserServiceImpl implements UserService { @Resource UserRepository userRepository; @Override @CachePut(value = "user", key = "#result.id") public User insert(User user) { return userRepository.save(user); } @Override @CacheEvict(value = "user", key = "#id") public void delete(int id) { userRepository.deleteById(id); } @Override @CachePut(value = "user", key = "#user.id") public User update(User user) { return userRepository.updateById(user.getId(), user.getName(), user.getAddress(), user.getAge()); } @Override @Cacheable(value = "user", key = "#id") public Object findById(int id) { return userRepository.findById(id); } }
/** * 控制层 * @author zhouzhaodong */ @RestController public class UserController { @Resource UserService userService; @RequestMapping("/save") public User saveUser(User user){ return userService.insert(user); } @RequestMapping("/delete") public void deleteUser(int id){ userService.delete(id); } @RequestMapping("/update") public User updateUser(User user){ return userService.update(user); } @RequestMapping("/find") public Object findById(int id){ return userService.findById(id); } }
/** * 启动类 * @author zhouzhaodong */ @SpringBootApplication @EnableCaching public class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class, args); } }
server: port: 8989 # 端口号 spring: datasource: url: jdbc:mysql://ip地址:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&rewriteBatchedStatements=true username: 用户名 password: 密码 jpa: show-sql: true # 打印sql properties: hibernate: format_sql: true # 打印sql
首先新增数据,然后进行查询就会发现并不走数据库查询,控制台不打印sql,缓存成功。
https://github.com/zhouzhaodong/springboot/tree/master/cache