1.使用redis
如果注入StringRedisTemplate的话,不需要写配置类
@Autowired
private StringRedisTemplate redisTemplate;
注入RedisTemplate,配置类:
@Configuration
public class RedisConfig extends CachingConfigurerSupport{
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
5种基本数据类型以及通用命令的使用:
@Test
public void testString() {
redisTemplate.opsForValue().setIfAbsent("name", "zhangsan",30L,TimeUnit.SECONDS);
}
@Test
public void testHash(){
redisTemplate.opsForHash().put("001","id","001");
redisTemplate.opsForHash().put("001","name","张三");
redisTemplate.opsForHash().put("001","addr","北京");
System.out.println("====keys====");
Set<Object> keys = redisTemplate.opsForHash().keys("001");
for (Object key : keys) {
System.out.println(key);
}
System.out.println("====values====");
List<Object> values = redisTemplate.opsForHash().values("001");
for (Object value : values) {
System.out.println(value);
}
}
/**
* 列表
*/
@Test
public void testList(){
//存值
redisTemplate.opsForList().leftPush("list","a");
redisTemplate.opsForList().leftPushAll("list","b","c","d");
//查询 对应命令lrange
List<String> list = redisTemplate.opsForList().range("list", 0, -1);
for (String s : list) {
System.out.println(s);
}
//取出
Long size = redisTemplate.opsForList().size("list");
int listSize = size.intValue();
for (int i = 0; i < listSize; i++) {
String s = redisTemplate.opsForList().rightPop("list");
System.out.println(s);
}
}
@Test
public void testSet(){
//存
redisTemplate.opsForSet().add("name","zs","ls");
//查
Set<String> names = redisTemplate.opsForSet().members("name");
for (String name : names) {
System.out.println(name);
}
//删
redisTemplate.opsForSet().remove("name","zs");
}
@Test
public void testSortSet(){
redisTemplate.opsForZSet().add("zSet","a",3.3);
redisTemplate.opsForZSet().add("zSet","b",2.2);
redisTemplate.opsForZSet().add("zSet","c",1.1);
Set<String> zSet = redisTemplate.opsForZSet().range("zSet", 0, -1);
for (String s : zSet) {
System.out.println(s);
}
//修改分数
redisTemplate.opsForZSet().incrementScore("zSet","a",0.1);
redisTemplate.opsForZSet().remove("zSet","c");
}
@Test
public void testCommon(){
//keys *
Set<String> keys = redisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
//exists key
Boolean name = redisTemplate.hasKey("name");
System.out.println(name);
//type key
DataType name2 = redisTemplate.type("name");
System.out.println(name2);
//del key
Boolean name1 = redisTemplate.delete("name");
System.out.println(name1);
}
2.在瑞吉外卖中使用redis缓存数据
把验证码缓存入redis数据库:
1.登录生成验证码时,把验证码set进入redis,并设置时间
2.登录成功时,从redis中删除
对于用户高频操作的数据,存入redis缓存中,在用户第二次访问时先查询redis数据库.
注意用户在进行新增,修改操作之后要删除对应缓存数据,否则会出现脏读.
菜品分页查询缓存分析:
1.先根据查询菜品id查询redis数据库
2.如果返回结果为null,则取查询mysql数据库获取数据
3.如果结果有返回值,直接将数据返回给前端
4.从mysql中查到数据后,根据菜品id存入redis
分页查询代码:
/**
* 根据条件查询菜品数据
*
* @param dish
* @return
*/
@GetMapping("/list")
public R<List<DishDto>> list(Dish dish) {
//查询redis数据库
List<DishDto> dishDtoList = null;
//根据dish id查询
String key = "dish_" + dish.getCategoryId() + "_" + dish.getStatus();
dishDtoList = (List<DishDto>)redisTemplate.opsForValue().get(key);
//查到dishDtoList缓存直接返回
if(dishDtoList!=null){
return R.success(dishDtoList);
}
//没查到执行查询mysql数据库
log.info("根据条件查询菜品数据: {}", dish.toString());
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
//根据id查询
queryWrapper.eq(dish.getCategoryId() != null, Dish::getCategoryId, dish.getCategoryId());
//查询状态为起售的菜品
queryWrapper.eq(Dish::getStatus, 1);
//排序条件
queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
List<Dish> list = dishService.list(queryWrapper);
dishDtoList = list.stream().map((item) -> {
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(item, dishDto);
Long categoryId = item.getCategoryId();//分类id
//根据id查询分类对象
Category category = categoryService.getById(categoryId);
if (category != null) {
String categoryName = category.getName();
dishDto.setCategoryName(categoryName);
}
//当前菜品的id
Long dishId = item.getId();
LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(DishFlavor::getDishId, dishId);
//select * from dish_flavor where dish_id = ?
List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaQueryWrapper);
dishDto.setFlavors(dishFlavorList);
return dishDto;
}).collect(Collectors.toList());
//之后把查询到的dishDtoList存入redis
redisTemplate.opsForValue().set(key,dishDtoList,60, TimeUnit.MINUTES);
return R.success(dishDtoList);
}
修改和新增菜品删除缓存:
/**
* 修改菜品
*
* @param dishDto
* @return
*/
@PutMapping
public R<String> update(@RequestBody DishDto dishDto) {
log.info("修改菜品{}", dishDto.toString());
dishService.updateWithFlavor(dishDto);
//清理缓存数据
String key = "dish_" + dishDto.getCategoryId() + "_1";
redisTemplate.delete(key);
return R.success("修改成功");
}