当前位置: 首页 > article >正文

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


http://www.kler.cn/a/531922.html

相关文章:

  • RAG 与历史信息相结合
  • string例题
  • GWO优化SVM回归预测matlab
  • oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)
  • 深入核心:一步步手撕Tomcat搭建自己的Web服务器
  • LeetCode:121.买卖股票的最佳时机1
  • c语言练习题【数据类型、递归、双向链表快速排序】
  • 14-9-3C++STL的set容器
  • C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】
  • 安装nvm后报错
  • 计算机网络中常见高危端口有哪些?如何封禁高危端口?
  • nvm的安装和使用
  • VSCode源码分析参考资料
  • Java自定义IO密集型和CPU密集型线程池
  • OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)
  • 【6. 深入理解 C++ 中的常量】
  • G1. Yunli‘s Subarray Queries (easy version)
  • Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)
  • 2月3日星期一今日早报简报微语报早读
  • 遭受大量境外网络攻击,郭盛华公开发声支持DeepSeek
  • 基于Spring Security 6的OAuth2 系列之十 - 授权服务器--刷新token
  • 优化代码性能:利用CPU缓存原理
  • 人工智能学习(五)之机器学习逻辑回归算法
  • DeepSeek-R1 本地部署教程(超简版)
  • SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?
  • DRM系列七:Drm之CREATE_DUMB