摘要:因为是高操作,所以线程池大小最好为数量的倍。柔性判断,如果插入延迟过高,或者插入数据库线程过多,都会引起系统异常。
一 业务场景
公司年终要办一个抢购活动,抢购活动维护有一份名单(txt文件),只有名单中的用户可以参加抢购活动,所以需要把名单导入到内存数据库中,以便于检验用户是否有资格。
原先的设计分为两步,第一步先把文件导入到数据库中,而后第二步操作将数据库中的数据同步到redis中。
二 存在问题当数据n百万的时候是能够满足需求的,但是当这个白名单数量到达n千万的时候,第二步基本就无法操作了,从数据库中同步到redis,即使分页每次都要一个全表扫描(因为没做索引,而且即使有索引也只能有限的提高),速度非常慢,要1-2小时。
三 解决方案在第一步同步到数据库中时,需要对每一行的txt进行扫描,进行一些业务处理,然后存入白名单数据表,而这一步的时候完全就可以存入redis了,所以删除第二步,在入库的同时存入到redis即可。将时间减少了1-2小时
四 优化后来细思下,数据为何要存到数据库中?存到数据库中是为了什么呢?难道是为了校验?1500W数据你要校验到什么时候,而且假设存到数据库丢数据了,哪又如何来校验呢?所以,最好的方法是直接用文件存储。
文件存储有个问题是还需要挂载另外一个文件盘,带来系统运维的复杂性。那么,干脆直接用源文件,直接做插入即可。
五 分块插入首先将文件进行分块,将分块后的文件发送到各个微服务。文件上传时会直接读到内存,如果虚拟机的分配的内存不够,服务会崩溃掉,所以如果1500w文件直接上传,要么将java虚拟机空间设置的足够大,要么在前端就进行分片。
每个微服务再分线程进行处理。因为是高IO操作,所以线程池大小最好为CPU数量的2倍。
柔性判断,如果插入redis延迟过高,或者插入数据库线程过多,都会引起系统异常。这里可以用Guava的retry包来判断线程的返回值,如果返回值是延迟过高或者线程过多,均啥都不做,直接返回,否则进行redis或者数据库操作。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71151.html
摘要:月日,正式发布版。性能方面重点优化了负载均衡调度策略和流程。另外的速度也得到显著的提升。于年月在创建,同年月发布版本,而后于年月发布版,月发布版,并在年月发布版。 6 月 16 日,TiDB 正式发布 RC3 版。该版本对 MySQL 兼容性、SQL 优化器、系统稳定性、性能做了大量的工作。性能方面重点优化了负载均衡调度策略和流程。功能方面进一步完善权限管理功能,用户可以按照 MyS...
摘要:特点有聚合运算相关算法,时序数据库相对于关系型数据库没有特别复杂的查询,最常见的使用类型是宽表使用,在此基础上做一些聚合算法插值查询。 首先简单介绍一下网易杭州研究院情况简介,如下图所示: showImg(https://segmentfault.com/img/bVbni6K?w=720&h=285); 我们公司主要从事平台技术开发和建设方面,工作的重点方向主要在解决用户在数据治理中...
阅读 1841·2023-04-25 14:28
阅读 1873·2021-11-19 09:40
阅读 2777·2021-11-17 09:33
阅读 1359·2021-11-02 14:48
阅读 1691·2019-08-29 16:36
阅读 3281·2019-08-29 16:09
阅读 2898·2019-08-29 14:17
阅读 2356·2019-08-29 14:07