用整合的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: localhostport: 6379#password: 123456database: 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配置类*/@Configurationpublic class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默认的Key序列化器为:JdkSerializationRedisSerializerredisTemplate.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,调用方式使用
@Autowiredprivate 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中所有的keyredisTemplate.hasKey("某个key1"); //判断某个key是否存在redisTemplate.delete("某个key2"); //删除指定keyredisTemplate.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@EnableCachingpublic 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")@PostMappingpublic 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);}
