短信登录
首先来看看登录与注册常规实现流程如下:
其中,很多网站都有手机号验证码登录功能
如百度
实现之前咱可以来验证码有啥特点:一定时间内过期、验证码随机、与手机号会唯一匹配
所以可以使用redis的string来实现更容易,key设置成手机号,value设置成验证码,过期时间设置成3分钟
实现如下
//引入redis工具类@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result sendCode(String phone) {//1,看手机号格式是否正确这里可以自己实现下校验手机号格式boolean is_valid = sPhoneInvalid(phone);if (!is_valid) {return Result.fail("手机号格式错误");}//2,看手机号是否存在数据库QueryWrapper<User> queryWrapper = new QueryWrapper<>();User user = getOne(queryWrapper.eq("phone", phone));if (user == null) {return Result.fail("用户未注册过,请注册");//这里需前端跳转到注册网页}//3,生成验证码String code = RandomUtil.randomNumbers(6);log.info("请求验证码"+code);//4,存储进入redis 设置常量 key=登录业务前缀+邮箱 过期时间3分钟stringRedisTemplate.opsForValue().set(phone,code,3L, TimeUnit.MINUTES );//5,返回验证码HashMap<String,String> codeValue = new HashMap<>();codeValue.put("code", code);return Result.ok(codeValue);}
请求
可以看到ttl即过期时间
可以在进行等待会刷新下redis
看到已显示键不存在
缓存
缓存就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。
缓存一般作为数据层的中间层,在查询数据之前,先查询缓存,缓存有,直接返回,缓存没有,再查询db
这里参考黑马点评的例子来实现查询商品信息加入缓存功能
功能:给店铺类型查询业务添加缓存
ShopController
@RestController
@RequestMapping("/shop")
public class ShopController {@Resourcepublic IShopService shopService;/*** 根据id查询商铺信息* @param id 商铺id* @return 商铺详情数据*/@GetMapping("/{id}")public Result queryShopById(@PathVariable("id") Long id) {return shopService.queryById(id);}}
ShopServiceImpl(这里采用string结构来实现,当然其它的数据结构也可以)
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {@ResourceStringRedisTemplate stringRedisTemplate;@Overridepublic Result queryById(Long id) {String cache_key = CACHE_SHOP_KEY+id;//查询redis是否存在商铺信息String shop_json = stringRedisTemplate.opsForValue().get(cache_key);//查询到了数据 直接返回 但是返回的数据为json格式的 需返回成对象形式if (!StrUtil.isBlank(shop_json)){Shop shop_result = JSONUtil.toBean(shop_json, Shop.class);return Result.ok(shop_result);}//redis找不到数据 到mysql再进行查询Shop shop_result = getById(id);//mysql中找不到则返回报错if (shop_result == null){return Result.fail("店铺不存在");}//存在则进缓存stringRedisTemplate.opsForValue().set(cache_key, JSONUtil.toJsonStr(shop_result),LOCK_SHOP_TTL, TimeUnit.MINUTES);//返回return Result.ok(shop_result);}
}
请求浏览器
来看看首次请求浏览器耗时
可以看到耗时5.25s
看到已存入redis
再次请求耗时 38ms,耗时得到了很大的优化
参考资料:黑马redis