Redis页面优化

文章目录

    • 1.Redis页面缓存
        • 1.思路分析
        • 2.首先记录一下目前访问商品列表页的QPS
          • 1.线程组配置10000次请求
          • 2.请求配置
          • 3.开始压测
            • 1.压测第一次 平均QPS为612
            • 2.压测第二次 平均QPS为615
            • 3.压测第三次 平均QPS为617
        • 3.然后记录一下访问商品详情页的QPS
          • 1.线程组配置10000次请求
          • 2.请求配置
          • 3.开始压测
            • 1.压测第一次 平均QPS为633
            • 2.压测第二次 平均QPS为642
            • 3.压测第三次 平均QPS为641
        • 4.商品列表页Redis缓存优化
          • 1.GoodsController.java
          • 2.启动报错 Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource
          • 3.发现是produces写错了,将冒号换成分号
          • 4.重新启动测试
            • 1.登录后访问 http://localhost:9092/seckill/goods/toList
            • 2.此时如果在数据库中修改信息,在60s内是不会刷新的
        • 5.商品详情页Redis缓存优化
          • 1.GoodsController.java
          • 2.测试
            • 1.登录后访问详情页
            • 2.在Redis中也有了缓存
        • 6.压力测试
          • 1.清空Redis
          • 2.清空用户表
          • 3.启动应用,重新生成2000个用户
          • 4.对访问列表页进行压测
            • 1.发现平均QPS只有80,比直接走数据库还慢
            • 2.由于六台机器都开启了RDB和AOF的持久化策略,现在分别将其关闭,然后重启redis
            • 3.再次压测,还是80
            • 4.那么就可能是网络原因了,因为服务器都在北京,所以将服务部署到生产环境然后再进行压力测试
    • 2.生产环境的压力测试
        • 1.首先将GoodsController.java的从db查询商品列表打开
        • 2.部署上线
          • 1.激活环境为prod
          • 2.maven打包
          • 3.上传到服务器然后重新启动
        • 3.UserUtil.java 获取用户信息
          • 1.修改环境变量
          • 2.获取cookie
        • 4.准备压测
          • 1.http请求默认值
          • 2.http请求信息
          • 3.修改cookie的域
          • 4.开始压测5000次请求,QPS为55
        • 5.使用redis缓存页面来优化并重新部署
        • 6.再次压测,QPS为80,有所提升
        • 7.关于Redis缓存页面与DB的数据同步问题
    • 3.对象缓存问题解决
        • 1.问题分析
        • 2.具体实现
          • 1.UserService.java
          • 2.UserServiceImpl.java
          • 3.UserController.java
        • 3.测试
          • 1.登录一下,得到票据
          • 2.Redis中有该用户信息
          • 3.更新密码 http://localhost:9092/seckill/user/updatePassword?userTicket=4dfaea799a9b438ea96ef61f7da435e3&password=666666
          • 4.刷新Redis,用户信息被删除

1.Redis页面缓存

1.思路分析

image-20240510103830900

2.首先记录一下目前访问商品列表页的QPS
1.线程组配置10000次请求

image-20240510104150231

2.请求配置

image-20240510104243589

3.开始压测
1.压测第一次 平均QPS为612

image-20240510104745555

2.压测第二次 平均QPS为615

image-20240510104836407

3.压测第三次 平均QPS为617

image-20240510104913070

3.然后记录一下访问商品详情页的QPS
1.线程组配置10000次请求

image-20240510104150231

2.请求配置

image-20240510114304155

3.开始压测
1.压测第一次 平均QPS为633

image-20240510114342610

2.压测第二次 平均QPS为642

image-20240510114510495

3.压测第三次 平均QPS为641

image-20240510114551866

4.商品列表页Redis缓存优化
1.GoodsController.java
    @ResourceGoodsService goodsService;@Resourceprivate RedisTemplate redisTemplate;@Resourceprivate ThymeleafViewResolver thymeleafViewResolver;// 进入到商品首页-使用redis优化@RequestMapping(value = "/toList", produces = "text/html;charset=UTF-8")@ResponseBodypublic String toList(Model model, User user, HttpServletRequest request, HttpServletResponse response) {// 判断是否有用户信息if (null == user) {return "login";}// 先从redis中获取页面,如果有则直接返回String html = (String) redisTemplate.opsForValue().get("goodsList");if (StringUtils.hasText(html)) {return html;}// 如果没有就从数据库中查询,然后存入redis中// ------------------------------db查询商品列表------------------------------// 查询商品列表model.addAttribute("goodsList", goodsService.findGoodsVo());// 将用户信息存入model中model.addAttribute("user", user);// ------------------------------db查询商品列表------------------------------// 渲染页面// 1.首先构建一个webContext对象,用来存放modelWebContext context = new WebContext(request, response, request.getServletContext(), request.getLocale(), model.asMap());// 2.渲染页面html = thymeleafViewResolver.getTemplateEngine().process("goodsList", context);// 3.判断html是否为空,不为空则存入redis中,设置过期时间为60sif (StringUtils.hasText(html)) {redisTemplate.opsForValue().set("goodsList", html, 180, TimeUnit.SECONDS);}return html;}
2.启动报错 Error creating bean with name ‘requestMappingHandlerMapping’ defined in class path resource

image-20240510112622807

3.发现是produces写错了,将冒号换成分号

image-20240510112644275

4.重新启动测试
1.登录后访问 http://localhost:9092/seckill/goods/toList

image-20240510113319062

2.此时如果在数据库中修改信息,在60s内是不会刷新的

image-20240510113453521

image-20240510113501947

5.商品详情页Redis缓存优化
1.GoodsController.java
    // 进入到商品详情页@RequestMapping(value = "/toDetail/{goodsId}", produces = "text/html;charset=UTF-8")@ResponseBodypublic String toDetail(Model model, User user, @PathVariable Long goodsId, HttpServletRequest request, HttpServletResponse response) {// 判断是否有用户信息if (null == user) {return "login";}// 先从redis中获取页面,如果有则直接返回String html = (String) redisTemplate.opsForValue().get("goodsDetail:" + goodsId);// 如果有则直接返回if (StringUtils.hasText(html)) {return html;}// 如果没有就从数据库中查询,然后存入redis中// ------------------------------db查询商品详情------------------------------// 查询商品详情GoodsVo goodsVoByGoodsId = goodsService.findGoodsVoByGoodsId(goodsId);model.addAttribute("goods", goodsVoByGoodsId);// secKillStatus:秒杀状态 0:未开始 1:进行中 2:已结束// remainSeconds:秒杀剩余时间 >0:未开始 0:进行中 -1:已结束// 获取该商品的秒杀开始时间和结束时间long startAt = goodsVoByGoodsId.getStartDate().getTime();long endAt = goodsVoByGoodsId.getEndDate().getTime();long now = System.currentTimeMillis();// 根据当前时间与秒杀开始时间和结束时间的比较,判断秒杀状态int secKillStatus = 0;int remainSeconds = 0;if (now < startAt) {// 秒杀未开始secKillStatus = 0;remainSeconds = (int) ((startAt - now) / 1000);} else if (now > endAt) {// 秒杀已结束secKillStatus = 2;remainSeconds = -1;} else {// 秒杀进行中secKillStatus = 1;remainSeconds = 0;}// 将秒杀状态和剩余时间存入model中,返回到前端model.addAttribute("secKillStatus", secKillStatus);model.addAttribute("remainSeconds", remainSeconds);// 将用户信息存入model中,返回到前端model.addAttribute("user", user);// ------------------------------db查询商品详情------------------------------// 渲染页面// 1.首先构建一个webContext对象,用来存放modelWebContext context = new WebContext(request, response, request.getServletContext(), request.getLocale(), model.asMap());// 2.渲染页面html = thymeleafViewResolver.getTemplateEngine().process("goodsDetail", context);// 3.判断html是否为空,不为空则存入redis中,设置过期时间为60sif (StringUtils.hasText(html)) {redisTemplate.opsForValue().set("goodsDetail:" + goodsId, html, 180, TimeUnit.SECONDS);}return html;}
2.测试
1.登录后访问详情页

image-20240510115537167

2.在Redis中也有了缓存

image-20240510115506347

6.压力测试
1.清空Redis

image-20240510131337298

2.清空用户表

image-20240510131408927

3.启动应用,重新生成2000个用户

image-20240510131906293

4.对访问列表页进行压测
1.发现平均QPS只有80,比直接走数据库还慢

image-20240510133226209

2.由于六台机器都开启了RDB和AOF的持久化策略,现在分别将其关闭,然后重启redis

image-20240510134438566

3.再次压测,还是80

image-20240510135137575

4.那么就可能是网络原因了,因为服务器都在北京,所以将服务部署到生产环境然后再进行压力测试

2.生产环境的压力测试

1.首先将GoodsController.java的从db查询商品列表打开

image-20240510140806413

2.部署上线
1.激活环境为prod

image-20240510141002410

2.maven打包

image-20240510141329259

3.上传到服务器然后重新启动

image-20240510141219305

image-20240510141322995

3.UserUtil.java 获取用户信息
1.修改环境变量

image-20240510141454701

2.获取cookie

image-20240510141645300

4.准备压测
1.http请求默认值

image-20240510141746474

2.http请求信息

image-20240510141913477

3.修改cookie的域

image-20240510142730644

4.开始压测5000次请求,QPS为55

image-20240510144422400

5.使用redis缓存页面来优化并重新部署

image-20240510144638573

6.再次压测,QPS为80,有所提升

image-20240510145440390

7.关于Redis缓存页面与DB的数据同步问题

image-20240510150344168

3.对象缓存问题解决

1.问题分析

在校验用户是否登录时,会根据cookie在Redis中查询用户信息,但是如果在DB中的用户信息更改了,那么就会发生数据不一致的问题

2.具体实现
1.UserService.java
    /*** 更新密码* @param userTicket* @param password* @param request* @param response* @return*/public RespBean updatePassword(String userTicket, String password, HttpServletRequest request, HttpServletResponse response);
2.UserServiceImpl.java
    @Overridepublic RespBean updatePassword(String userTicket, String password, HttpServletRequest request, HttpServletResponse response) {// 根据ticket获取用户User user = getUserByCookie(userTicket, request, response);if (null == user) {throw new GlobalException(RespBeanEnum.MOBILE_NOT_EXIST);}// 更新密码user.setPassword(MD5Util.inputPassToDBPass(password, user.getSlat()));int result = userMapper.updateById(user);if (1 == result) {// 删除redis中的用户信息redisTemplate.delete("user:" + userTicket);return RespBean.success();}return RespBean.error(RespBeanEnum.PASSWORD_UPDATE_FAIL);}
3.UserController.java
    // 更新密码@RequestMapping("/updatePassword")@ResponseBodypublic RespBean updatePassword(String userTicket, String password, HttpServletRequest request, HttpServletResponse response) {return userService.updatePassword(userTicket, password, request, response);}
3.测试
1.登录一下,得到票据

image-20240510154410627

2.Redis中有该用户信息

image-20240510154635876

3.更新密码 http://localhost:9092/seckill/user/updatePassword?userTicket=4dfaea799a9b438ea96ef61f7da435e3&password=666666

image-20240510154823197

4.刷新Redis,用户信息被删除

image-20240510154850757

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

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

相关文章

AIGC简介:如何利用人工智能进行内容生成

目录 一、引言二、AIGC的定义与技术原理1. 定义说明2. 关键技术3. 技术原理 三、AIGC的主要应用领域1. 文本内容生成2. 图像和视频生成3. 音频内容的创建4. 数据分析与报告 四、实施AIGC的步骤和方法1. 定义项目目标2. 数据准备与处理3. 选择合适的工具和技术4. 模型训练与测试…

uni-app学习--基础组件使用、页面生命周期、本地存储、网络请求、条件编译、路由跳转

文章目录 1. 基本组件的使用1. text文本组件的使用2. view视图容器组件的使用3. button按钮组件的使用4. image组件的使用5. map组件 2. uni-app中的样式1. uni-app&#xff1a;px2rpx计算 3. uni-app的数据绑定1. 基本的数据绑定2. v-bind,v-for,v-on 4. uni-app的生命周期1. …

服务器数据恢复—raid5阵列上分配的卷被删除后重建如何恢复被删除卷的数据?

服务器存储数据恢复环境&#xff1a; 某品牌FlexStorage P5730服务器存储&#xff0c;存储中有一组由24块硬盘组建的RAID5阵列&#xff0c;包括1块热备硬盘。 服务器存储故障&#xff1a; 存储中的2个卷被删除&#xff0c;删除之后重建了一个新卷。需要恢复之前删除的一个卷的数…

等保题目分享(60000字版)

文章目录 前言判断题单选题多选题简答题 前言 来源于网友会议 判断题 在对数据进行差异备份前&#xff0c;仍需进行数据库的全量备份。&#xff08;T) 某应用系统后台连续登录失败3次以后&#xff0c;需要输入验证码才能继续登录&#xff0c;这个应用系统实现了登录失败处理…

flink 状态

状态&#xff08;State&#xff09;是一个重要的概念&#xff0c;它允许Flink在处理流数据时跟踪和存储中间结果。这对于实现复杂的计算逻辑和满足应用需求至关重要。 Working with State 1. 状态类型 Flink支持两种主要类型的状态&#xff1a; 1.1 算子状态&#xff08;Op…

头文件和源文件的一些情况分析

c函数的定义和声明 函数和变量的声明可以有多次,但是定义只能有一次 其实头文件可以写函数的定义,但是在工程里面很多人引用这个头文件很容易造成重复定义的情况 有一个例外情况头文件里面也可以写函数定义或者变量定义 一般情况 //2.h #pragma once int add(int a, int b…

洛谷 P8721 [蓝桥杯 2020 省 AB3] 填空问题(缺少 inc.txt, E 题数据) 题解

题目分析 A 数青蛙 根据青蛙的个数分类计算&#xff1a; 青蛙数小于等于 2 2 2&#xff1a;此时青蛙数、眼睛数、嘴巴数和腿数读出来只读 1 1 1 个字&#xff0c;故此时一句话 14 14 14 个字。青蛙数大于 2 2 2&#xff0c;小于等于 5 5 5&#xff1a;此时青蛙数、眼睛…

百分之九十的人都忽视了JMeter响应断言中的这个实用功能—— Jmeter Variable Name to use

JMeter的响应断言 相信对于使用过JMeter的同学来学&#xff0c;一定都使用过响应断言&#xff0c;在这里我就不相信介绍了&#xff0c;我们可以简单的理解为&#xff1a; JMeter的响应断言是一种用于检查测试中得到的响应数据是否符合预期的工具&#xff0c;旨在保证性能测试…

最高100万!2024年成都市标杆场景项目申报条件对象、奖励和认定材料流程

一、申报条件 &#xff08;一&#xff09;申报主体需注册成立两年以上&#xff0c;具备独立法人资格&#xff0c;在成都有固定经营或者生产场地&#xff0c;上两年度主营业务收入年均1000万元以上或上两年度主营业务收入增长率年均10%以上&#xff1b; &#xff08;二&#x…

java基础选择题--18(转载)

1.设有定义 int a3 &#xff0c;b4&#xff0c;c5&#xff1b; 则以下的表达式中 &#xff0c; 值为 false 的是 &#xff08;&#xff09; 正确答案: D 你的答案&#xff1a;D&#xff08;正确&#xff09; A.a < b && b < c B.a < b C.a < ( b c ) D.!…

基于单片机的电流检测装置

摘  要 : 随着电子技术的发展和进步 , 小信号在电路中的使用愈加广泛 , 在实际应用中对于小电流信号的采集和监控越来越重要。 因此电路中的电流需要能够被简单 、 方便 、 准确 、 实时地测量 。 文中设计并实现了一套基于单片机的电流检测系统。 该系统使用功率放大电路…

2024最新python入门教程|python安装|pycharm安装

前言&#xff1a;在安装PyCharm之前&#xff0c;首先需要明确PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。PyCharm旨在通过提供智能代码补全、语法高亮、代码检查、快速导航和重构等丰富的编码辅助工具&#xff0c…

物联网的应用——工业自动化

工业自动化在物联网的应用主要体现在以下几个方面&#xff0c;这些应用不仅提高了工业生产的效率和质量&#xff0c;还优化了资源利用&#xff0c;降低了生产成本。以下是详细的分析和归纳&#xff1a; 数据采集与传输 物联网技术通过传感器实时采集工业设备的运行状态、温度、…

亚信安慧AntDB:全新的数据库体验

AntDB的核心设计理念是为了满足核心数据库升级改造的自主创新要求。它不仅提供了高效、可靠的数据处理能力&#xff0c;还特别强调了系统的可扩展性和前瞻性。这一设计理念奠定了AntDB在数据库领域的稳固地位&#xff0c;使其成为业内备受瞩目的技术创新之一通过采用最新的数据…

在无GPU的windows上运行ChatTTS

如果你在安装的过程中出现了下面的错误&#xff0c;不妨先看看这些安装步骤&#xff1a; cl: 命令行 error D8021 :无效的数值参数“/Wno-register” error: command C:\ windows ERROR: Failed building wheel for pynini 卷完了文本&#xff0c;卷图片&#xff0c;卷完了图…

dp和px的转化(dp2px,px2dp)

public class DensityUtil {/*** 根据手机的分辨率从 dp 的单位 转成为 px(像素).** param dpValue dpValue* return px*/public static int dp2px(float dpValue) {return (int) Math.ceil(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, dpValue, Resources.getSyst…

AI 入门指南二 :AI提示词(Prompt)

一&#xff0c;提示词的定义 提示词在中文中意为“触发”&#xff0c;在自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;它更接近于一个“心领神会”的概念&#xff0c;而非具有明确定义的术语。 简而言之&#xff0c;提示词是用户对大型语言模型的输入&#xff0…

Qt——Qt网络编程之TCP通信客户端的实现(使用QTcpSocket实现一个TCP客户端例程)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》

电脑自动关机怎么设置?简单3步就能搞定

电脑自动关机功能在许多场景下非常实用&#xff0c;例如下载大文件后自动关机、长时间不使用电脑后自动关机以节省能源等。通过合理设置自动关机&#xff0c;可以提高电脑使用的便利性和节能效果。本文将介绍电脑自动关机怎么设置的三种方法&#xff0c;帮助您根据不同需求灵活…

loras和checkpoints的概念和应用

Loras(Low-Rank Adaptation)是一种模型压缩和参数高效利用的技术。它的核心思想是,对于预训练好的大型模型,并不是所有的参数都对最终的性能贡献很大。Loras通过对模型的部分参数进行低秩分解,将其表示为两个低维矩阵的乘积,从而大幅减少了参数的数量。这样既能保持模型的性能,…