Redis 基础数据改造

优质博文:IT-BLOG-CN

一、服务背景

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

痛点一:因为基础数据不属于频繁更新的数据,所以每个应用都有自己和缓存,当基础数据更新后,各个应用缓存刷新不及时就会导致应用数据不一致问题。
痛点二:应用请求量过大,导致基础数据库负载过高,影响其它应用的正常使用。
痛点三:每年都会有机场转场事件(比如: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十五分钟轮询基本数据表的变动情况,有变动则通知调用方刷新缓存。

新逻辑:

763服务获取基础数据应当直接获取Redis缓存数据,Redis数据搭建了集群环境,保证了可靠性。如果应用上云可以节省的内存,我们可以预算一下:

国内私有云AWS海外阿里云
9.5/G/月43/G/月23/G/月

这里按照应用最少获取4个基础数据信息(航司/机场/票台/城市)预估:4 * 56MB = 224MB,如果所有关联的服务都上云763 * 56MB = 40G,我们转换成Docer费用:AWS节省:40G * (43-9.5) = 1340/月,阿里云:40G * (23-9.5) = 540/月`

四、基础数据上云

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

如果应用上云可以节省的内存,我们可以预算一下:

国内私有云AWS海外阿里云
6.425/G/月60/G/月25/G/月

七、优化点

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# String系列(3):StringBuilder有诸多优势,它能代替String吗?

前言 嗨&#xff0c;大家好&#xff01; 之前我们在文章《C# String 类型&#xff1a;那些你可能不知道的秘密》分享了 C# String 类型的一些小秘密和小技巧&#xff0c;其中提到一个性能提升的小贴士&#xff1a;在拼接字符串时&#xff0c;使用 StringBuilder 替代 String。…

6.1、实验一:静态路由

源文件获取&#xff1a;6.1_实验一&#xff1a;静态路由.pkt: https://url02.ctfile.com/f/61945102-1420248902-c5a99e?p2707 (访问密码: 2707) 一、目的 理解路由表的概念 会使用基础命令 根据需求正确配置静态路由 二、准备实验 1.实验要求 让PC0、PC1、PC2三台电脑…

嵌入式linux中设备树控制硬件的方法

大家好,今天主要给大家分享一下,如何使用linux系统下的设备树进行硬件控制方法。 第一:linux系统中设备树驱动LED原理 在linux系统中可以使用设备树向Linux内核传递相关的寄存器地址,linux驱动中使用OF函数从设备树中获取所需的属性值,然后使用获取到的属性值来初始化相关…

一文解秘Rust如何与Java互操作

本博客所有文章除特别声明外&#xff0c;均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 唯你 使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情&#xff0c;而 Java 也可以享受 Rust 语言特性的内存安全&#xff0c;所有权机制&#xff0c;无畏并发。…

【贪心算法】No.1---贪心算法(1)

文章目录 前言一、贪心算法&#xff1a;二、贪心算法示例&#xff1a;1.1 柠檬⽔找零1.2 将数组和减半的最少操作次数1.3 最⼤数1.4 摆动序列1.5 最⻓递增⼦序列1.6 递增的三元⼦序列 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到…

阿里云-防火墙设置不当导致ssh无法连接

今天学网络编程的时候&#xff0c;看见有陌生ip连接&#xff0c;所以打开了防火墙禁止除本机之外的其他ip连接&#xff1a; 但是当我再次用ssh的时候&#xff0c;连不上了才发现大事不妙。 折腾了半天&#xff0c;发现阿里云上可以在线向服务器发送命令&#xff0c;所以赶紧把2…

基于物联网设计的地下煤矿安全监测与预警

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】NBIOT-BC26模块【2】MQ5传感器【4】DHT11传感器【5】红外热释电人体检…

揭秘全向轮运动学:机动艺术与上下位机通信的智慧桥梁

✨✨ Rqtz 个人主页 : 点击✨✨ &#x1f308;Qt系列专栏:点击 &#x1f388;Qt智能车上位机专栏: 点击&#x1f388; 本篇文章介绍的是有关于全向轮运动学分析&#xff0c;单片机与上位机通信C代码以及ROS里程计解算的内容。 目录 大纲 ROS&#xff08;机器人操作系统&…

《AI在企业战略中的关键地位:以微软和阿里为例》

内容概要 在当今商业环境中&#xff0c;人工智能&#xff08;AI&#xff09;的影响力如滔滔洪水&#xff0c;愈演愈烈。文章将揭示AI在企业战略中的崛起&#xff0c;尤其以微软和阿里巴巴为代表的企业&#xff0c;这两家科技巨头通过不同方式&#xff0c;将智能技术融入其核心…

Pandas | 理性判断数据是否存在缺失值的一种方法

理性判断 一般思路进一步思考df[B].explode() 一般思路 tcc.info()上述信息info显示没有缺失值 但是真实的情况还是要根据业务实际分析tcc.isnull().sum() # 和tcc.info()作用和tcc.info() 其实是一样的 进一步思考 在此过程中&#xff0c;我们需要检验是否存在采用别的值来表…

大数据新视界 -- 大数据大厂之经典案例解析:广告公司 Impala 优化的成功之道(下)(10/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

基于vue框架的的冷链食品物流信息管理系统v81wb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,司机,冷链食品,冷链食品订单,冷链车辆,配送信息,订单费用,站点信息,食品种类,省,市,食品质量,县 开题报告内容 基于Vue框架的冷链食品物流信息管理系统开题报告 一、研究背景与意义 随着全球食品贸易的快速发展和消费者对食品品质…

职场逆袭!学会管理上司,你也能成为职场赢家

书友们&#xff0c;不要错过了&#xff01;我挖到了一本真正让我彻夜难眠的小说&#xff0c;情节跌宕起伏&#xff0c;角色鲜活得就像从书里跳出来陪你聊天。每一页都是新的惊喜&#xff0c;绝对让你欲罢不能。要是你也在寻找那种让人上瘾的阅读体验&#xff0c;这本书就是你的…

byte加byte居然是int了?

问题现象 最近在看 Java 的基础知识时看到一个有意思的现象&#xff0c;在 Java 中两个 byte 相加之后的结果的类型变成 int 类型了&#xff1a; byte a 1; byte b 2; b a b;从Idea给的提示可以看到&#xff0c;两个 byte 类型相加的结果变成了 int 类型&#xff0c;不能…

vue3中使用mqtt数据传输(封装)

使用版本 "mqtt": "^5.8.0",安装指令 npm install mqtt --save ------ yarn add mqtt介绍mqtt 参考使用文档 配置 connection: {protocol: "ws",host: "broker.emqx.io",port: 8083,endpoint: "/mqtt",clean: true,con…

全面解析谷歌浏览器的功能与使用技巧

谷歌浏览器&#xff08;Google Chrome&#xff09;作为全球最受欢迎的网页浏览器之一&#xff0c;以其简洁的界面、快速的加载速度和强大的功能赢得了广大用户的青睐。本文将全面解析谷歌浏览器的功能和使用技巧&#xff0c;帮助您更好地利用这一工具提升上网体验。&#xff08…

《探索Zynq MPSoC》学习笔记(二)

引言&#xff1a;本文开始学习第二章内容&#xff0c;本文重点介绍FPGA、Zynq和Zynq MPSoC器件技术演进以及Zynq和Zynq MPSoC器件的基本结构和特点。 第二章 FPGA、Zynq和Zynq MPSoC &#xff08;1&#xff09; Zynq MPSoC是Xilinx发布的第一款SoC Zynq-7000片上系统&#xf…

mac 本地docker-mysql主从复制部署

mac 本地docker-mysql主从复制部署,服务器同理 1.本地docker启动两个mysql服务.端口号不一样 没有选择挂载到宿主机.只做测试用. 只是端口号不一样容器删掉.就没有数据了. 生产测试,需要挂在 master docker run -d --name mysql-slave -p 3308:3306 \ -e MYSQL_ROOT_PASSWORD…

七.numpy模块

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发&#xff0c;2005 年&#xff0c;Travis Oliphant…

测试用例小锦囊——基于思维导图的测试用例生成和维护

敲黑板&#xff0c;测试用例真的很重要&#xff01; 测试用例是测试工作的基础&#xff0c;通过提供结构化和系统化的方法&#xff0c;来帮助验证软件产品的功能是否按预期正确实现&#xff0c;从而确保软件质量&#xff0c;提升用户满意度。 测试用例的关键要素包括用例编号、…