问题说明
实现思路
redis中的string,可以由java的任意对象序列化得到,因此我们可以将每一类菜品组成的集合list,作为一个value进行存储,redis会将其序列化为string
代码开发
首先引入对应依赖(略)
开发以下配置类(RedisTemplate)
@Slf4j
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板对象...");
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
Controller层
@RestController
@RequestMapping("/user/dish")
@Slf4j
@Api(tags="g根据id查询菜品")
public class DishController {
@Autowired
private DishService dishService;
private RedisTemplate redisTemplate;
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<DishVO>> list(Long categoryId){
//构造redis中的key,规则:dish_分类
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);
}
}