需求上线,为什么要刷缓存?
在需求上线的过程中,刷缓存主要有以下几个重要原因:
一、保证数据的准确性
-
旧数据残留问题
- 缓存是为了加快数据访问速度而存储的数据副本。在需求更新后,之前缓存中的数据可能已经不符合新的业务逻辑。例如,一个电商网站修改了商品价格计算规则,旧的商品价格缓存数据如果不清除,用户在访问商品页面时,看到的可能还是旧的价格,这就会导致数据不一致的问题。
- 再比如,一个新闻网站更新了新闻内容的排版规则,旧的缓存可能会展示不符合新排版的新闻,影响用户体验和信息的正确传达。
-
新数据可见性
- 当新的功能或数据添加到系统中时,缓存可能不会立即获取到这些新内容。通过刷缓存,可以确保新的数据能够及时被用户访问到。比如,在一个社交平台上线了新的用户动态类型,如“限时动态”,如果不刷新缓存,用户可能无法看到这些新动态,直到缓存过期后重新加载,这会延迟新功能的使用和推广。
二、适应系统架构变化
- 服务调用关系变更
- 当系统进行微服务架构调整或者服务之间的调用关系发生变化时,缓存中的数据可能会出现不匹配的情况。例如,在一个由多个微服务组成的电商系统中,订单服务和库存服务之间的接口进行了更新,之前缓存的关于订单和库存关联的数据可能就不再准确。刷缓存可以让系统重新获取正确的关联数据,以适应新的服务调用方式。
- 数据库模式改变
- 如果数据库的表结构、字段等发生了变化,缓存中的数据结构可能也需要相应调整。比如,数据库中增加了一个新的用户属性字段,如“用户会员等级有效期”,缓存中的用户信息缓存如果不刷新,就无法包含这个新字段的数据,从而影响到依赖这些数据的业务功能,如会员权益展示等。
三、性能优化方面的考虑
- 缓存命中率调整
- 有时候,新的需求上线可能会改变数据的访问模式。例如,一个应用程序原本很少访问用户的历史订单详情,缓存中对此数据的命中率较低。但新上线的功能可能会频繁查询用户历史订单,此时刷新缓存可以重新调整缓存内容,提高新需求相关数据的缓存命中率,从而提升系统整体性能。
- 避免缓存膨胀
- 随着需求的变化,一些旧的数据可能不再被频繁使用,但仍然占用缓存空间。刷缓存可以清除这些无用的数据,避免缓存空间被过度占用,导致缓存性能下降。例如,一个图片分享网站对图片分类规则进行了更新,旧分类相关的图片缓存如果不清理,会占用大量缓存资源,而这些资源本可以用于缓存新分类下更有价值的图片数据。
详细介绍下需求上线前的缓存清理流程
以下是需求上线前缓存清理流程的详细介绍:
一、规划与准备阶段
- 确定缓存范围
- 首先需要梳理涉及本次需求上线的所有功能模块对应的缓存数据。这包括从业务逻辑角度分析哪些数据是可能受到影响的。例如,如果是一个电商系统上线新的促销活动功能,那么与商品价格、库存、促销规则相关的缓存都可能需要清理。可以通过查看系统架构文档、数据库关系图以及与相关开发人员沟通来确定缓存范围。
- 同时,要区分不同类型的缓存,如内存缓存(如Redis)、分布式缓存、本地缓存等。不同类型的缓存清理方式和影响范围可能不同。
- 备份重要缓存数据(可选)
- 对于一些获取成本较高或者可能在清理后影响系统部分功能回滚的缓存数据,可以考虑进行备份。例如,一些复杂计算结果的缓存,如金融系统中的风险评估数据缓存。备份可以通过将缓存数据复制到另一个存储位置(如备用数据库或文件系统)来实现。但需要注意备份数据的有效期和一致性。
- 制定清理计划时间表
- 根据上线时间安排,确定缓存清理的具体时间点。这个时间点要考虑到对用户的影响最小。例如,如果是一个面向全球用户的服务,可能需要选择用户访问量较低的时间段,如深夜或者凌晨。同时,要考虑缓存清理所需的时间,以及清理后缓存重新加载可能带来的系统压力,合理安排清理和后续恢复的时间间隔。
二、缓存清理执行阶段
- 通知相关系统和人员
- 在进行缓存清理之前,要通知所有可能受到影响的系统和团队成员。这包括与缓存交互的后端服务、前端应用开发团队等。可以通过内部消息系统、邮件或者在项目管理工具中发布通知来实现。通知内容应包括清理的时间范围、涉及的缓存范围以及可能对系统功能产生的短期影响。
- 使用合适的工具和方法进行清理
- 对于内存缓存(如Redis)
- 可以使用Redis提供的命令来删除指定的键(keys)。如果缓存数据是按照一定的命名规则存储的,如以功能模块名称为前缀(例如,“product_price_*”表示商品价格相关缓存),可以使用通配符来批量删除这些键。但要注意在高并发环境下,这种批量删除操作可能会对系统性能产生一定的影响。
- 也可以通过编程方式,在连接到Redis服务器的应用程序中编写代码来执行缓存清理逻辑。例如,在Java应用中使用Jedis库,通过连接池获取Redis连接,然后调用
del
方法删除指定的缓存键。
- 对于分布式缓存(如Memcached)
- 同样可以通过管理工具或者命令行工具来删除缓存项。与Redis不同的是,Memcached没有像Redis那样复杂的键值对操作功能,通常是通过发送删除命令和指定缓存键来进行清理。
- 对于本地缓存(如应用程序内的静态变量缓存)
- 需要在应用程序重新启动或者通过特定的接口来清除缓存。在一些基于Java的应用中,可以通过修改缓存管理类中的方法,如设置一个清除缓存的公共方法,在需求上线前调用这个方法来清空本地缓存。
- 对于内存缓存(如Redis)
- 监控清理过程
- 在缓存清理过程中,要对系统进行监控,包括缓存服务器的资源使用情况(如CPU使用率、内存占用等)、网络流量以及相关应用程序的日志。通过监控可以及时发现清理过程中出现的问题,如清理命令执行失败、缓存服务器响应超时等。可以使用系统自带的监控工具(如Redis的INFO命令可以查看服务器状态信息)或者第三方监控软件(如Prometheus结合Grafana进行可视化监控)。
三、验证与恢复阶段
- 功能验证
- 在缓存清理完成后,需要对受影响的功能进行快速验证。可以通过自动化测试脚本和手动测试相结合的方式。自动化测试可以覆盖基本的功能点,如数据读取、页面加载等,检查是否出现缓存相关的错误(如缓存未命中导致的数据加载失败)。手动测试则可以更灵活地检查用户界面和复杂的业务功能是否正常工作。
- 例如,对于一个上线新用户注册功能的系统,要验证用户注册过程中涉及的验证码缓存(如果有)是否正确清除,新用户信息是否能够正确写入数据库并且在后续登录等操作中能够正确读取(不受旧缓存影响)。
- 缓存重新加载与预热(可选)
- 如果缓存对于系统性能至关重要,在验证功能正常后,可以考虑进行缓存重新加载和预热。缓存重新加载是指让系统重新填充缓存数据,可以通过模拟用户访问或者运行专门的数据加载脚本等方式来实现。缓存预热则是在系统正式上线前,提前将一些常用的数据加载到缓存中,以减少用户访问时的等待时间。
- 例如,对于一个内容推荐系统,在缓存清理后,可以通过运行推荐算法来重新加载热门内容推荐列表缓存,并且根据用户画像和历史行为数据预热一些个性化推荐缓存,这样在用户上线后可以更快地获取推荐内容。
- 问题处理与记录
- 如果在验证过程中发现问题,要及时处理。可以根据问题的严重程度决定是否回滚缓存清理操作或者暂停上线流程。同时,要对出现的问题进行详细记录,包括问题现象、出现问题的缓存区域、可能的原因以及解决方法。这些记录对于后续的系统维护和优化非常重要。
相关文章:

需求上线,为什么要刷缓存?
在需求上线的过程中,刷缓存主要有以下几个重要原因: 一、保证数据的准确性 旧数据残留问题 缓存是为了加快数据访问速度而存储的数据副本。在需求更新后,之前缓存中的数据可能已经不符合新的业务逻辑。例如,一个电商网站修改了商…...

TVS二极管选型【EMC】
TVS器件并联在电路中,当电路正常工作时,他处于截止状态(高阻态),不影响线路正常工作,当线路处于异常过压并达到其击穿电压时,他迅速由高阻态变为低阻态,给瞬间电流提供一个低阻抗导通…...

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举
本篇博客将聚焦于通过递归来实现两种经典的枚举方法:指数型枚举和排列型枚举。这两种枚举方式在计算机科学和算法竞赛中都有广泛应用,无论是在解题中,还是在实际工作中都极具价值。 目录 前言 斐波那契数列递归 递归实现指数型枚举 算法思…...

C#对线程同步的应用
什么是线程同步?线程同步的应用场景有哪些?在C#中有哪些线程同步方式?下面对这些问题做一个总结,让大家在面试的时候遇到这些问题能够游刃有余。 线程同步是指在多线程环境下,多个线程同时访问共享资源时,确…...

基于微信小程序的面部动作检测系统
引言 本技术文档旨在详细阐述一个基于微信小程序的面部动作检测系统的技术路线、实现方法及关键技术框架。系统的核心功能包括检测用户的左右转头、眨眼和张嘴动作,并根据检测结果逐步引导用户完成任务。为确保系统的安全性和准确性,特别是防止用户通过…...

Activation Functions
Chapter4:Activation Functions 声明:本篇博客笔记来源于《Neural Networks from scratch in Python》,作者的youtube 其实关于神经网络的入门博主已经写过几篇了,这里就不再赘述,附上链接。 1.一文窥见神经网络 2.神经…...

《Vue3实战教程》37:Vue3生产部署
如果您有疑问,请观看视频教程《Vue3实战教程》 生产部署 开发环境 vs. 生产环境 在开发过程中,Vue 提供了许多功能来提升开发体验: 对常见错误和隐患的警告对组件 props / 自定义事件的校验响应性调试钩子开发工具集成 然而ÿ…...

Linux:各发行版及其包管理工具
相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Debian 包管理工具:dpkg(低级包管理器)、apt(高级包管理器,建立在dpkg基础上)包格式:…...

【计算机网络】课程 作业一 搭建连续覆盖的办公网络
作业一 搭建连续覆盖的办公网络 题目:论述题(共1题,100分) 充分利用所学习的数据链路层局域网知识,加上物理层的基础知识,请给一个办公场所(三层,每层约100平方)…...

C++ 设计模式:单例模式(Singleton Pattern)
链接:C 设计模式 链接:C 设计模式 - 享元模式 单例模式(Singleton Pattern)是创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式在需要全局共享资源或控制实例数量的…...

OpenCV调整图像亮度和对比度
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、基本方法---线性变换 // 亮度和对比度调整 cv::Mat adjustBrightnessContrast(const cv::Mat& src, double alpha, int beta) {cv::Mat dst;src.convertTo(dst, -1, alpha, beta);return dst; }// 使用…...

Kafka Offset explorer使用
Kafka集群配置好以后以后运维这边先用工具测试一下,便于rd展开后续的工作,本地调试时一般使用Offset explorer工具进行连接 使用SASL(Simple Authentication and Security Layer)验证方式 使用SCRAM-SHA-256(Salted Challenge Response Authentication…...

二维码文件在线管理系统-收费版
需求背景 如果大家想要在网上管理自己的文件,而且需要生成二维码,下面推荐【草料二维码】,这个系统很好。特别适合那些制造业,实体业的使用手册,你可以生成一个二维码,贴在设备上,然后这个二维码…...

UE4.27 Android环境下获取手机电量
获取电量方法 使用的方法时FAndroidMisc::GetBatteryLevel(); 出现的问题 但是在电脑上编译时发现,会发现编译无法通过。 因为安卓环境下编译时,包含 #include "Android/AndroidPlatformMisc.h" 头文件是可以正常链接的,但在电…...

vue-i18n报错
1. 开发环境报错Uncaught (in promise) TypeError: ‘set’ on proxy: trap returned falsish for property ‘$t’ legacy需要设置为false const i18n createI18n({legacy: false,// 默认语言locale: lang,// 设置语言环境messages, })2. 打包配置tsc --noEmit时报错&#…...

Docker新手:在tencent云上实现Python服务打包到容器
1 使用docker的原因 一致性和可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致,减少了“在我的机器上可以运行”的问题。 隔离性ÿ…...

React基础知识学习
学习React前端框架是一个系统而深入的过程,以下是一份详细的学习指南: 一、React基础知识 React简介 React是一个用于构建用户界面的JavaScript库,由Facebook开发和维护。它强调组件化和声明式编程,使得构建复杂的用户界面变得更…...

ES IK分词器插件
前言 ES中默认了许多分词器,但是对中文的支持并不友好,IK分词器是一个专门为中文文本设计的分词工具,它不是ES的内置组件,而是一个需要单独安装和配置的插件。 Ik分词器的下载安装(Winows 版本) 下载地址:…...

二十三种设计模式-抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。这种模式主要用于系统需要独立于其产品的创建逻辑时,并且…...

python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)
官方文档:https://docs.opencv.org/4.10.0/d1/d89/tutorial_py_orb.html SIFT/SURF/ORB对比 https://www.bilibili.com/video/BV1Yw411S7hH?spm_id_from333.788.player.switch&vd_source26bb43d70f463acac2b0cce092be2eaa&p80 ORB代码 import numpy a…...

高阶数据结构----布隆过滤器和位图
(一)位图 位图是用来存放某种状态的,因为一个bit上只能存0和1所以一般只有两种状态的情况下适合用位图,所以非常适合判断数据在或者不在,而且位图十分节省空间,很适合于海量数据,且容易存储&…...

VScode使用密钥进行ssh连接服务器方法
如何正常连接ssh的方式可以看我原来那篇文章:Windows上使用VSCode连接远程服务器ssh 1.连接 点击ssh加号,然后关键点在第2步的书写上 2.命令 2的位置写命令: ssh -i "C:\Users\userName\.ssh\id_rsa" usernameIP -p 端口号 端…...

艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!
Redis 宣布推出其首款专为 VS Code 设计的 Redis 扩展。这一扩展将 Redis 功能直接整合进您的集成开发环境(IDE),旨在简化您的工作流程,提升工作效率。 我们一直致力于构建强大的开发者生态系统,并在您工作的每一步提…...

应用架构模式
设计模式 设计模式是指根据通用需求来设计解决方案的模板或蓝图,使用设计模式能够更加有效地解决设计过程中的常见问题。设计模式针对不同的问题域有不同的内涵,主要涉及业务、架构、程序设计等问题域,本文主要讨论架构设计模式。 业务设计模…...

注入少量可学习的向量参数: 注入适配器IA3
注入少量可学习的向量参数: 注入适配器IA3 简介:IA3通过学习向量来对激活层加权进行缩放,从而获得更强的性能,同时仅引入相对少量的新参数。它的诞生背景是为了改进LoRA,与LoRA不同的是,IA3直接处理学习向量,而不是学习低秩权重矩阵,这使得可训练参数的数量更少,并且原…...

【C++】B2076 球弹跳高度的计算
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式输入输出示例 💯两种代码实现及其对比我的代码实现代码分析优点与不足 老师的代码实现代码分析优点与不足 💯两种实现的对…...

【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)
我们在写selenium获取网络信息的时候,有时候我们会受到对方浏览器的监控,对方通过分析用户行为模式,如点击、滚动、停留时间等,网站可以识别出异常行为,进而对Selenium爬虫进行限制。 这里我们可以加入JavaScript的使…...

CatBoost算法详解与PyTorch实现
CatBoost算法详解与PyTorch实现 目录 CatBoost算法详解与PyTorch实现@[TOC](目录)1. CatBoost算法概述1.1 梯度提升树(GBDT)1.2 CatBoost的优势2. CatBoost的核心技术2.1 类别特征处理2.2 对称树结构2.3 有序提升技术2.4 正则化技术3. PyTorch实现CatBoost3.1 环境准备3.2 Py…...

“TypeScript版:数据结构与算法-初识算法“
引言 在算法与编程的广阔世界里,总有一些作品以其独特的魅力和卓越的设计脱颖而出,成为我们学习和研究的典范。今天,我非常荣幸地向大家分享一个令人印象深刻的算法——Hello算法。 Hello算法不仅展现了作者深厚的编程功底,更以…...

mysql中递归的使用 WITH RECURSIVE
MySQL递归查询的基本语法和用法 MySQL 8.0及以上版本支持使用WITH RECURSIVE来进行递归查询。WITH RECURSIVE定义了一个递归的公用表表达式(CTE),它包含两个部分:递归的基础部分(非递归部分)和递归部分。 …...