用整合的Spring Data Redis使用redis

1.导入坐标

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

2.配置application.yml

  1. spring:
  2. application:
  3. name: springdataredis_demo
  4. #Redis相关配置
  5. redis:
  6. host: localhost
  7. port: 6379
  8. #password: 123456
  9. database: 0 #操作的是0号数据库
  10. jedis:
  11. #Redis连接池配置
  12. pool:
  13. max-active: 8 #最大连接数
  14. max-wait: 1ms #连接池最大阻塞等待时间
  15. max-idle: 4 #连接池中的最大空闲连接
  16. min-idle: 0 #连接池中的最小空闲连接

解释说明:

spring.redis.database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。

可以通过修改Redis配置文件来指定数据库的数量。

3.提供配置类

  1. import org.springframework.cache.annotation.CachingConfigurerSupport;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.data.redis.connection.RedisConnectionFactory;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.data.redis.serializer.StringRedisSerializer;
  7. /**
  8. *Redis配置类
  9. */
  10. @Configuration
  11. public class RedisConfig extends CachingConfigurerSupport {
  12. @Bean
  13. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  14. RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
  15. //默认的Key序列化器为:JdkSerializationRedisSerializer
  16. redisTemplate.setKeySerializer(new StringRedisSerializer());
  17. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  18. redisTemplate.setValueSerializer(new StringRedisSerializer());
  19. redisTemplate.setHashValueSerializer(new StringRedisSerializer());
  20. redisTemplate.setConnectionFactory(connectionFactory);
  21. return redisTemplate;
  22. }
  23. }

解释说明:

当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别

4.注入RedisTemplate,调用方式使用

  1. @Autowired
  2. private RedisTemplate redisTemplate;
  3. redisTemplate.opsForValue(); //操作字符串类型数据
  4. //set:存 get:取 setIfAbsent:判断不存在再存
  5. redisTemplate.opsForHash(); //操作哈希类型数据
  6. //put:存 get:取 keys:获得所有字段 values:获得所有值
  7. redisTemplate.opsForList(); //操作列表类型数据
  8. //leftPush:存 range:取 //rightPop 取和删 //size:获得长度
  9. redisTemplate.opsForSet(); //操作集合类型数据
  10. //add:存 members:取 remove:删
  11. redisTemplate.opsForZSet(); //操作有序集合类型数据
  12. //add:存 range:取 remove:删
  13. //通用操作
  14. redisTemplate.keys("*"); //获取Redis中所有的key
  15. redisTemplate.hasKey("某个key1"); //判断某个key是否存在
  16. redisTemplate.delete("某个key2"); //删除指定key
  17. redisTemplate.type("某个key3"); //获取指定key对应的value的数据类型

5.用SpringCache框架,基于注解实现缓存(在redis基础上用)

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。

Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。

1).在pom.xml导入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-cache</artifactId>
  4. </dependency>

2).application.yml中设置缓存过期时间

  1. spring:
  2. cache:
  3. redis:
  4. time-to-live: 1800000 #设置缓存数据的过期时间(30min)

3). 启动类上加入@EnableCaching注解

  1. @SpringBootApplication
  2. @MapperScan("com.itheima.mapper")
  3. @ServletComponentScan
  4. @EnableTransactionManagement
  5. @EnableCaching
  6. public class ReggieTakeOutApplication {
  7. public static void main(String[] args) {
  8. SpringApplication.run(ReggieTakeOutApplication.class, args);
  9. }
  10. }

4).在需要的方法上加注解

注解 说明
@EnableCaching 开启缓存注解功能(启动类上)
@Cacheable 在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中(一般放在list或getById方法上)
@CachePut 将方法的返回值放到缓存中(一般放在save或update方法上)
@CacheEvict 将一条或多条数据从缓存中删除(一般放在delete方法上)

解释:上面根据实际情况使用,例如增删改用@CacheEvict,查用@Cacheable,等等

示例:

@Cacheable注解

  1. /**
  2. * Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
  3. * value:缓存的名称,每个缓存名称下面可以有多个key
  4. * key:缓存的key
  5. */
  6. @Cacheable(value = "userCache",key = "#id")
  7. @GetMapping("/{id}")
  8. public User getById(@PathVariable Long id){
  9. User user = userService.getById(id);
  10. return user;
  11. }

@CachePut注解

  1. /**
  2. *CachePut:将方法返回值放入缓存
  3. *value:缓存的名称,每个缓存名称下面可以有多个key
  4. *key:缓存的key
  5. */
  6. @CachePut(value = "userCache", key = "#user.id")
  7. @PostMapping
  8. public User save(User user){
  9. userService.save(user);
  10. return user;
  11. }

key的写法如下:

  1. #user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;
  2. #user.name: #user指的是方法形参的名称, name指的是user的name属性 ,也就是使用user的name属性作为key ;
  3. #result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;
  4. #result.name : #result代表方法返回值,该表达式 代表以返回对象的name属性作为key ;

@CacheEvict注解

  1. /**
  2. *CacheEvict:清理指定缓存
  3. *value:缓存的名称,每个缓存名称下面可以有多个key
  4. *key:缓存的key
  5. */
  6. @CacheEvict(value = "userCache",key = "#p0") //#p0 代表第一个参数
  7. //@CacheEvict(value = "userCache",key = "#root.args[0]") //#root.args[0] 代表第一个参数
  8. //@CacheEvict(value = "userCache",key = "#id") //#id 代表变量名为id的参数
  9. //@CacheEvict(value = "userCache",allEntries = true) //删除所有userCache的
  10. @DeleteMapping("/{id}")
  11. public void delete(@PathVariable Long id){
  12. userService.removeById(id);
  13. }