《苍穹外卖》项目学习笔记:
通过Redis缓存数据,可以减少数据库的压力
缓存数据
想要操作Redis,需要:
在用户端controller层注入redis对象
@Autowired
private RedisTemplate redisTemplate;
在yml配置文件中配置redis
redis:
host: ${sky.redis.host}
port: ${sky.redis.port}
database: ${sky.redis.database}
还需要再提供一个redis配置类,通过这个配置类来创建redisTemplate对象:
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板对象...");
RedisTemplate redisTemplate=new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
接下来就可以通过redis缓存数据了,以下为示例代码
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId){
//构造redis中的key,规则:dish_分类id
String key="dish_"+categoryId;
//查询redis中是否存在菜品数据
List<DishVO> list=(List<DishVO>)redisTemplate.opsForValue().get(key);
if (list!=null&&list.size()>0){
//如果存在,直接返回,无需查询数据库
return Result.success(list);
}
Dish dish=new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品
//如果不存在,查询数据库,将查询到的数据放入redis中
list=dishService.listWithFlavor(dish);
redisTemplate.opsForValue().set(key,list);
return Result.success(list);
}
清理缓存
当需要新增、修改数据时,需要及时清除缓存:
在管理端controller层注入redis对象:
@Autowired
private RedisTemplate redisTemplate;
哪个缓存数据受影响就清除哪个数据,在需要清理数据的代码下加入清除操作,eg:
/**
* 新增菜品
* @param dishDTO
* @return
*/
@PostMapping
@ApiOperation("新增菜品")
public Result save(@RequestBody DishDTO dishDTO){
log.info("新增菜品:{}",dishDTO);
dishService.saveWithFlavor(dishDTO);
//清理缓存数据
String key="dish_"+dishDTO.getCategoryId();
redisTemplate.delete(key);
return Result.success();
}
/**
* 菜品批量删除,修改菜品的redis操作同理
*@param ids
* @return
*/
@DeleteMapping
@ApiOperation("菜品批量删除")
public Result delete(@RequestParam List<Long> ids){
log.info("菜品批量删除:{}",ids);
dishService.deleteBatch(ids);
//批量删除时清除缓存数据,由于不能直接识别通配符,所以需要先查询出这些keys。再进行删除
Set keys = redisTemplate.keys("dish_*");
redisTemplate.delete(keys);
return Result.success();
}