0%

Phoenix创建索引源码过程

org.apache.phoenix.index.IndexMaintainer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public byte[] buildRowKey(ValueGetter valueGetter, ImmutableBytesWritable rowKeyPtr, byte[] regionStartKey, byte[] regionEndKey, long ts)  {
ImmutableBytesWritable ptr = new ImmutableBytesWritable();

//判断是否是构建本地索引,考虑两个条件:1.本地索引是否开启 2.startRK 是否传进来了
boolean prependRegionStartKey = isLocalIndex && regionStartKey != null;
boolean isIndexSalted = !isLocalIndex && nIndexSaltBuckets > 0;

//如果开启本地索引,则在数据前面添加前缀,判断startRK是否是region起始startRK,如果是则使用该region的EndRK
int prefixKeyLength =
prependRegionStartKey ? (regionStartKey.length != 0 ? regionStartKey.length
: regionEndKey.length) : 0;
TrustedByteArrayOutputStream stream = new TrustedByteArrayOutputStream(estimatedIndexRowKeyBytes + (prependRegionStartKey ? prefixKeyLength : 0));

// 构建数据流对象,对数据进行put
DataOutput output = new DataOutputStream(stream);
Read more »

Redis

参考网址

1. 概述

Redis的主要功能都基于单线程模型实现,也就是说Redis使用一个线程来服务所有的客户端请求,同时Redis采用了非阻塞式IO,并精细地优化各种命令的算法时间复杂度,这些信息意味着:

  • Redis是线程安全的(因为只有一个线程),其所有操作都是原子的,不会因并发产生数据异常
  • Redis的速度非常快(因为使用非阻塞式IO,且大部分命令的算法时间复杂度都是O(1))
  • 使用高耗时的Redis命令是很危险的,会占用唯一的一个线程的大量处理时间,导致所有的请求都被拖慢。(例如时间复杂度为O(N)的KEYS命令,严格禁止在生产环境中使用)
Read more »

Mac 搭建 Redis 集群

参考文档

摘要

安装docker
brew cask install docker

在设置里选择 Docker Engine,添加国内下载镜像

Read more »

线程一些问题

1. 概述

单线程和多线程 表象化的一种理解:线程就是程序执行的路径,单线程就是只有一条路径,多线程就是多条路径

进程:一个程序装载到内存里,分配好资源如网络等等。是分配资源的最基本单位

线程:程序开始运行,将一条条指令放到cpu里执行。是调度执行的最基本单位

CPU:ALU(算术逻辑单元,负责计算) + Registers(寄存器,存储数据) + PC(计数器,记录执行到哪一条指令,记录指令地址)

Read more »

java.util.function 包

1. Function

接收一个参数,并返回一个结果

2. BiFunction

接收两个参数,并返回一个结果

Read more »