1、应用场景
- 缓存
- 任务队列
- 消息队列
- 分布式锁
redis服务默认端口号:6379
2、数据类型
- 字符串String
- 哈希 hash 【key-value】
- 列表list 【插入顺序排序,数据可重复】
- 集合 set 【无序集合,无重复】
- 有序集合sorted set 【有序集合,无重复】
3、Java中操作Redis
- Jedis
添加依赖
<dependency>
jedis
</dependency>
//1.获取连接
Jedis jedis =new Jedis(host,port)
// 2.执行操作
jedis.set("key","value");
jedis.get(key)
// 3.关闭连接
jedis.close()
- Spring Data Redis
maven坐标:
spring-boot-starter-data-redis
Spring Data Redis提供了一个高度封装的类:RedisTmeplate
redisTemplate.opsForValue().set(key, value);
// key和value存储到redis中时,会使用到相应的序列化器
redisTemplate.opsForValue().setIfAbsent()
:若key不存在,则设置key-value,返回boolean值
4、redis缓存优化
// 1.spring-redis相关配置
spring.redis.host=128.1.120.239
spring.redis.port=6379
spring.redis.password=redispassword
spring.redis.database=7 (7号数据库)
spring.redis.timeout=60000
//2.配置类RedisConfig
// RedisTemplate 序列化器
@Bean(name = "redisTemplate")
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
//序列化
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
// value值的序列化采用fastJsonRedisSerializer
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
// key的序列化采用StringRedisSerializer
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
4.1缓存短信验证码
1、在服务端Controller中注入RedisTemplate对象,操作redis
@Autowired
private RedisTemplate<String, Object> redisTemplate;
2、将验证码缓存至redis中,并设置有效期
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
3、从redis中获取缓存的验证码
redisTemplate.opsForValue().get(key)
4.2缓存菜品数据
- 改造list方法,先从Redis中获取菜品数据,如果有则直接返回,若没有则查询数据库,并将查询到的菜品数据放入Redis
- 改造update和save方法,加入清理缓存策略(保证数据库中的数据和缓存的数据一致)
根据categoryId获取菜品列表
// 动态构造key
String key = "dish_"+dish.getCategoryId+"_"+dish.getStatus;
// 先从redis中获取缓存数据
dishDtoList = redisTemplate.opsForValue().get(key);
if(dishDtoList !=null){
// 如果存在,则直接返回
return R.success(list);
}
// 若不存在,则执行查询
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
// 查询数据保存在redis中
redisTemplate.opsForValue().set(key, dishDtoList , time, TimeUnit.SECONDS);
改造update和save方法
// 清理所有菜品得缓存数据
Set keys = redisTemplate.keys(“dish_*")
redisTemplate.delete(keys)
// 清理某个分类的菜品数据
String key = "dish_"+dishDto.getCategoryId+"_"+dishDto.getStatus;
5、spring cache+redis 注解缓存
5.1 导入maven坐标
1】springframework.data.redis.cache
2】spring-boot-starter-cache
- 5.2 缓存注解
- @EnableCaching:开启基于注解的缓存 在springboot 启动类上开启缓存注解
- @CacheConfig 类级别的注解,允许共享缓存的名称
- @Cacheable 方法或类,作用:本方法执行后,先去缓存看有无数据,如果没有,从数据库中查询,给缓存中存一份,返回结果
@Cacheable(value="cacheName", key="#id")
public ResultDTO method(int id);
@Cacheable(value = "service", key = "#service.serviceId.toString()", unless = "#result == null")
-
@CachePut 类似于更新操作,不管缓存中有无结果,都从数据库查找,并将结果更新到缓存,并返回结果
-
@CacheEvict用来清除用在本方法或者类上的缓存数据