Redis 基础数据改造

news2024/9/30 7:29:13

优质博文:IT-BLOG-CN

一、服务背景

基础数据查询服务:提供航司、机场、票台、城市等基础数据信息。

痛点一:因为基础数据不属于频繁更新的数据,所以每个应用都有自己和缓存,当基础数据更新后,各个应用缓存刷新不及时就会导致应用数据不一致问题。
痛点二:应用请求量过大,导致基础数据库负载过高,影响其它应用的正常使用。
痛点三:每年都会有机场转场事件(比如:2019年北京南苑机场转场至北京大兴国际机场),要求在某个特定时间点新老机场转换并同时输出,调用方众多每次转场协调复杂,数据需要频繁清洗。

基础服务模块的功能:保证服务的数据一致性,并达到数据限流的目的。

数据请求情况:接口数72个,调用方763个,接口返回nKB~56+MBQPS:500,核数:9*16 + 6*8 = 192C

问题点:接口的可靠性(如果接口挂掉就会影响改签和下单流程)和数据的准确性(与数据库数据不一致时,会影响用户形成)。

二、基础数据模块

加载和更新机制:
【1】服务启动时预加载数据,验证数据源不可用性。点火时长50s,配置化加载核心数据。为了降低点火时间,也排除了一些非核心的数据。
【2】5分钟检查是否需要更新DataChangeLastTime+TotalCount
【3】24小时强刷和根据配置的缓存key强刷。记录每个key的最近一次缓存时间,24小时为离散刷新。
【4】缓存增量更新,因为数据量比较大。
【5】过载保护(检查数据变化量),可配置每个key的过载阈值,配置百分比或者数据量,比如airline:20条,city:10%。主要防止脏数据写入,或者大量数据的删除。此时会通过告警通知相关开发,手动进行缓存的更新,大概2分钟之内能够完成,主要防止数据问题。
【6】手动刷新机制:可通过工具手动刷新缓存,刷新维度可以精确到机器维度。
【7】部分接口准实时更新。主要是部分应用需要实时数据。

三、准实时更新

老逻辑:job十五分钟轮询基本数据表的变动情况,有变动则通知调用方刷新缓存。

新逻辑:

四、基础数据上云

SGP调用本地基础数据相对于虫洞回上海调用基础服务,网络延迟能够降低70ms+数据。

数据目前为单向同步,由上海业务人员进行维护。

五、缓存压缩

痛点:基础数据使用的是全量的缓存,所以数据量会很大。

优化点:
【1】使用原生的数据类型:单个对象可由230个字节降到80字节。

原数据类型新数据类型
private Timestamp effectdateprivate long effectdate
private String flightprivate byte[] flight
private String isShareprivate boolean isShare
private String opFlightprivate byte[] opFlight
private Boolean isValidprivate boolean isValid

航班号字符串占用情况:

java.lang.String @ 0x234234322 HC8932   2456
char[6] @ 0x8089405204 HC8932 32 32

对象头12字节 + int类型4字节 + 数组引用4字节 + padding 4字节 = 24字节;
数组对象头16字节 + 字符数6 * char类型2字节 + padding 4字节 = 32字节;
24 + 32 = 56字节;

航班号byte[]占用情况:

flight byte[6] @0x843784596  24 24
<class> class byte[] @0x893457382 0 0

数组对象头16字节 + 字节数6字节 + padding 2字节 = 24字节;

优化完成之后的效果:老年代占用由8G降低到4G,降低50%。Young GC的次数也由2降低到1次。

【2】取除中间POJO对象:之前缓存中间层对象,目前缓存的是契约中的对象。

六、缓存上移

1、pojo缓存更改为契约缓存;
2、序列化后+数据压缩再存入缓存;

压测结果:getCity接口,2.8M + 多语言资源后5M + 通过ZSTD压缩后1.5M

PB5M接口平均耗时350ms
PB+ZSTD1.5M接口平均耗时90ms

七、优化点

【1】出现脏数据快速回滚:产品修改某条基础数据错误,导致业务不可用。方案:通过OSS存储历史版本,回滚时根据历史版本号获取历史数据。
【2】点火时间需要50s左右,数据可以一步加载减少点火耗时。

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

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

相关文章

webGL入门(五)绘制多边形

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scri…

ARM 服务器上安装 OpenEuler (欧拉)

系统介绍 在 2019 年 7 月 19 日&#xff0c;华为宣布要在年底正式开源 openEuler 操作系统&#xff1b;在半年后的 12 月 31 日&#xff0c;华为正式开源了 openEuler 操作系统&#xff0c;邀请社区开发者共同来贡献。 一年后&#xff0c;截止到 2020 年12 月 25日&#xff…

计算机毕业设计 Java教务管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

[Cocoa]_[初级]_[使用NSNotificationCenter作为目标观察者实现时需要注意的事项]

场景 在开发Cocoa程序时&#xff0c;由于界面是用Objective-C写的。无法使用C的目标观察者[1]类。如果是使用第二种方案2[2],那么也需要增加一个代理类。那么有没有更省事的办法&#xff1f; 说明 开发界面的时候&#xff0c;经常是需要在子界面里传递数据给主界面&#xff0…

PIKACHU | PIKACHU 靶场 XSS 后台配置

关注这个靶场的其他相关笔记&#xff1a;PIKACHU —— 靶场笔记合集-CSDN博客 PIKACHU 自带了一个 XSS 平台&#xff0c;可以辅助我们完成 XSS 攻击&#xff0c;但是该后台需要配置数据库以后才能使用。本教程&#xff0c;就是教大家如何配置 PIKACHU XSS 平台的。 PIKACHU XS…

vulhub weblogic 靶场攻略

一&#xff1a;WebLogic 后台弱⼝令GetShell&#xff08;weak_password &#xff09; 漏洞描述 通过弱⼝令进⼊后台界⾯ , 上传部署war包 , getshell 影响范围 全版本&#xff08;前提后台存在弱⼝令&#xff09; 环境搭建 cd vulhub-master/weblogic/weak_password doc…

【STM32开发环境搭建】-4-在STM32CubeMX中新增Keil(MDK-ARM) 5的工程目录(包含指定路径的C和H文件)

案例背景&#xff1a; 由于Keil(MDK-ARM)5工程&#xff1a;DEMO_STM32F030C8T6.uvprojx是由STM32CubeMX工具生成的&#xff0c;如果我们在Keil工程中手动添加了一些c文件和h文件的Include Path包含路径&#xff0c;会在STM32CubeMX下一次生成uvprojx文件时&#xff0c;被删除&…

纯软件小白 学习DDR5

问题 1.你知道当你打开游戏加载存档时候计算机是在做什么吗&#xff1f; 由于你的CPU只有在数据被加载到DRAM的时候才可以工作&#xff0c;所以当你需要用数据的时候&#xff0c;数据会从SSD复制到DRAM这一过程需要时间&#xff0c;所以会有加载&#xff08;所有3D模型、纹理…

【从零开始实现stm32无刷电机FOC】【实践】【7.1/7 硬件设计】

目录 stm32电路磁编码器电路电机驱动电路电流采样电路电机选择本文示例硬件说明 为了承载和验证本文的FOC代码工程&#xff0c;本节设计了一个简易的三相无刷电机 硬件套件&#xff0c;主控采用非常常用的stm32f103c8t6单片机&#xff0c;电机编码器采用MT6701&#xff0c;电机…

电源的带载能力怎么判断?Namisoft为您介绍测试方法

确保电源在各种负载条件下都能稳定工作&#xff0c;是电源设计者面临的重要挑战。本文将详细介绍如何通过带载测试来评估电源的负载能力。 电源带载测试介绍 带载能力指电源在其规定条件下&#xff0c;所能承受的最大负载能力。电源带载测试就是对电源模块的负载能力进行测试&a…

调试分析:[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法

回顾复习2023年8月的《★修改Exata6.2源码&#xff1a;〔修改Bellmanford最短路径路由的衡量标准从【路由跳数】改为【“路由器节点间的物理距离”】&#xff0c;并动画演示〕》&#xff0c;VS2015调试Exata&#xff0c;跟踪调试修改后的[ routing_bellmanford.cpp ]源码&#…

AgentScope : 与CodeAct智能体对话

参考&#xff1a; 非一般程序猿第六季Agent入门实战篇(三)–CodeActAgent篇 Conversation with CodeAct Agent 0&#xff0c;简介 CodeAct Agent是一个Agent,它不仅可以聊天,还可以为你编写和执行Python代码。在本示例中,将介绍另一种赋予Agent调用工具能力的方法,特别是通过…

Mac 卸载 IDEA 流程

1、现在应用程序中删除Idea 2、进入Library目录 cd /Users/zhengzhaoxiang/Library 3、删除IntelliJIdea2023.3&#xff08;根据自己的版本而定&#xff09;记得进去看下是否删除干净了 rm -rf Logs/JetBrains/IntelliJIdea2023.3 rm -rf Preferences/com.jetbrains.intel…

项目学习笔记

Downloads – Oracle VirtualBoxhttps://www.virtualbox.org/wiki/Downloads

启动hadoop集群出现there is no HDFS_NAMENODE_USER defined.Aborting operation

解决方案 在hadoop-env.sh中添加 export HDFS_DATANODE_USERroot export HDFS_NAMENODE_USERroot export HDFS_SECONDARYNAMENODE_USERroot export YARN_RESOURCEMANAGER_USERroot export YARN_NODEMANAGER_USERroot 再次运行即可。

Candance仿真电流镜OTA

1.电路图搭建 图1 上面那层不能直接一横直接连过来&#xff0c;图2只能这样连。但是&#xff0c;图2的M1和M0的电压已经超过了VDD的1.8V。是不行的&#xff0c;需要调整&#xff0c;主要增大M1和M0的宽长比以减小电压。 图2 candance电流镜OTA电路实现 下面这篇文章讲了电流镜…

ROS与无人驾驶学习笔记(一)——ROS基本操作

文章目录 ※ 安装ubuntu 下载 创建虚拟机 安装系统 安装vmware tool 更新源 安装常用软件 ※ 安装ROS 设置软件更新 使用清华源安装 ros测试 认识ROS ROS特点 ROS系统实现 ROS安装 工作需要&#xff0c;转行做码农了。。。 大概是无人驾驶相关的&#xff0c;啥都不会。。。 看成…

JS设计模式之状态模式:优雅地管理应用中产生的不同状态

一. 前言 在过去&#xff0c;我们经常使用条件语句&#xff08;if-else 语句&#xff09;来处理应用程序中的不同状态。然而&#xff0c;这种方式往往会让代码变得冗长、难以维护&#xff0c;并可能引入潜在的 bug。而状态模式则提供了一种更加结构化和可扩展的方法来处理状态…

支持超高分辨率图片生成,UltraPixel模型分享

UltraPixel是一种由华为诺亚方舟实验室联合香港科技大学共同开发的超高清图像合成架构&#xff0c;旨在生成具有丰富细节的高质量图像&#xff0c;其分辨率可以从1K一直延伸至6K。 UltraPixel不仅仅是一个图像放大工具&#xff0c;它还能在生成过程中优化细节&#xff0c;提升…

Golang | Leetcode Golang题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; func numberOfBoomerangs(points [][]int) (ans int) {for _, p : range points {cnt : map[int]int{}for _, q : range points {dis : (p[0]-q[0])*(p[0]-q[0]) (p[1]-q[1])*(p[1]-q[1])cnt[dis]}for _, m : range cnt {ans m * (m - 1)…