记一次生产优化-优化定时提前加载用户信息

背景

最近,有不少用户反映登录我们的APP后,进入首页展示用户数据时要很久很久才能展示出来。刚开始还没在意,以为是用户自己的网络慢导致的,后来有好几个用户都反映了此问题,这不得不引起我们的重视了。

后来经过我们排查日志发现一个现象,提出该问题的用户都是基础数据比较多的,因为我们是金融软件,所以当用户的基础数据比较多的时候,在首页展示时会先去查询基础数据,然后在轮询这些基础数据查询接口得到结果之后再进行一些逻辑运算。有不少用户多达几十甚至上百条基础数据,所以导致查询时非常慢。

问题分析

这个问题的关键是用户基础数据的查询,以及对基础数据轮询查询接口次数较多导致的。所以当了解了问题的根源所在,我们就从根源出发解决这个问题。

我们想到的是,既然是因为查询基础数据和轮询基础数据次数较多导致的,那么我们就减少次数。

怎么减少呢?我们的方案是提前查询用户基础数据到Redis进行缓存,而不是在客户登录时再去加载,这样用户登录时的基础数据查询次数就减少到了0。因为我们的用户基础数据变化的不是那么频繁,所以我们可以这样提前缓存。

那么什么时候去加载用户的数据到Redis里呢?显然是在用户使用APP之前且较少人使用的时间段,我们暂且定在凌晨3、4点吧。我们可以在这个时间把这些特殊用户的数据通过定时跑批的方式提前加载至Redis。

那什么样的用户才去提前加载呢?肯定不是所有用户,我们只针对基础数据条数达到某一阈值时的用户(称为特殊用户,将用户添加至白名单用户表white_user表)。比如基础数据达到5条时,该阈值可参数化配置,并根据条数和页面响应时间测试得出该值。比如当有5条基础数据时,达到页面响应时间用户可忍受程度的极限。

我们必须要自动发现特殊用户,将其添加至white_user表。我们选择在用户登录时开启线程判断用户是否满足白名单用户的条件,满足则添加至white_user表,不满足的先判断是否在表里,在则删除掉。(用户可自己操作减少基础数据)

实施方案

分析完问题,也大致确定了解决方案。我们来总结下解决方案:

1、自动发现特殊用户,添加至white_user表。-根据基础数据阈值,判定是否为特殊用户。

2、凌晨定时加载白名单用户基础数据至Redis。-定时跑批,执行任务。

具体实现

1、在跑批系统,创建 Spring Quartz 定时任务。设定每天凌晨3点执行定时任务,具体执行的任务就是通过Redis发布订阅功能通知APP服务系统,APP服务系统收到消息后查询白名单用户,然后查询用户基础数据到Redis。

2、客户登录时,执行异步操作。根据基础数据个数与阈值比较,判定是否可以列为特殊用户,并添加至白名单用户表;不满足特殊条件时若用户在白名单用户表,则删除。

3、异步刷新用户基础数据,当用户修改基础数据时,异步更新基础数据。

4、因为加载到Redis的数据设置的都有过期时间,所以。。。。

需要注意

1、跑批系统和APP服务系统都是集群部署的,所以如何实现只有一台跑批服务器去执行跑批任务利用Redis发布消息通知APP服务系统?

2、如何实现APP集群服务不重复加载用户信息?(因为集群下都会收到跑批系统的消息,又不能控制只有一台收到消息,所以就控制只有一台执行)

第一个问题解决方案,redis分布式锁

定时任务执行时,利用Redis实现分布式锁,使得只有一台跑批系统执行任务。

第二个问题解决方案,可以和第一种一样也使用分布式锁,但还可以用另一种

由于APP服务系统执行加载客户数据的操作是基于用户ID的,所以查询白名用户ID的操作可以交给跑批系统来做,跑批系统将客户号放入Redis(list类型实现队列),APP服务系统就算是多台都执行,但是他们都是要去Redis中取用户ID的,对Redis的list类型实现的队列执行getAndDel操作。所以即使是集群环境下多台机器都执行,也不会重复操作同一用户数据,不会做重复操作。

总结

用到的技术:

Spring Quartz 实现定时任务,Redis 实现分布式锁,Redis 实现数据缓存,Redis 发布订阅。

PS:

至于Redis发布订阅功能的使用和代码实现我之前的文章可以参考一下。Redis发布订阅功能是redis的一个重要功能,redis的客户端订阅一个频道,当此频道发布消息时,所有订阅这个频道的客户端都会收到,收到消息后可以执行具体的自定义的操作。

原文地址:https://www.cnblogs.com/ibigboy/p/11174867.html

时间: 2024-08-29 22:04:35

记一次生产优化-优化定时提前加载用户信息的相关文章

网站优化--图片的预加载与懒加载(上)

1.延迟加载即懒加载,主要目的是作为服务器前端的优化,减少请求数或延迟请求数,在一些图片非常多的网站中非常有用,当图片位置进入到可视区的时候才会被加载,这样对于含有很多 图片的比较长的网页来说,可以加载的更快,并且还能节省服务器带宽 最常用的方式是:监控滚动条的高度,当滚动条高度和可视区高度之和小于图片位置距离页面的高度时会被加载 2.预加载:在查看前面张图片的时候加载后面的图片,在提升用户体验的同时会增加服务器的压力 常用方式:创建image对象,通过src属性加载url资源,当资源加载完成后

页面性能优化:preload预加载静态资源

本文主要介绍preload的使用,以及与prefetch的区别.然后会聊聊浏览器的加载优先级. preload 提供了一种声明式的命令,让浏览器提前加载指定资源(加载后并不执行),在需要执行的时候再执行.提供的好处主要是 将加载和执行分离开,可不阻塞渲染和 document 的 onload 事件 提前加载指定资源,不再出现依赖的font字体隔了一段时间才刷出 如何使用 preload 使用 link 标签创建 <!-- 使用 link 标签静态标记需要预加载的资源 --><link r

tableview加载图片的时候的优化之lazy(懒加载)模式and异步加载模式

iOS---tableview加载图片的时候的优化之lazy(懒加载)模式and异步加载模式举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动经过了,图片就开始加载了,这样用户体验就不太好,而且浪费内存.这个时候,我们就可以利用lazy加载技术,当界面滑动或者滑动减速的时候,都不进行图片加载,只有当用户不再滑动并且减速效果停止的时候,才进行加载.刚开始我异步加载图片利用SDWebImage来做

vue项目优化之按需加载组件-使用webpack require.ensure

vue项目优化之按需加载组件-使用webpack require.ensure 使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build  会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash].js 类似下面的路由代码 router/index.js  路由相关信息,该路由文件引入了多个 .vue组件 import Hello from '@/components/Hello' import Province

基于Android官方AsyncListUtil优化改进RecyclerView分页加载机制(一)

基于Android官方AsyncListUtil优化改进RecyclerView分页加载机制(一) Android AsyncListUtil是Android官方提供的专为列表这样的数据更新加载提供的异步加载组件.基于AsyncListUtil组件,可以轻易实现常见的RecyclerView分页加载技术.AsyncListUtil技术涉及的细节比较繁复,因此我将分别写若干篇文章,分点.分解AsyncListUtil技术. 先给出一个可运行的例子,MainActivity.java: packag

网页加载速度优化4--图片懒加载

当前网页设计理念主要以大气简洁主流(文艺小清新网站例外).更多的信息用图片来展示. 由于图片都是高清,所以会影响到网页加载速度.这里我们就用到图片的懒加载(延迟加载)功能. 最快速解决方案:jquery lazyload插件. Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加

java_有返回值线程_提前加载例子

package com.demo.test3; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * @author QQ: 1236897 * */ //有返回值线程 //提前加载 public class FutureTaskTest { /** * @param args */ pu

AHK 提前加载声音

ahk 预加载声音: path = "C:\Windows\Media\Windows Recycle.wav" command := "open " path " alias AHK_PlayMe" DllCall("Winmm\mciSendString","str",command,"ptr",0,"uint",0,"uint",0) 其实就

Web前端性能优化——如何提高页面加载速度

前言:  在同样的网络环境下,两个同样能满足你的需求的网站,一个"Duang"的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒,99%的用户会关闭这个网页.也许这样讲,各位还不会有太多感触,接下来我列举一组数据:Google网站访问速度每慢400ms就导致用户搜索请 求下降0.59%;Amazon每增加100ms网站延迟将导致收入下降1%;雅虎如果有400ms延迟会导致流量下降5-9%.网站的加载速度严重影响了用户