使用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);
}