ClickHouse 的架构设计(二)
ClickHouse 的架构设计、安装方式以及连接工具(二)
Column 与 FieldColumn 和 Field 是 ClickHouse 中最基础的映射单元,作为一款百分百的列式存储数据库,ClickHouse 按列存储数据,内存中的一个列就用一个 Column 对象表示。Column 对象分为接口和实现两个部分,在 IColumn 接口对象中,定义了对数据进行各种关系运算的方法,例如插入数据的 insertRangeFrom 方法和 insertFrom 方法,用于分页的 cut,以及用于数据过滤的 filter 方法等等。而这些方法的具体实现对象则根据数据类型的不同,由不同的对象实现,例如:ColumnString、ColumnArray 和 ColumnTuple 等等。在大部分场景中,ClickHouse 都会以整列的方式操作数据,但凡事也有例外,如果需要操作单个具体的值(也就是单列中的一行数据),则需要使用 Field 对象。Field 对象代表一个单值,与 Column 对象的泛化设计思路不同,Field 对象使用了聚合的设计模式。在 ...
Bean注入的四种方式
Bean注入的四种方式xml 方式依稀记得最早接触Spring的时候,用的还是SSH框架,不知道大家对这个还有印象吗?所有的bean的注入得依靠xml文件来完成。
它的注入方式分为:set方法注入、构造方法注入、字段注入,而注入类型分为值类型注入(8种基本数据类型)和引用类型注入(将依赖对象注入)。
以下是set方法注入的简单样例
123<bean name="teacher" class="cn.vipwen.domain.Teacher"> <property name="name" value="vipwen"></property></bean>
对应的实体类代码
12345678public class Teacher { private String name; public void setName(String name) { this.name = name; }} ...
ClickHouse 的基本介绍(一)
ClickHouse 的基本介绍(一)
楔子
最近公司决定采用 ClickHouse 来做数据的大规模处理,关于 ClickHouse 虽然早有耳闻,但因为时间原因并没有专门去学习。而公司也考虑到目前内部具有 ClickHouse 使用经验的人还不是很多,因此给了相对比较充足的时间去了解。虽然 ClickHouse 诞生于 2016 年,但相对于 Hadoop 生态圈而言,普及度显然还没有那么广,因此除了官网之外还没有看到比较合适的教程。不过幸运的是在京东上面发现了一本关于 ClickHouse 的书,叫《ClickHouse 原理解析与应用实践》,由朱凯老师编写,据悉这是第一本讲解 ClickHouse 的书。看了一下目录,感觉内容还是比较充实的,于是果断买下来,用于学习。
因此本文很多内容均来自于此书,只不过书中的 ClickHouse 版本有些低了(ClickHouse 的发布频率还是挺快的),这里采用了一个比较新的版本,因此安装时的细节会有些不同。那么下面就开始 ClickHouse 的学习之旅吧,看看 ClickHouse 究竟是何方神圣,为何能够 ...
spring事务的传播行为
一、多个事务方法相互调用时,事务如何在这些方法间传播方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响,同时方法A的事务对方法B的事务执行也有影响,这种影响具体是什么就由两个方法所定义的事务传播类型所决定。
REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。举例说明:如果方法A所在的方法里面的sql没有事务,那么就会与方法B里面的sql事务放在一起,要么同时成功,要么同时失败。如果方法A所在的方法里面的sql有事务,那么方法B所在的方法里面的sql就会加入方法A的sql的事务,要么同时成功,要么同时失败。
SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行。举例说明:如果方法A所在的方法里面的sql有事务,那么方法B里面的sql则会加入方法A的事务,要么同时成功,要么同时失败。如果方法A所在的方法里面的sql没有事务,那么方法B所在的方法里面的sql就会以非事务运行。
MANDATORY:当前存在事 ...
zookeeper自己实现分布式锁
在一些并发请求的时候,需要保证数据的准确性,在同一时刻只能允许一个请求对同一条数据进行修改操作。在之前的单机应用当中,很容易想到利用jdk的锁来实现,例如 synchronized或者lock 。但是在如今业务复杂的分布式系统中jdk的锁并不适用,所以必须要要用分布式锁。
常见的几种分布式锁的实现方案,Redis、Mysql 、zookeeper;
本文主要讲的是如何使用zk实现分布式锁:
ZooKeeper是一个开源的分布式协调服务,他为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名空间服务,配置服务和分布式锁等分布式基础服务。
ZooKeeper的数据模型是内存中的一个ZNode数,由斜杠(/)进行分割的路径,就是一个ZNode,每个ZNode上除了保存自己的数据内容,还保存一系列属性信息。
ZooKeeper中的数据节点分为两种:持久节点和临时节点。所谓的持久节点是指一旦这个ZNode创建成功,除非主动进行ZNode的移除操作,节点会一直保存在ZooKeeper上;而临时节点的生命周期是跟客户端的(Session)会话相关联的,一 ...
SQL优化万能公式:5 大步骤 + 10 个案例
1、前言在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈。
2、SQL优化一般步骤1、通过慢查日志等定位那些执行效率较低的SQL语句
2、explain 分析SQL的执行计划
需要重点关注type、rows、filtered、extra。
type由上至下,效率越来越高
ALL 全表扫描
index 索引全扫描
range 索引范围扫描,常用语<,<=,>=,between,in等操作
ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null MySQL不访问任何表或索引,直接返回结果
虽然上至下,效率越来越高,但是根据cost模型,假设有两个索引idx1(a, b, c),idx2(a, c),S ...
springboot+mybatis_plus实现读写分离
1、引言读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。
因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离;第二种是应用程序自己去做分离。这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP
然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源,必然改配置,并重启应用。当然,好处就是相对简单。
1.1项目地址git-hub:https://github.com/wenlinshan/wenlinshan/tree/main/master-slave-demo
2、AbstractRoutingDataSource基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。
3、实践3.1. maven依赖123456789 ...
分享一篇文章-神奇的 SQL 之别样的写法
神奇的 SQL 之别样的写法 → 行行比较 本文链接:cnblogs.com/youzhibing/p/15101096.html
环境准备 数据库版本: MySQL 5.7.20-log
建表 SQL
1234567891011121314151617181920DROP TABLE IF EXISTS `t_ware_sale_statistics`;CREATE TABLE `t_ware_sale_statistics` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `business_id` bigint(20) NOT NULL COMMENT '业务机构编码', `ware_inside_code` bigint(20) NOT NULL COMMENT '商品自编码', `weight_sale_cnt_day` double(16,4) DEFAU ...
hashmap底层数据结构
一、HashMap简介1、它是一个通过Map接口实现的一个双列集合,主要是以键值对的方式进行存储,每一个键值对都有一个键和一个值。
2、每一个键都是唯一的,值可以重复,后面添加的键会覆盖前面相同的键。
3、HashMap存储结构采用的是哈希表的结构,元素的存储顺序不能保存一致,如果键是自定义的对象的话,需要重写hashcode方法与equals方法,才能保证键的唯一。
二、HashMap存储的原理1、版本区别jdk8以前:
在jdk1.7中,首先是把元素放在一个个数组里面,后来存放的数据元素越来越多,于是就出现了链表,对于数组中的每一个元素,都可以有一条链表来存储元素。这就是有名的“拉链式”存储方法。
jdk8以后:
由于存储的元素越来越多,链表也越来越长,在查找一个元素时候效率不仅没有提高(链表不适合查找,适合增删),反倒是下降了不少,于是就对这条链表进行了一个改进。如何改进呢?就是把这条链表变成一个适合查找的树形结构,没错就是红黑树。值得注意的是,因为需要为了退化成链表和遍历做准备,这个红黑树并不是纯红黑树,而是红黑树和双向链表的叠加结构。
2、存储的流程
三、HashMap数据 ...
深入理解Redis
一、redis的基本概念redis是一个内存数据库
1、NOSQL即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。
2、主要作用(1)为热点数据加速查询(主要场景)。如热点商品、热点新闻、热点资讯、推广类等高访问量信息等。
(2)即时信息查询。如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等。
(3)时效性信息控制。如验证码控制、投票控制等。
(4)分布式数据共享。如分布式集群架构中的 session 分离消息队列。
二、redis基本数据类型(value的数据类型)1、String以key-value的方式进行存储
2、hash
3、list
4、setset类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
5、zset三、Jedis
1、基于连接池的连接JedisPool:Jedis提供的连接池技术
poolConfig:连接池配置对象
host:redis服务地址
port:redis服务端口号
创建jedis的配置文件:jedis.properties
1234je ...