学习日记 2022.11.25

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("修改成功");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值