reggie外卖优化

文章目录

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

一、redis缓存

1.1 缓存验证码

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

   @Autowiredprivate 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*/@PutMappingpublic 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*/@PostMappingpublic 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.mzph.cn/pingmian/39959.shtml

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

相关文章

Tekla Structures钢结构详图设计软件下载;Tekla Structures高效、准确的合作平台

Tekla Structures&#xff0c;它不仅集成了先进的三维建模技术&#xff0c;还融入了丰富的工程实践经验&#xff0c;为设计师、工程师和建筑商提供了一个高效、准确的合作平台。 在建筑项目的整个生命周期中&#xff0c;Tekla Structures都发挥着举足轻重的作用。从规划阶段开始…

录音转文字软件免费版哪个好?6个转文字工具让你轻松记录

随着小暑的到来&#xff0c;炎热的天气容易让人心浮气躁&#xff0c;影响工作效率。 在这个季节里&#xff0c;掌握一些办公技巧尤为关键。尤其是当我们需要整理会议记录或讲座内容时&#xff0c;如果能有一种方法&#xff0c;可以迅速将那些冗长的录音转换成清晰的文字&#…

使用Retrofit2+OkHttp监听上传或者下载进度会执行两次的问题

使用Retrofit2OkHttp监听上传或者下载进度RequestBody#writeTo/ResponseBody#source 会执行两次的问题 example&#xff1a; 问题原因&#xff1a; 使用了HttpLoggingInterceptor拦截器&#xff0c;并且日志等级为HttpLoggingInterceptor.Level.BODY 问题解决&#xff1a;

一个opencv实现检测程序

引言 图像处理是计算机视觉中的一个重要领域&#xff0c;它在许多应用中扮演着关键角色&#xff0c;如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一&#xff0c;它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…

Python学习速成必备知识,(20道练习题)!

基础题练习 1、打印出1-100之间的所有偶数&#xff1a; for num in range(1, 101):if num % 2 0:print(num) 2、打印出用户输入的字符串的长度&#xff1a; string input("请输入一个字符串&#xff1a;")print("字符串的长度为&#xff1a;", len(str…

excel表格如何换行,这几个操作方法要收藏好

Excel表格作为一款强大的数据处理工具&#xff0c;在日常工作和生活中被广泛应用。当需要在单元格内显示较长的文本内容或使数据更加清晰易读时&#xff0c;我们需要掌握一些换行技巧。下面将介绍几种常用的Excel换行方法&#xff1a; 一、使用快捷键换行 1、首先&#xff0c;…

暑假学习DevEco Studio第一天

学习目标&#xff1a; 掌握构建第一个ArkTS应用 学习内容&#xff1a; 容器的应用 创建流程 点击file&#xff0c;new-> create project 点击empty ->next 进入配置界面 点击finsh&#xff0c;生成下面图片 这里需要注意记住index.ets &#xff0c;这是显示页面 –…

五款免费可视化利器分享,助力打造数字孪生新体验!

在当今数据驱动的时代&#xff0c;可视化工具已成为各行各业不可或缺的助手。它们不仅能帮助我们更好地理解和分析数据&#xff0c;还能以直观、生动的方式呈现复杂信息&#xff0c;提升沟通和决策效率。本文将为大家介绍五款免费的可视化工具&#xff0c;总有一款适合你。 一…

如何做好企业品牌推广,看这篇文章就够了

在当今竞争激烈的市场环境中&#xff0c;品牌推广策略与方式成为企业成功的关键。因为相比起企业&#xff0c;消费者会更愿意为品牌买单。那么企业如何将品牌推广做好呢?今日投媒网与您分享。 1.明确品牌定位与目标受众 一切推广活动的起点在于清晰的品牌定位。首先&#xf…

SolrCloud Autoscaling 自动添加副本

SolrCloud Autoscaling 自动添加副本 前言 问题描述 起因是这样的&#xff0c;我在本地调试 Solr 源码&#xff08;版本 7.7.3&#xff09;&#xff0c;用 IDEA 以 solrcloud 方式启动了 2 个 Solr 服务&#xff0c;如下所示&#xff1a; 上图的启动参数 VM Options 如下&am…

RocketMQ实战:一键在docker中搭建rocketmq和doshboard环境

在本篇博客中&#xff0c;我们将详细介绍如何在 Docker 环境中一键部署 RocketMQ 和其 Dashboard。这个过程基于一个预配置的 Docker Compose 文件&#xff0c;使得部署变得简单高效。 项目介绍 该项目提供了一套 Docker Compose 配置&#xff0c;用于快速部署 RocketMQ 及其…

美国商超入驻细节全面曝光,电竞外设产品的国际化浪潮即将席卷全球

近年来&#xff0c;随着电子竞技(简称电竞)行业的蓬勃发展&#xff0c;电竞外设产品也逐渐成为消费者关注的热点。近期&#xff0c;一系列美国商超入驻细节的全面曝光&#xff0c;预示着电竞外设产品的出海风潮即将到来。 电竞行业迅速崛起&#xff0c;全球市场规模年均增长超1…

ResNet50V2

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、ResNetV1和ResNetV2的区别 ResNetV2 和 ResNetV1 都是深度残差网络&#xff08;ResNet&#xff09;的变体&#xff0c;它们的主要区别在于残差块的设计和…

美业系统实操:手机App如何查看员工业绩?美业门店管理系统Java源码分享

在当今竞争激烈的美业市场中&#xff0c;有效的管理对于提高效率、增强客户体验和推动业务增长至关重要。美业管理系统通过其各种功能和优势&#xff0c;成为现代美业企业不可或缺的利器。 ▶下面以博弈美业进行实操-手机App端如何查看员工业绩&#xff1f; 1.店主登录手机端…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了&#xff0c;续费提醒那是提前一周准时到来&#xff0c;但是看到客户发来的续费价格截图&#xff0c;我是真的没忍住。这不就是在杀熟吗&#xff1f;就这配置续费竟然如此昂贵&#xff1f;说实话这个客户的服务器代维是…

Ollama+OpenWeb UI搭建最简单的大模型交互界面

Open WebUI是一个专为大型语言模型&#xff08;LLMs&#xff09;设计的Web用户界面。这个界面提供了一个直观、响应迅速且易于使用的平台&#xff0c;使用户能够与本地运行的语言模型进行交互&#xff0c;就像与云服务中的模型交互一样。可以非常方便的调试、调用本地模型。你能…

贴片电阻:01A、01B、01C、01D分别是什么意思?

贴片电阻的识别方法&#xff1a; 1、数字索位标称法 (一般矩形片状电阻采用这种标称法) 数字索位标称法就是在电阻体上用三位数字来标明其阻值。它的第一位和第二位为有效数字&#xff0c;第三位表示在有效数字后面所加“0”的个数&#xff0e;这一位不会出现字母。例如&…

项目实战-MySQL极佳优化方案---前缀索引

一、应用背景 由于公司项目数据量较大&#xff0c;开发小程序和APP过程中&#xff0c;SQL查询超过1.5s以上的等待时间&#xff0c;因此需要对SQL或者数据表结构设计进行优化。就不讲SQL语句优化啦&#xff0c;而是记录一下数据表结构设计优化的前缀索引实现。 二、MySQL索引 …

昇思25天学习打卡营第10天|使用静态图加速

昇思25天学习打卡营第10天|使用静态图加速 前言使用静态图加速背景介绍动态图模式静态图模式 静态图模式的使用场景静态图模式开启方式基于装饰器的开启方式基于context的开启方式 静态图的语法约束JitConfig配置选项静态图高级编程技巧 个人任务打卡&#xff08;读者请忽略&am…

UE4_材质_水体的反射与折射制作_Ben教程

在这个教程中&#xff0c;将制作水的反射和折射&#xff0c;上个教程&#xff0c;我们主要讲了制作水涟漪&#xff08;水面波纹&#xff09;和水滴法线混合&#xff0c;水深计算&#xff0c;我们首先要谈的是反射和产生折射的问题。我们将所有从干扰从场景中分离出去&#xff0…