用整合的Spring Data Redis使用redis
1.导入坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置application.yml
spring:
application:
name: springdataredis_demo
#Redis相关配置
redis:
host: localhost
port: 6379
#password: 123456
database: 0 #操作的是0号数据库
jedis:
#Redis连接池配置
pool:
max-active: 8 #最大连接数
max-wait: 1ms #连接池最大阻塞等待时间
max-idle: 4 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
解释说明:
spring.redis.database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。
可以通过修改Redis配置文件来指定数据库的数量。
3.提供配置类
import org.springframework.cache.annotation.CachingConfigurerSupport;
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.StringRedisSerializer;
/**
*Redis配置类
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//默认的Key序列化器为:JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
解释说明:
当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别
4.注入RedisTemplate,调用方式使用
@Autowired
private RedisTemplate redisTemplate;
redisTemplate.opsForValue(); //操作字符串类型数据
//set:存 get:取 setIfAbsent:判断不存在再存
redisTemplate.opsForHash(); //操作哈希类型数据
//put:存 get:取 keys:获得所有字段 values:获得所有值
redisTemplate.opsForList(); //操作列表类型数据
//leftPush:存 range:取 //rightPop 取和删 //size:获得长度
redisTemplate.opsForSet(); //操作集合类型数据
//add:存 members:取 remove:删
redisTemplate.opsForZSet(); //操作有序集合类型数据
//add:存 range:取 remove:删
//通用操作
redisTemplate.keys("*"); //获取Redis中所有的key
redisTemplate.hasKey("某个key1"); //判断某个key是否存在
redisTemplate.delete("某个key2"); //删除指定key
redisTemplate.type("某个key3"); //获取指定key对应的value的数据类型
5.用SpringCache框架,基于注解实现缓存(在redis基础上用)
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。
Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。
1).在pom.xml导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2).application.yml中设置缓存过期时间
spring:
cache:
redis:
time-to-live: 1800000 #设置缓存数据的过期时间(30min)
3). 启动类上加入@EnableCaching注解
@SpringBootApplication
@MapperScan("com.itheima.mapper")
@ServletComponentScan
@EnableTransactionManagement
@EnableCaching
public class ReggieTakeOutApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieTakeOutApplication.class, args);
}
}
4).在需要的方法上加注解
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能(启动类上) |
@Cacheable | 在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中(一般放在list或getById方法上) |
@CachePut | 将方法的返回值放到缓存中(一般放在save或update方法上) |
@CacheEvict | 将一条或多条数据从缓存中删除(一般放在delete方法上) |
解释:上面根据实际情况使用,例如增删改用@CacheEvict,查用@Cacheable,等等
示例:
@Cacheable注解
/**
* Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
* value:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/
@Cacheable(value = "userCache",key = "#id")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
User user = userService.getById(id);
return user;
}
@CachePut注解
/**
*CachePut:将方法返回值放入缓存
*value:缓存的名称,每个缓存名称下面可以有多个key
*key:缓存的key
*/
@CachePut(value = "userCache", key = "#user.id")
@PostMapping
public User save(User user){
userService.save(user);
return user;
}
key的写法如下:
#user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;
#user.name: #user指的是方法形参的名称, name指的是user的name属性 ,也就是使用user的name属性作为key ;
#result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;
#result.name : #result代表方法返回值,该表达式 代表以返回对象的name属性作为key ;
@CacheEvict注解
/**
*CacheEvict:清理指定缓存
*value:缓存的名称,每个缓存名称下面可以有多个key
*key:缓存的key
*/
@CacheEvict(value = "userCache",key = "#p0") //#p0 代表第一个参数
//@CacheEvict(value = "userCache",key = "#root.args[0]") //#root.args[0] 代表第一个参数
//@CacheEvict(value = "userCache",key = "#id") //#id 代表变量名为id的参数
//@CacheEvict(value = "userCache",allEntries = true) //删除所有userCache的
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id){
userService.removeById(id);
}