reggie外卖优化

news2025/4/8 14:41:36

文章目录

  • 一、redis缓存
    • 1.1 缓存验证码
    • 1.2 缓存菜品数据
  • 二、spring-cache

一、redis缓存

1.1 缓存验证码

不用sesiion,而使用redis来存放验证码。
首先在用户请求验证码,将验证码保存在sesion中,当登录成功之后,将redis中的验证码删除掉。

   @Autowired
    private RedisTemplate redisTemplate;
    @PostMapping("/sendMsg")
    public R<String> snedMsg(@RequestBody User user,HttpSession httpSession){
        log.info(user.toString());
        //获取手机号
        String phone = user.getPhone().toString();
        if (StringUtils.isNotEmpty(phone)) {
            //手机号不为空发送验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info(code.toString());
//            SMSUtils.sendMessage("","",phone,"");//发送手机验证码
            //httpSession.setAttribute(phone,code); //将生成的验证码保存到session中


            //将验证码保存到redis中 并设置时间为5分钟
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
            return R.success("验证码发送成功");

        }
        return R.error("验证码发送失败");
    }

    @PostMapping("/login")
    public R<User> login(@RequestBody Map map,HttpSession session){
        //获得手机号
        String phone = map.get("phone").toString();
        //获得验证码
        String code = map.get("code").toString();
       // Object sessionCode = session.getAttribute(phone);
        //从redis中获取验证码
        Object sessionCode = redisTemplate.opsForValue().get(phone);
        //比对验证码是否一致
        if (sessionCode!=null && sessionCode.equals(code)) {
            //看数据库中是否有该用户
            LambdaUpdateWrapper<User> lambdaUpdateWrapper=new LambdaUpdateWrapper<>();
            lambdaUpdateWrapper.eq(User::getPhone,phone);
            User user = userService.getOne(lambdaUpdateWrapper);
            if (user ==null) {
                //没有,保存一个
                user=new User();
                user.setPhone(phone);
                user.setStatus(1);
                userService.save(user);

            }
            session.setAttribute("user",user.getId());
            //用户登陆成功 则将验证码删除
            redisTemplate.delete(phone);
            return R.success(user);
        }
        return R.error("验证失败");
    }

1.2 缓存菜品数据

如果我们不放入redis,就会导致每次发送ajax请求,都需要去查询数据库,造成很大负担。
我们可以先去redis中查询,如果没有,再去数据库中查,如果有则直接返回。
没有的话,将其保存到redis中。

还有就是更新和保存的时候,要把redis中的数据清空,保证数据一致性。

    /**
     * 保存 修改过的菜品和菜品对应的口味信息
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> updateDish(@RequestBody DishDto dishDto){
        dishService.updatewithFlavor(dishDto);
        //清除所有菜品缓存数据
        Set keys = redisTemplate.keys("dish_ID*");
        redisTemplate.delete(keys);
        //清除某个分类
        String key="dish_ID"+dishDto.getCategoryId()+"_1";
        redisTemplate.delete(key);
        return R.success("修改菜品成功");
    }
 /**
     * 增加菜品信息
     * @param dishDto
     * @return
     */
    @PostMapping
    public R<String> addDish(@RequestBody DishDto dishDto){
        dishService.addwithFlavor(dishDto);
        //清除某个分类
        String key="dish_ID"+dishDto.getCategoryId()+"_1";
        redisTemplate.delete(key);
        return R.success("新增菜品成功");
    }

二、spring-cache

个人觉得了解即可吧,没深究
就是spring提供的一个缓存机制。可以直接通过注解的方式使用缓存,不用注入redis。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
首先导入pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

不导入redis 的则使用默认的
如果导入redis 则使用redis的

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

二、Spring Cache注解一览

  1. @Cacheable
    @Cacheable 是最常用的注解之一,用于标记可缓存的方法。当一个方法被@Cacheable 注解后,Spring会在方法执行前检查缓存中是否存在已缓存的结果,如果存在,则直接从缓存中返回;若不存在,则执行方法并将结果放入缓存中。
@Service
public class UserService {

    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
        // 查询数据库或其他资源的操作
    }

在这个例子中,value 参数指定了缓存名称,而 key 参数定义了缓存键的生成规则,这里使用SpEL表达式表示传入方法的参数值。

  1. @CacheEvict
    @CacheEvict 注解用于删除缓存项。它可以单独使用或与@Cacheable 结合,实现数据更新后的缓存同步。
@Service
public class UserService {

    @CacheEvict(value = "userCache", key = "#id")
    public void updateUser(User user) {
        // 更新用户信息操作
    }
}

此处,当调用updateUser方法时,会根据指定的key策略清除对应缓存项。

  1. @CachePut
    @CachePut 注解则用于强制执行方法并始终更新缓存,无论方法是否返回null或者已经存在缓存。
@Service
public class ProductService {

    @CachePut(value = "productCache", key = "#product.id")
    public Product updateProduct(Product product) {
        // 更新产品信息操作
        return product;
    }
}
  1. @Caching
    @Caching 注解允许在一个方法上组合多个缓存操作,例如同时进行缓存读取和清理。
@Service
public class OrderService {

    @Caching(evict = {
            @CacheEvict(value = "orderCache", allEntries = true),
            @CacheEvict(value = "itemCache", key = "#orderId")
    }, put = @CachePut(value = "orderSummaryCache", key = "#summaryId"))
    public void processOrder(Order order, Long summaryId) {
        // 处理订单及其相关项操作
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1890472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能概论 | 基于A*算法的8数码问题求解

大学四年的全部课程和考试都已经结束啦&#xff01; 最近闲来无事&#xff0c;随便发发自己的实验报告&#xff0c;供后面的学弟学妹们参考~ 目录 实验1 基于A*算法的8数码问题求解 1.1 程序总体流程 1.2 关键代码展示 1.3 输出结果展示及分析 1.3.1 总步数展示 1.…

ENVI5.6使用笔记

目录 1. ENVI安装扩展2. ENVI绘制高光谱3D数据立体图3. 对本次工作存档&#xff0c;下次打开软件可直接续档4. 对图像进行分类 1. ENVI安装扩展 从ENVI App Store下载商店envi_app_store.zip&#xff0c;解压得到ENVI_App_Store.sav&#xff0c;将其复制到ENVI的扩展文件夹下&…

如何优化网站SEO排名?

选择那些容易排名的关键词。使用工具找到那些竞争少但有流量的词语。其次&#xff0c;内部链接非常重要。通过合理的内部链接&#xff0c;可以提升各个页面的权重。 增加FAQ部分能帮助你捕捉更多的长尾关键词流量。争取出现在精选摘要的位置&#xff0c;可以直接提升你的曝光率…

从全连接到卷积

一、全连接到卷积 1、卷积具有两个原则&#xff1a; 平移不变性&#xff1a;无论作用在哪个部分&#xff0c;它都要有相同的作用&#xff0c;而不会随着位置的改变而改变 局部性&#xff1a;卷积核作用处&#xff0c;作用域应该是核作用点的周围一小部分而不作用于更大的部分 …

仓库管理系统27--项目完结

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、列表分页 这里我们以物资列表分页为例来讲讲如何实现分页&#xff0c;wpf中没有现成封装好的分页&#xff0c;需要自己封装…

提升Unity WebGL游戏启动速度

一、查看启动耗时 通过修改unity-namespace.js中hideTimeLogModal为false&#xff0c;显示timelog开发者可以看到小游戏目前的启动首屏时长&#xff1a; 将其设置为false后&#xff0c;启动小程序后就会显示启动耗时 要知道各个阶段的含义&#xff0c;我们必要理解启动流程。 …

CDC模型

引言 聚类是一种强大的机器学习方法&#xff0c;用于根据特征空间中元素的接近程度发现相似的模式。它广泛用于计算机科学、生物科学、地球科学和经济学。尽管已经开发了最先进的基于分区和基于连接的聚类方法&#xff0c;但数据中的弱连接性和异构密度阻碍了其有效性。在这项…

基于Java英语学习网站设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

玩玩快速冥(LeetCode50题与70题以及联系斐波那契)

一.算法快速幂 今天刷到两个题,比较有意思,还是记录一下. 先来讲讲50题. LeetCode50(Pow(x,n)) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 这道题一看很平常啊,不就一直乘嘛,循环走一次就够了.但是很抱歉,单纯的想…

计算机网络知识普及之四元组

在涉及到TCP/UDP等IP类通信协议时&#xff0c;存在四元组概念 这里只是普及使用 先来一些前置知识&#xff0c;什么是IP协议&#xff1f; IP协议全称为互联网协议&#xff0c;处于网络层中&#xff0c;主要作用是标识网络中的设备&#xff0c;每个设备的IP地址是唯一的。 在网…

ASO优化:如何提高应用的可见性

在竞争激烈的应用市场中ASO优化成为了提高应用可见性的重要手段。以下是一些提高应用可见性的方法&#xff1a; 1. 选择合适的关键词 找出和您应用高度相关并且具有一定搜索量的关键词&#xff0c;确保关键词与应用的核心功能和用户搜索意图匹配。比如&#xff1a;当您的应用是…

【Rust入门】生成随机数

文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中&#xff0c;生成随机数是一种常见的需求&#xff0c;无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中&#xff0c;我们将通过一…

1.4 ROS2集成开发环境搭建

1.4.1 安装VSCode VSCode全称Visual Studio Code&#xff0c;是微软推出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT 等特性&#xff0c;支持插件…

谈谈浏览器的事件机制:捕获、冒泡

浏览器事件的传播有三个阶段&#xff1a;捕获阶段&#xff0c;目标阶段&#xff0c;冒泡阶段 第一部分称为捕获阶段&#xff0c;该阶段包括从舞台到目标节点的父节点范围内的所有节点。第二部分称为目标阶段&#xff0c;该阶段仅包括目标节点。第三部分称为冒泡阶段。冒泡阶段包…

安装Gitlab+Jenkins

GItlab概述 GitLab概述&#xff1a; 是一个利用 Ruby on Rails 开发的开源应用程序&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。 Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。 GitLab拥有与…

工业一体机根据软件应用需求灵活选配

在当今工业领域&#xff0c;数字化、智能化的发展趋势愈发明显&#xff0c;工业一体机作为关键的设备&#xff0c;其重要性日益凸显。而能够根据软件应用需求进行灵活选配的工业一体机&#xff0c;更是为企业提供了高效、定制化的解决方案。 一、工业一体机的全封闭无风扇散热功…

【软件测试】性能测试 | 概念 | 常见术语 | 性能指标 | 分类 | 流程

性能测试 文章目录 性能测试一、什么是性能测试1.生活中遇到的软件的性能问题2.性能测试定义3.性能测试和功能测试有什么区别4.什么样的表现属于软件性能好、什么样的表现不好5.影响一个软件性能因素有哪些 二、为什么进行性能测试三、性能测试的常见术语以及性能测试的衡量指标…

深入了解自动化:聊聊什么项目适合做自动化测试?

自动化测试 什么是自动化测 什么是自动化测试&#xff1f; 随着软件产业的不断发展&#xff0c;市场对软件周期的要求越来越高&#xff0c;于是催生了各种开发模式&#xff0c;如大家熟知的敏捷开发&#xff0c;从而对测试提出了更高的要求。此时&#xff0c;产生了自动化测试…

双指针系列第 8 篇:盛水最多的容器。几句话讲明白!

Leetcode 题目链接 思路 取首尾双指针和水量如下所示&#xff0c;设高度函数为 h ( i ) h(i) h(i)&#xff0c;在下图中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 观察以 l l l 为左边界所能构成的其他水量&#xff0c;与矮的右边界搭配结果如下。 与高的…

LLM大模型中LoRA是什么?面试经验回答汇总(2024.7月最新)

目录 1 什么是 LoRA&#xff1f; 2 LoRA 的思路是什么&#xff1f; 3 LoRA 的特点是什么&#xff1f; 4 简单描述一下 LoRA? 5 QLoRA 的思路是怎么样的&#xff1f; 6 QLoRA 的特点是什么&#xff1f; 7 AdaLoRA 的思路是怎么样的&#xff1f; 8 LoRA权重是否可以合入…