黑马点评:redis缓存篇

使用String类型进行缓存:(用户登录验证)

@Override
    public Result sendCode(String phone, HttpSession session) {
        //1,校验手机号
        if(RegexUtils.isPhoneInvalid(phone)){
            //2.若不符合,返回错误信息
            return Result.fail("手机号格式错误!");
        }
        //3.符合,生成验证码
        String code=RandomUtil.randomNumbers(6);

        //4.保存验证码到redis中,有效期为两分钟
        stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY+phone,code,LOGIN_CODE_TTL, TimeUnit.MINUTES);
        //5.发送验证码
        log.debug("发送短信验证码成功,验证码{}",code);
        return Result.ok();
    }

    @Override
    public Result login(LoginFormDTO loginForm, HttpSession session) {
        //1.校验手机号
        String phone=loginForm.getPhone();
        if(RegexUtils.isPhoneInvalid(phone)){
            return Result.fail("手机号格式错误!");
        };
        //2.从redis获取并校验验证码
        String cacheCode=stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY+phone);
        String code= loginForm.getCode();
        if(cacheCode==null||!cacheCode.equals(code)){
            //3.不一致,报错
            return Result.fail("验证码错误!");
        }
        //4.一致,根据手机号查询用户
        User user=query().eq("phone",phone).one();
        //5.判断是否存在
        if(user==null){
            //6.不存在,创建新用户并保存
            user=createUserWithPhone(phone);
        }
        //7.保存用户信息到redis
        //7.1.生成token,作为登录令牌
        String token=UUID.randomUUID().toString(true);
        //7.2.将User对象转为Hash存储
        UserDTO userDTO= BeanUtil.copyProperties(user, UserDTO.class);
        //e 由于stringRedisTemplate只能存储String类型,所以需要将Long转化为String类型
        Map<String, Object> userMap= BeanUtil.beanToMap(userDTO,new HashMap<>(),
                CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName,fieldValue)->fieldValue.toString()));
        //7.3.存储
        String tokenKey=LOGIN_USER_KEY+token;
        stringRedisTemplate.opsForHash().putAll(tokenKey,userMap);
        //7.4.设置token有效期
        stringRedisTemplate.expire(tokenKey,LOGIN_USER_TTL , TimeUnit.MINUTES);
        //8.返回token
        return Result.ok(token);
    }

使用hash类型进行缓存:(商户缓存)

@Resource
    StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryById(Long id) {
        String key=CACHE_SHOP_KEY+id;
        //1.从redis查询商铺缓存
        String shopJson=stringRedisTemplate.opsForValue().get(key);
        //2.判断是否存在
        if(StrUtil.isNotBlank(shopJson)){
            //3.存在,返回商铺对象
            Shop shop= JSONUtil.toBean(shopJson,Shop.class);
            return Result.ok(shop);
        }
        //4.不存在,从mysql数据库中查询
        Shop shop=getById(id);
        //5.判断是否存在
        if(shop==null){
            return Result.fail("店铺不存在");
        }
        //6.存在,向redis中缓存店铺数据

        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop));
        //7.返回
        return Result.ok(shop);
    }

使用list类型进行缓存:(商户类型缓存)

@Resource
    StringRedisTemplate stringRedisTemplate= new StringRedisTemplate();

    @Override
    public Result queryShopType() {
        //1.从redis查询商铺缓存
        //2.判断是否存在,若存在
        if (stringRedisTemplate.hasKey(CACHE_SHOP_TYPE_KEY)) {
            // 从 Redis 获取字符串列表
            List<String> jsonList = stringRedisTemplate.opsForList().range(CACHE_SHOP_TYPE_KEY, 0, -1);

            // 将 JSON 字符串转换回 ShopType 对象列表
            List<ShopType> typeList = jsonList.stream()
                    .map(jsonStr -> JSONUtil.toBean(jsonStr, ShopType.class)) // 将每个 jsonStr 转换为 ShopType 对象
                    .collect(Collectors.toList());
            //根据sort属性进行排序
            typeList.sort(Comparator.comparingLong(ShopType::getSort));
            return Result.ok(typeList);
        }
        //4.不存在,从mysql数据库中查询
        List<ShopType> typeList = query().orderByAsc("sort").list();
        //5.判断是否存在
        if(typeList.isEmpty()){
            return Result.fail("店铺不存在");
        }
        //6.存在,向redis中缓存店铺数据
        //根据sort属性进行排序
        typeList.sort(Comparator.comparingLong(ShopType::getSort));
        // 将每个 ShopType 对象转换为 JSON 字符串
        List<String> jsonList = typeList.stream()
                .map(shopType -> JSONUtil.toJsonStr(shopType))
                .collect(Collectors.toList());
        // 将 JSON 字符串列表逐个插入 Redis 列表
        stringRedisTemplate.opsForList().leftPushAll(CACHE_SHOP_TYPE_KEY, jsonList);

        //7.返回数据
        return Result.ok(typeList);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值