redis实际开发应用简单实现
短信登录
首先来看看登录与注册常规实现流程如下:
其中,很多网站都有手机号验证码登录功能
如百度
实现之前咱可以来验证码有啥特点:一定时间内过期、验证码随机、与手机号会唯一匹配
所以可以使用redis的string来实现更容易,key设置成手机号,value设置成验证码,过期时间设置成3分钟
实现如下
//引入redis工具类
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public 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);
}
请求
看下redis是否存入缓存了
可以看到ttl即过期时间
可以在进行等待会刷新下redis
看到已显示键不存在
缓存
缓存就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。
缓存一般作为数据层的中间层,在查询数据之前,先查询缓存,缓存有,直接返回,缓存没有,再查询db
这里参考黑马点评的例子来实现查询商品信息加入缓存功能
功能:给店铺类型查询业务添加缓存
ShopController
@RestController
@RequestMapping("/shop")
public class ShopController {
@Resource
public 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 {
@Resource
StringRedisTemplate stringRedisTemplate;
@Override
public 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