海量数据读写方式选择

高并发读写场景分析

        无论任何业务系统,无非就是两个操作:写和读。 在海量数据和高并发的场景下,写和读就会成为系统性能的瓶颈。下面分析不同业务场景下面临的问题:

侧重“高并发读”的系统

  • 场景1:搜索引擎。 C端用户包括网页发布者(写)和网页搜索者(读), 但是读和写明显不是一个数量级。
  • 场景2:电商的商品搜索。 
  • 场景3:电商的商品详情

侧重“高并发写”的系统

场景1:广告扣费系统。 

         广告通常要么按浏览付费,要么按点击付费(业界叫作 CPC或 CPM)。具体来说,就是广告主在广告平台开通一个账号,充一笔钱进去,然后投放自己的广告。C端用户看到了这个广告后,可能点击一次扣一块钱(CPC);或者浏览这个广告,浏览1000次扣10块(CPM)。

        扣款要尽可能实时,如果慢扣了, 就可能造成广告主没有钱了,但是广告仍在播放。

同时侧重“高并发读写”的系统

  • 场景1:秒杀系统
  • 场景2: 12306网站的火车售卖
  • 场景3:支付系统和微信红包。 用户需要实时查看自己的余额,这个值需要实时并且准确;另外,在转账场景,A /B两个用户余额变动也要尽可能快,并且要求强一致性。
  • 场景4:IM、微博、朋友圈。 C端用户要进行发消息和接受消息。这种用户规模在亿级别,无论读还是写,要求处理都要非常及时。

高并发读策略

本质:以空间换时间

高并发读的特征:读写分析,设计出是和高并发读的存储结构或者数据模型。

高并发写策略

海量数据存储方式选择

        存储系统(数据结构),往往决定了系统的上限;计算⽅式(算法)决定了能否发挥这个上限以及系统的下限。

选择时考虑的因素

1. 在线业务系统 or 分析系统

2. 数据量:存量和增量,对未来数据量可以考虑两三年的业务量

  • 1GB以下:任意存储
  • 1~10GB(1亿内):单机存储系统的处理上限
  • 10GB以上:分布式存储
  • TB : ⼀般需要事先对数据做聚合计算

3.成本:运维成本、学习成本

分析类系统常用的存储方式

  • 一些列式数据库,比如Hbase、Cassandra、ClickHouse 等
  • ES, 为搜索⽽⽣的存储产品

        当数据量级超过TB 级的时候,做数据统计分析,⽆论使⽤哪种存储系统,速度都快不了,这⾥的性能瓶颈主要在于磁盘IO和⽹络带宽。这么⼤量级的数据,⼀般是选择存储在HDFS中,配合Spark、 Hive等⼤数据⽣态圈产品,对数据进⾏聚合和计算。

Hadoop:是一个分布式计算的开源框架

HDFS:是Hadoop的三大核心组件之一

Hive:用户处理存储在HDFS中的数据,hive的意义就是把好写的hive的sql转换为复杂难写的map-reduce程序。

Hbase:是一款基于HDFS的数据库,是一种NoSQL数据库,主要适用于海量明细数据(十亿、百亿)的随机实时查询,如日志明细、交易清单、轨迹行为等。

RocksDB

        RocksDB是Facebook开源的⼀个⾼性能、持久化的KV存储引擎。简单理解成单机版的Redis.

        Redis只是⼀个内存数据库,并不是⼀个可靠的存储引擎。在 Redis 中,数据写到内存中就算成功了,其并不能保证将数据安全地保存到磁盘上。⽽ RocksDB则是⼀个持久化的KV存储引擎,它需要保证每条数据都已安全地写到磁盘上。

        RocksDB采⽤了⼀个⾮常复杂的数据存储结构(数据结构LSM-Tree),采⽤了内存和磁盘混合存储的⽅式,它使⽤磁盘来保证数据的可靠存储的,并且会利⽤速度更快的内存来提升读写性能

  • MemTable(内存)有⼀个固定的上限⼤⼩,⼀般是32MB; SSTable容量也是有限的。
  • Log : 顺序写磁盘,对应的磁盘WAL日志。唯⼀作⽤就是从故障中恢复系统数据
  • 有⼀个后台线程,不停地把 ImmutableMemTable复制到磁盘⽂件中,然后释放内存空间

  • 写入:MemTable(有序表) ->Immutable MemTable(不允许再写) ->磁盘文件(SSTable)-> 合并到下一层(并删除已合并的SSTable)

  • 查找:分层查找。MemTable/Immutable MemTable -> SSTable -> 下一层SSTable

ES检索

        ElasticSearch(简称ES)是一个分布式、RESTful 风格的搜索和数据分析引擎,是用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,稳定,可靠,快速,安装使用方便。客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。

应用场景

  • 站内搜索
  • 日志管理与分析
  • 大数据分析
  • 应用性能监控
  • 机器学习

站内检索使用步骤

1. 确定业务检索内容

        比如,商城首页,根据关键字查询、根据品牌查询、商品类别、商品属性信息、价格区间、是否有库存、排序(销量、价格、上架时间等)

2. 文档建模

  • 确定要做分词的字段,分词器
  • 确定keyword(不需要分词)
  • 商户与属性的关联关系

3. 定义mapping, 创建索引库

4. 索引文档(检索文档)

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

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

相关文章

RabbitMQ面试精讲 Day 9:优先级队列与惰性队列

【RabbitMQ面试精讲 Day 9】优先级队列与惰性队列 文章标签 RabbitMQ,优先级队列,惰性队列,消息队列,面试技巧,系统架构 文章简述 本文是"RabbitMQ面试精讲"系列第9天,深入解析优先级队列与惰性队列的实现原理与实战应用。文章详细讲解优先级队列的排…

[硬件电路-121]:模拟电路 - 信号处理电路 - 模拟电路中常见的难题

模拟电路设计是电子工程中极具挑战性的领域,其核心难题源于信号的连续性、元件的非理想特性以及环境干扰的复杂性。以下是模拟电路中常见的难题及其技术本质与解决方案:1. 噪声与干扰:信号的“隐形杀手”技术本质:模拟信号对微小电…

Java 大视界 -- Java 大数据在智能交通智能停车诱导与车位共享优化中的应用(381)

Java 大视界 -- Java 大数据在智能交通智能停车诱导与车位共享优化中的应用(381)引言:正文:一、智能停车的 “老大难”:不只是 “车位少” 那么简单1.1 车主与车位的 “错位困境”1.1.1 信息滞后的 “睁眼瞎”1.1.2 车…

基于落霞归雁思维框架的自动化测试实践与探索

基于落霞归雁思维框架的自动化测试实践与探索 在当今快速发展的软件开发领域,自动化测试已成为提高软件质量和开发效率的关键环节。本文将结合落霞归雁的思维框架——“观察现象 → 找规律 → 应用规律 → 实践验证”,探讨如何将其应用于自动化测试领域&…

Unity Shader编程进阶:掌握高阶渲染技术 C# 实战案例

Unity Shader编程完全入门指南:从零到实战 C# 本文将深入探讨Unity Shader编程的高级技术,包括自定义光照模型、后处理效果、GPU实例化、表面着色器深度应用等,帮助开发者提升渲染效果与性能优化能力。 提示:内容纯个人编写&#…

(论文速读)Text-IF:基于语义文本引导的退化感知交互式图像融合方法

论文信息论文题目:Text-IF: Leveraging Semantic Text Guidance for Degradation-Aware and Interactive Image Fusion(Text-IF:利用语义文本指导退化感知和交互式图像融合)会议:CVPR2024摘要:图像融合的目的是将不同源…

python创建一个excel文件

以下是使用Python根据指定名称创建Excel文件的两种实现方法,根据需求选择适合的方案:方法一:使用pandas库(适合结构化数据) # 安装依赖(命令行执行) # pip install pandas openpyxlimport panda…

C++高频知识点(十四)

文章目录66. 程序什么时候应该使用多线程,什么时候单线程效率高?67. 死锁的原因和避免死锁的避免预防死锁:破坏持有并等待条件68. TCP拥塞控制四个阶段轮换过程描述69. C的内存管理70. 构造函数可以是虚函数吗,析构函数呢66. 程序…

浅窥Claude-Prompting for Agents的Talk

Prompting for Agents先说一句:颜值这么高,你俩要出道啊。此图基本就是claude倡导的agent prompt结构了,可以看到经过一年时间的演变,基本都是follow这个结构去写prompt。我比较喜欢用Role→react→task→histroy→few shot→rule…

【MySQL04】:基础查询

MySQL的基本查询表的增删查改 insert(插入) insert [info] table_name [(colume, [,colume] ...)] values (value_list) ...对于value_list我们通过,作为分隔符 插入替换我们使用on duplicate key update, 表示如果存在主键冲突, 会进行更新, 这个字段后面还有写更新的字段repl…

NGINX反向代理golang后端服务

nginx配置参考(/etc/nginx/sites-available路径下创建配置文件) server {listen 80; # 监听80端口server_name ip; # 你的域名或IPlocation / {root /var/www/test_page/;index index.html; # 默认文件try_files $uri $uri/ /index.html; # 单页…

【秋招笔试】2025.08.03虾皮秋招笔试-第二题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 02. 城市规划的连通网络 问题描述 A先生是一名城市规划师,他负责设计一个智能城市的通信网络。城市被划分为一个 n m n \times m n

JVM 01 运行区域

Java 虚拟机 跨平台 虚拟机隐藏平台差异,解决不同平台代码运行结果不一致问题,实现Write Once, Run Anywhere,实现用户代码跨平台。它本身是一个操作系统上的应用程序,将字节码文件翻译成特定机器的机器码。 Java 虚拟机 运行时内…

[学习笔记-AI基础篇]03_Transfommer与GPT架构学习

介绍GPT-1,GPT-2,GPT-3,GPT-4 GPT-1 介绍2018年6月,OpenAI公司发表了论文"|mproving Language Understanding by Generative Pre-training”《用生成式预训练提高模型的语言理解力》,推出了具有1.17亿个参数的GPT-1(Generative Pre-trainingTransformers,生成式预训练变换…

HPNetworkCheckControl.dll HPEnvRes.dll hpcasl.dll HpBwcDecode.dll HpBlogic.dll hpbhilxres.dll

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

飞算 JavaAI:给需求分析装上 “智能大脑“

在软件开发的漫长旅途中,需求分析是至关重要的起点,其精准度与效率直接关乎整个项目的成败。传统的需求分析依赖人工梳理,不仅耗费大量时间与精力,还时常出现理解偏差和逻辑漏洞。而飞算 JavaAI 的横空出世,犹如为需求…

javacc学习笔记 01、JavaCC本地安装与测试

文章目录前言本章节源码一、什么是javacc二、Mac环境安装javacc三、javacc测试案例1、编写词法描述文件2、借助javacc命令来处理demo01.jj文件3、idea配置输入参数,运行Adder类方法四、javacc文件编译类描述4.1、demo1.jj文件生成内容描述&解析转换过程4.2、解析…

Java基础-stream流的使用

目录 案例要求: 实现思路: 代码: 总结: 案例要求: 实现思路: 创建一个包含学生姓名(String)和选择地址变量(集合)的实体类,然后将题干数据封装到集合,然后进行stream操作 代码: import ja…

virtualbox+UBuntu20.04+内存磁盘扩容

写在前面:1.由于我写博客都是偏向个人笔记性质的,所以写的比较粗糙,如果有疑问私信评论我即可。2.这篇博客的解决方法应该算是“全网”首发吧,因为我为了磁盘扩容真的找了好多相关资料,但是基本都没有用。如果你也是找…

关于对Spring的理解,以及对spring中的两大核心概念AOP和IOC的理解

我们先来说一说Spring,从总体上Spring就是一个基础框架,同时Spring给我们提供了一个Bean容器,用来装载和管理具体的Bean对象,你像我们之前创建对象的时候就是通过new关键字来实现的,但是现在我们只需要告诉容器有哪些对…