缓存注解概念
名称
解释 Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等 CacheManager 缓存管理器,管理各种缓存(cache)组件 @Cacheable 主要针对方法配置,能够根据方法的请求参数对其进行缓存 @CacheEvict 清空缓存 @CachePut 保证方法被调用,又希望结果被缓存与@Cacheable区别在于是否每次都调用方法,常用于更新 @EnableCaching 开启基于注解的缓存 keyGenerator 缓存数据时key生成策略 serialize 缓存数据时value序列化策略 @CacheConfig 统一配置本类的缓存注解的属性
安装docker、redis
安装docker
yum -y install docker-ce
开机启动docker
systemctl start docker
检验docker是否安装成功
docker version
docker安装redis
docker pull redis
docker检测是否安装成功redis
docker images
docker启动redis并设置端口映射(-d表示后台运行)
docker run -p 6379:6379 -d redis:latest myredis
查看redis是否启动成功
docker ps
代码实现
在看代码前先看看目录结构吧(在这里使用ssm来整合redis)
数据库表结构
pom.xml文件,这里主要是引入spring-boot-starter-cache依赖
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> <dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> <optional>trueoptional> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-cacheartifactId> dependency> <dependency> <groupId>org.mybatis.spring.bootgroupId> <artifactId>mybatis-spring-boot-starterartifactId> <version>1.3.2version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.39version> dependency> dependencies>
配置文件application.yml,配置redis
spring: datasource: url: jdbc:mysql://localhost:3306/spring_boot_cache?useUnicode=true driver-class-name: com.mysql.jdbc.Driver username: root password: lzh redis: # 这是redis所在服务器的ip host: 192.168.126.129 timeout: 10000ms database: 0 lettuce: pool: max-wait: -1ms max-active: 8 max-idle: 8 min-idle: 0 cache: type: redis
启动类加入@EnableCaching注解
java;gutter:true;
package com.lzh.springbootstudytestcache;</p>
<p>import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;</p>
<p>@SpringBootApplication
@EnableCaching
public class SpringBootStudyTestCacheApplication {</p>
<pre><code>public static void main(String[] args) {
SpringApplication.run(SpringBootStudyTestCacheApplication.class, args);
}
</code></pre>
<p>}</p>
<pre><code>
UserController 类暴露接口
;gutter:true;
package com.lzh.springbootstudytestcache.controller;
import com.lzh.springbootstudytestcache.model.User;
import com.lzh.springbootstudytestcache.service.UserService;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author lzh
* create 2019-09-24-20:34
*/
@RestController
public class UserController {
@Autowired
UserService userService;
@GetMapping("/user/save")
public User saveUser(@RequestParam Integer id,@RequestParam String name,@RequestParam Integer age){
User user= userService.save(new User(id,name,age));
return user;
}
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Integer id){
System.out.println("id="+id);
User user = userService.findUserById(id);
System.out.println("getUserById – "+user);
return user;
}
@GetMapping("/user/update")
public User updateUser(@RequestParam Integer id,@RequestParam String name,@RequestParam Integer age){
User user= userService.updateUser(new User(id,name,age));
return user;
}
@GetMapping("/user/del/{id}")
public String deleteUser(@PathVariable Integer id){
System.out.println("id="+id);
int num = userService.deleteUser(id);
if (num > 0){
return "删除成功";
} else {
return "删除失败";
}
}
}
UserService接口
java;gutter:true;
package com.lzh.springbootstudytestcache.service;</p>
<p>import com.lzh.springbootstudytestcache.model.User;</p>
<p>/*<em>
* @author lzh
* create 2019-09-24-9:14
</em>/
public interface UserService {</p>
<pre><code>User save(User user);
User findUserById(Integer id);
User updateUser(User user);
int deleteUser(Integer id);
</code></pre>
<p>}</p>
<pre><code>
UserService实现类
;gutter:true;
package com.lzh.springbootstudytestcache.service.impl;
import com.lzh.springbootstudytestcache.mapper.UserMapper;
import com.lzh.springbootstudytestcache.model.User;
import com.lzh.springbootstudytestcache.service.UserService;
import lombok.extern.log4j.Log4j2;
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;
/**
* @author lzh
* create 2019-09-24-9:14
*/
@Service
@Log4j2
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Cacheable(value = "user",key = "#user.id")
@Override
public User save(User user) {
int saveNum = userMapper.saveUser(user);
System.out.println("saveNum="+saveNum);
return user;
}
@Cacheable(value = "user",key = "#id")
@Override
public User findUserById(Integer id) {
log.info("进入findUserById方法");
return userMapper.findUserById(id);
}
@CachePut(value = "user", key = "#user.id")
@Override
public User updateUser(User user) {
int num = userMapper.updateUser(user);
System.out.println("num="+num);
return user;
}
@CacheEvict(value = "user")
@Override
public int deleteUser(Integer id) {
return userMapper.deleteUser(id);
}
}
User实体类,加入@Data相当于加入getset方法,@AllArgsConstructor全参构造方法,@ToString重写tostring方法,引入Lombok简化代码
java;gutter:true;
package com.lzh.springbootstudytestcache.model;</p>
<p>import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;</p>
<p>import java.io.Serializable;</p>
<p>/*<em>
* @author Levin
* @since 2018/5/10 0007
</em>/
@Data
@AllArgsConstructor
@ToString
public class User implements Serializable {</p>
<pre><code>private Integer id;
private String name;
private Integer age;
</code></pre>
<p>}</p>
<pre><code>
UserMapper持久层,使用mybatis注解@Select、@Update、@Insert、@Delete实现
;gutter:true;
package com.lzh.springbootstudytestcache.mapper;
import com.lzh.springbootstudytestcache.model.User;
import org.apache.ibatis.annotations.*;
/**
* @author lzh
* create 2019-09-24-20:39
*/
@Mapper
public interface UserMapper {
@Select("SELECT * FROM User WHERE id = #{id}")
User findUserById(Integer id);
@Update("update user set name=#{name},age=#{age} where id=#{id}")
int updateUser(User user);
@Insert("insert into user set name=#{name},age=#{age}")
int saveUser(User user);
@Delete("DELETE FROM USER WHERE id=#{id}")
int deleteUser(Integer id);
}
改变默认jdk序列化器
java;gutter:true;
package com.lzh.springbootstudytestcache.config;</p>
<p>import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.*;</p>
<p>/*<em>
* @author lzh
* create 2019-09-24-22:22
</em>/
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;</p>
<p>import java.time.Duration;</p>
<p>//@Configuration
public class MyRedisConfig {</p>
<pre><code>//@Bean(name = "redisTemplate")
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(keySerializer());
redisTemplate.setHashKeySerializer(keySerializer());
redisTemplate.setValueSerializer(valueSerializer());
redisTemplate.setHashValueSerializer(valueSerializer());
return redisTemplate;
}
//@Primary
//@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
//缓存配置对象
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟
.disableCachingNullValues() //如果是空值,不缓存
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())) //设置key序列化器
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer()))); //设置value序列化器
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
private RedisSerializer keySerializer() {
return new StringRedisSerializer();
}
private RedisSerializer valueSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
</code></pre>
<p>}
测试
<span>启动srpingboot访问<a href="http://localhost:8080/user/1" rel="noopener">http://localhost:8080/user/1</a></span>
使用redis可视化工具查看发现多了一个user对象,这就是在执行查询语句的时候保存的缓存
看控制台这里打印出了日志,这是第一次查询,说明执行了sql语句
再次访问http://localhost:8080/user/1,没有执行findUserById方法说明没有执行sql语句,而是直接从redis缓存中读取
Original: https://www.cnblogs.com/raicho/p/11589518.html
Author: Raicho
Title: 完整SpringBoot Cache整合redis缓存(二)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580300/
转载文章受原作者版权保护。转载请注明原作者出处!