- 博客(31)
- 收藏
- 关注
原创 关于MongoDB使用的优化总结
在画像平台人群圈选模块中,人群包的计算和存储是在CilckHouse引擎中完成的。但是基于CilckHouse在并发查询、集群压力方面的考虑,在数据输出模块中,并不是直接从CilckHouse中查询获取数据,而是在人群包数据计算完成后,通过数据同步模块将数据从CilckHouse同步到MongoDB中。MongoDB作为数据输出模块的底层数据存储和查询引擎,需要满足高效的数据写入和读取性能。同时人群包并不必保存全部的历史数据,mongoDB中只需保留最近N个版本的人群包数据即可,所以为了删除无效数据,还需要
2021-11-03 11:26:04
1505
1
原创 因文件流没有关闭而引发的报警
某天一个运行很久没有出问题的服务报警了,查看日志是如下错误,赶紧排查,搜索“java.io.IOException: error=24, Too many open files”,找到类似的这篇文章(https://blog.youkuaiyun.com/imliuqun123/article/details/103925527),通过“lsof -p Pid | wc -l” 查看了进程打开的文件总数,使用“ulimit -a”命令查看了系统的限制是多少。发现确实是超了。通过“lsof -p Pid”
2021-08-15 18:53:14
679
原创 web应用学习_SpringBoot内嵌Tomcat启动
/spring-boot-2.1.9.RELEASE.jar!/org/springframework/boot/SpringApplication.class /** * Run the Spring application, creating and refreshing a new * {@link ApplicationContext}. * @param args the application arguments (usually passed from a Java main
2021-06-01 11:00:30
654
原创 web 请求处理过程
1、/tomcat-embed-core-9.0.26.jar!/javax/servlet/http/HttpServlet.class类的public service()方法,Dispatches client requests to the protected servicemethod. There's no need to override this method。将ServletRequest/ServletResponse 转成 HttpServletRequest/HttpS...
2021-06-01 11:00:05
276
1
原创 web应用学习_Spring Boot外置Tomcat启动
Spring只是一个框架,用来简化开发。如果是web应用,则涉及到servlet、servlet容器等等,可以使用Spring MVC框架快速开发,需要将web应用部署到Tomcat中进而提供服务(当然Tomcat也是跑在JVM上的)。如果不是是web应用,肯定不涉及Tomcat和Spring MVC等web框架,但是可以有Spring框架来处理bean之间的依赖关系等等,应用应该是直接跑在JVM上的。----------------------------------------在w.
2021-05-31 21:20:44
444
1
原创 Spring Web项目
使用Spring MVC搭建了web项目(~/IdeaProjects/Beautiful1205/test-springmvc/springmvctest,有时间上传至github)后,我们来探索一下原理...一、Spring MVC 与 Spring BootSpring MVC提供了一种轻度耦合的方式来开发web应用。它是Spring的一个模块,是一个web框架。通过DispatcherServlet, ModelAndView 和 ViewResolver,开发web应用变得很容易。Sp
2021-05-16 20:15:18
679
2
原创 web应用知识点串讲
一、前言工作后一直使用springboot,但想想对框架的理解好像仅停留在了表面,内心有点不安。就把最近这段时间看的web应用/Servlet/Tomcat/Spring框架相关的知识点做一个简单的整理,尽量做到知其然也知其所以然,把一些知识点都能够串起来。部分内容摘抄自网络,详情见原址。二、web应用Web是万维网(WWW,World Wide Web)的俗称,它是一个体系结构框架。Web是由大量分布在全球范围的内容组成的,这些内容是以web页面的形式表示的。web页面又分为静态页面和动态页面
2021-05-16 18:37:56
213
3
原创 如何批量获取redis数据呢?
背景redis作为我们接口开发中的首选缓存,当从redis中每次获取一个key的value时,接口响应时间上一般是没啥问题的,但是当需要获取多个key的value时,一般需要使用mget等批量获取的方法。但是当value是以压缩格式写入到redis中的时候,还可以直接套用原来的方法吗?最近在一个接口的开发过程中遇到了这个问题,特此记录下解决方法。先复习下redis、jedis和redisTemplate之间的关系:Redis是用ANSI C写的一个基于内存的Key-Value数据库,而Jedis是R
2020-10-18 23:59:37
7570
3
原创 Spring Boot整合Redis出现乱码解决方案
一、背景使用Spring Boot整合Redis,将数据保存到redis后,登陆redis客户端,发现redis key前面多了一串乱码字符\xac\xed\x00\x05t\x00\x17(具体图片就不贴了,类似的图片网上有很多),排查发现是因为spring-data-redis中redisTemplate默认使用JDK的序列化策略JdkSerializationRedisSerializer,通过设置redisTemplate的序列化策略为StringRedisSerializer后,乱码key的问
2020-06-25 23:26:05
1335
1
原创 ClickHouse源码阅读(0001 0000) —— CK Server对SQL的处理(INSERT SQL - 2)
这篇文章主要介绍的是对于INSERT SQL,执行器interpreter调用execute()方法构造block 流的过程,对于具体的写入数据过程,在TCPHandler::processInsertQuery() 方法中,今天来具体分析下:先看下带注释的代码: void TCPHandler::processInsertQuery(const Settings &global_settings) { /** Made above the rest of the l
2020-06-21 15:07:22
550
原创 ClickHouse源码阅读(0000 1111) —— ClickHouse中的bitmap实现
项目中使用到了ClickHouse的bimtap结构,来分析下ClickHouse中bimtap的具体实现。ClickHouse中bitmap结构的类型为 AggregateFunction(groupBitmap, UInt32),对应如下源码: template<typename T> struct AggregateFunctionGroupBitmapData { RoaringBitmapWithSmallSet<T, 32>
2020-06-06 17:27:33
2352
1
原创 ClickHouse源码阅读(0000 1110) —— ClickHouse是如何读写数据的(readStringBinary和writeStringBinary方法解析)
还是先看写string的方法: writeStringBinary((DBMS_NAME " ") + client_name, *out);//将"ClickHouse client"写到out中即把字符串‘ClickHouse client’写到out中。inline void writeStringBinary(const std::string & s, WriteBuffer & buf){ //向Buffer中写入字符串 //1.
2020-05-11 23:10:11
808
原创 ClickHouse源码阅读(0000 1101) —— ClickHouse是如何读写数据的(readVarUInt和writeVarUInt方法解析)
先说写数据的方法,再说读数据的方法,知道怎么写,才知道怎么读。写数据:写一个数值型的数字:再Client端向Server端发起连接时,会写一个客户端的版本信息,客户端是怎么写的呢?源码如下: writeVarUInt(ClickHouseRevision::get(), *out); //将"54420"写到out中(最终会用\x94\a9\03表示数字8)即把ClickHouseRevision::get()的结果54420写到out中。/**举例.
2020-05-11 23:09:56
883
1
原创 ClickHouse源码阅读(0000 1100) —— TCPHandler.cpp中的in和out分析
分析一下TCPHandler.cpp中的in和out两个(私有的)成员变量, /// Streams for reading/writing from/to client connection socket. std::shared_ptr<ReadBuffer> in;//从客户端读取的数据 std::shared_ptr<WriteBuffer> out;//要写到客户端的数据在runImpl()方法中,从这里开始:
2020-05-11 22:08:18
615
原创 ClickHouse源码阅读(0000 1011) —— ClickHouse Client端如何接收Server端发送回来的数据
在这篇文章中提到:client端对于非INSERT语句,processOrdinaryQuery()方法的代码如下: /// Process the query that doesn't require transferring data blocks to the server. void processOrdinaryQuery() { ...
2020-05-04 23:55:41
1463
原创 mac OS 系统关于terminal的学习
在mac OS系统上,每次新开一个terminal窗口,都会显示Last login: Mon May 4 15:19:22 on ttys00x类似这样的提示,大概看了下tty命令,记录一下:主要参考:1)https://www.runoob.com/linux/linux-comm-tty.html2)https://cloud.tencent.com/developer/art...
2020-05-04 15:43:18
1177
1
原创 ClickHouse源码阅读(0000 1010) —— CK Server对SQL的处理(INSERT SQL)
在上篇文章中提到:执行器interpreter调用execute()方法执行, 返回BlockIO (block streams), 这一步就是根据不同的SQL类型去构建block streams了。今天具体针对INSERT SQL的execute()方法来分析一下:直接看一下InterpreterInsertQuery.cpp中的execute()方法:BlockIO Interpre...
2020-05-02 23:32:45
722
原创 ClickHouse源码阅读(0000 1001) —— CK Server对SQL的处理
在上篇文章中提到:服务端*Handler接收到client端SQL后会进行处理,今天具体来分析一下处理过程。会介绍一下大概的处理流程。以TCPHandler为例:dbms/programs/server/TCPHandler.cpp文件中包含run()方法,调用runImpl()方法,包含注释的代码如下:void TCPHandler::runImpl() { setTh...
2020-05-01 22:02:25
1358
原创 ClickHouse源码阅读(0000 1000) —— PREWHERE optimization
看SQL的执行日志的时候经常会出现这样一条日志如下图,今天来结合源码分析一下:1、PREWHERE 关键字介绍PREWHERE ClauseThis clause has the same meaning as the WHERE clause. The difference is in which data is read from the table. When usin...
2020-02-09 15:40:40
1527
原创 Java中【年(year)和周年(week year)】的区别
在将日期格式化的时候,不注意的话代码中可能同时存在“yyyy-MM-dd”和“YYYY-MM-dd”两种格式,date格式为“YYYY-MM-dd”表示的是周年,date格式为“yyyy-MM-dd”表示的是年。这两种格式是的功能是完全一样的吗?先上代码测试一下:import java.text.SimpleDateFormat;import java.time.LocalDate...
2019-12-31 17:54:32
5417
原创 ClickHouse源码阅读(0000 0111) —— 使用ReplicatedMergeTree引擎时的副本选择问题--对远程副本的选择
前一篇文章已经讲到对于没有使用表函数的情况,pool->getManyChecked()这个方法是重点。对于这个方法的返回值可以看一下,TryResult的定义如下: struct TryResult { TryResult() = default; explicit TryResult(Entry entry_) ...
2019-12-25 18:13:08
1428
原创 ClickHouse源码阅读(0000 0110) —— 使用ReplicatedMergeTree引擎时的副本选择问题
在使用ReplicatedMergeTree引擎和Distributed引擎的时候,对于同一张表,服务器上存在多个副本,在查询数据的时候,是如何在这些副本之间进行选择的呢?结合源码来试着分析一下...对于一条SELECT SQL,从以下方法开始:pipeline.streams = storage->read(required_columns, query_info, contex...
2019-12-25 17:16:17
1117
原创 ClickHouse源码阅读(0000 0101) —— ReplicatedMergeTree存储引擎
/** The engine that uses the merge tree (see MergeTreeData) and replicated through ZooKeeper.ReplicatedMergeTree引擎使用MergeTree存储数据,通过ZooKeeper协调保存副本数据。 * ZooKeeper is used for the following things...
2019-12-24 20:47:18
696
原创 ClickHouse源码阅读(0000 0100) —— ClickHouse是如何执行SQL的
继续上篇文章的思路来分析,先说process()方法,简化代码如下:bool process(const String &text) { const bool test_mode = config().has("testmode"); //`--multiquery, -n` – 如果指定, 允许处理用逗号分隔的多个查询, 只在非交互模...
2019-12-14 11:51:00
1584
原创 ClickHouse源码阅读(0000 0011) —— ClickHouse Client启动和终止过程分析
在Mac OS系统上,命令行终端切换到/Users/***/ClionProjects/Beautiful1205/ClickHouse/cmake-build-debug/dbms/programs目录下,执行以下命令:./clickhouse client --port=9000则通过TCP连接与Server端建立连接,Client端打印如下日志:ClickHouse源码阅...
2019-12-13 23:58:33
1218
原创 ClickHouse源码阅读(0000 0001) —— main.cpp分析
C++项目在启动时都是从main()方法开始执行的。今天来分析一下ClickHouse源码的main.cpp。先找到main()方法:int main(int argc_, char **argv_) { /// Reset new handler to default (that throws std::bad_alloc) /// It is needed becau...
2019-12-13 23:04:08
991
原创 ClickHouse源码阅读(0000 0010) —— 根据日志分析ClickHouse Server启动和终止过程
在Mac OS系统的CLion中启动ClickHouse Server,启动过程日志和终止过程日志如下:/Users/***/ClionProjects/Beautiful1205/ClickHouse/cmake-build-debug/dbms/programs/clickhouse server --config-file /Users/***/ClionProjects/Beauti...
2019-12-01 16:37:16
2016
原创 ClickHouse源码阅读(0000 0000) —— Overview of ClickHouse Architecture
注意:暂未翻译完,慢慢翻译20191212翻译了执行器部分;-----------------------------------------本文由官方文档翻译而来,英文原文详见Overview of ClickHouse ArchitectureClickHouse is a true column-oriented DBMS. Data is stored by columns...
2019-12-01 15:03:00
1513
原创 Mac下Java的native方法以及JNI调用C++语言
JNI的生成步骤——Mac版(参考资料)编写带有native声明的方法的java类,生成.java文件 使用javac命令编译所编写的java类,生成.class文件 使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件 使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法 将C/C++编写的文件生成...
2019-09-07 11:59:20
576
1
原创 联想Y500 UEFI+GPT win10安装ubuntu双系统
前期准备工作:查看电脑硬盘格式; 了解怎么进入电脑的bios模式;(一般有UEFI和Legacy两种模式,具体可以去了解一下)制作U盘启动盘:下载ubuntu安装镜像文件,使用rufus制作启动盘(之前用的软蝶通,结果失败了) 给电脑分区,过程为:计算机,右键->管理->磁盘管理->找一个大的硬盘,右键压缩卷,输入大小即可。(这个过程网上教程还比较靠谱)安装ubu...
2019-03-03 11:08:17
1469
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人