一、概述

(https://hbase.apache.org/)

一、概述
1 HBase是Apache提供的开源的非关系型数据库
2. HBase的底层存储是基于Hadoop,是一个分布式的、可扩展的能存储大
量数据的数据库
3. HBase能够实时读写大量的数据
4. HBase是一个NOSQL (Not Only sQL)的数据库
5. HBase是由Doug带领团队实现的,仿照了Google的<Bigtable: ADistributed Storage system for Structured Data>。也因为HBase是仿照BigTable实现的,所以HBase的原理和BigTable一样,只是BigTable是用c语言实现的,HBase是用Java实现的
7.在HBase中,如果要删除一个表,首先要禁用这个表,禁用之后才能进行删除
8.在HBase中,支持的数据类型就只有string和整数
9.HBase中存储的数据是稀疏的
10.在HBase中,会对添加的每一条数据增加一个字段,这个字段是时间戳
10.在HBase中,会对添加的每一条数据增加一个字段,这个字段是时间戳。在HBase中进行查找的时候,如果不指定默认找的是最新的。这也就意味着HBase中改的能力实际上并不是修改原始数据,而是在文件尾部追加数据,因为获取的是最新的数据,所以看起来像是做了修改-这个时间戳称之为数据的版本VERSION
11.在HBase中,如果不指定,每一个列族只存储1个版本的数据,在获取的时候也只能拿一个版本的数据。也就意味着如果需要获取多个版本的数据,那么在建表的时候就需要指定保留的版本个数

行级别和列级别数据库比较

二、基本概念
1.行键rowkey:类比RDBMS中的主键,在HBase中每一条数据都必须对应一个行键。注意,在放数据的时候,要求行键是唯一的。如果是相同的行键,那么认为是同一条数据。HBase会默认对键进行排序,默认是字典序

2.列族/列簇column family:是HBase中存储数据的基本单位。在HBase中,每一个表中至少包含1个列族。理论上不限制列族的数量,但是实际开发过程中,一般建议列族的数量不要超过3个。一般不建议跨列族查询。
3.列column:在HBase中往往不强调列。一个列族中可以包含0到多个列,而且在使用过程中可以动态的增删列。列的个数是不固定的。
4.名称空间namespace:类比于MySQL中的database的概念。主要的作用是用于进行表的区分。注意,在不指定的情况下,默认使用的名称空间是default
5.单元cell: rowkey+column+timestamp锁定的唯一数据/version锁定唯一数据

hbase下载

https://archive.apache.org/dist/hbase/0.98.17/hbase-0.98.17-hadoop2-bin.tar.gz

解压安装

配置

[root@hadoop01 conf]# vim hbase-env.sh
export JAVA_HOME=/home/presoftware/jdk1.8.0_181
#关闭自带的zk
export HBASE_MANAGES_ZK=false
[root@hadoop01 conf]# source hbase-env.sh
[root@hadoop01 conf]# vim hbase-site.xml
<configuration>
<!--配置hbase在HDFS上的存储路径-->
<property><name>hbase.rootdir</name><value>hdfs://hadoop01:9000/hbase</value>
</property>
<!--开启hbase的分布式-->
<property><name>hbase.cluster.distributed</name><value>true</value>
</property>
<!--#配置Zookeeper的连接地址与端口号-->
<property><name>hbase.zookeeper.quorum</name><value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
[root@hadoop01 conf]# vim regionservers hadoop01
hadoop02
hadoop03

启动三个节点上的zk

拷贝第一台机器上的hbase到其他两台机器上

[root@hadoop01 presoftware]# scp -r  hbase-0.98.17-hadoop2 root@hadoop02:/home/presoftware/[root@hadoop01 presoftware]# scp -r  hbase-0.98.17-hadoop2 root@hadoop03:/home/presoftware/

启动hbase(第一台(zk的leader))

[root@hadoop01 bin]# sh start-hbase.shstarting master, logging to /home/presoftware/hbase-0.98.17-hadoop2/bin/../logs/hbase-root-master-hadoop01.out
hadoop02: starting regionserver, logging to /home/presoftware/hbase-0.98.17-hadoop2/bin/../logs/hbase-root-regionserver-hadoop02.out
hadoop03: starting regionserver, logging to /home/presoftware/hbase-0.98.17-hadoop2/bin/../logs/hbase-root-regionserver-hadoop03.out
hadoop01: starting regionserver, logging to /home/presoftware/hbase-0.98.17-hadoop2/bin/../logs/hbase-root-regionserver-hadoop01.out[root@hadoop01 bin]# jps
4368 QuorumPeerMain
4770 HRegionServer
4643 HMaster

其他两台机器

[root@hadoop02 presoftware]# jps
1577 QuorumPeerMain
1774 Jps
页面访问hbase  地址
192.168.253.129:60010

效果

进入命令行

[root@hadoop01 bin]#sh hbase shell

hbase删除------CTRL+ 删除键
修改配置可以直接删除

基本命令

hbase(main):011:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 2.0000 average load
hbase(main):012:0> version
0.98.17-hadoop2, rd5f8300c082a75ce8edbbe08b66f077e7d663a4a, Fri Jan 15 22:46:43 PST 2016
hbase(main):014:0> whoiam
NameError: undefined local variable or method `whoiam' for #<Object:0x2a2ef072>

建表

hbase(main):015:0> create 'person',{NAME=>'basic'},{NAME=>'info'}
0 row(s) in 4.1870 seconds=> Hbase::Table - person

查看

hbase(main):027:0> list
TABLE
person
1 row(s) in 0.1170 seconds=> ["person"]

查看表结构

hbase(main):029:0> desc 'person'
Table person is ENABLED
person
COLUMN FAMILIES DESCRIPTION
{NAME => 'basic', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KE
EP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COM
PRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6553
6', REPLICATION_SCOPE => '0'}
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEE
P_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMP
RESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536
', REPLICATION_SCOPE => '0'}
2 row(s) in 0.2910 seconds

创建表简写方式

hbase(main):030:0> create 'student','basic','info'
0 row(s) in 1.5010 seconds=> Hbase::Table - student

删除表(报错,需要禁用)

hbase(main):004:0> drop 'student'
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/presoftware/hbase-0.98.17-hadoop2/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/presoftware/hadoop-2.7.1/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.ERROR: Table student is enabled. Disable it first.Here is some help for this command:
Drop the named table. Table must first be disabled:hbase> drop 't1'hbase> drop 'ns1:t1'

正确删除表方式(先禁用)

hbase(main):005:0>
hbase(main):005:0> disable 'student'
0 row(s) in 2.4740 secondshbase(main):006:0> drop 'student'
0 row(s) in 2.2510 secondshbase(main):007:0> 
hbase(main):009:0> exists 'student'
Table student does not exist
0 row(s) in 0.1620 secondshbase(main):011:0> is_enabled 'person'
true
0 row(s) in 0.0790 seconds

新建名称空间

hbase(main):012:0> create_namespace 'hbasedemo'
0 row(s) in 0.6230 seconds
hbase(main):013:0> list_namespace
NAMESPACE
default
hbase
hbasedemo
3 row(s) in 0.1390 seconds
hbase(main):014:0> list_namespace_tables 'default'
TABLE
person
1 row(s) in 0.0960 second

在自定义名称空间下建表

hbase(main):016:0> create 'hbasedemo:person','basic','info'
0 row(s) in 4.7610 seconds=> Hbase::Table - hbasedemo:person

删除名称空间(此名称空间无表才可删除)

hbase(main):017:0> disable 'hbasedemo:person'
0 row(s) in 1.5760 secondshbase(main):018:0> drop 'hbasedemo:person'
0 row(s) in 0.5080 secondshbase(main):019:0> drop_namespace 'hbasedemo'
0 row(s) in 0.4460 seconds

增加数据行键为p1,列族为basic

hbase(main):031:0> put 'person','p1','basic:name','Amy'
0 row(s) in 0.8850 secondshbase(main):032:0> put 'person','p1','basic:age',15
0 row(s) in 0.0920 secondshbase(main):033:0> put 'person','p1','info:addr','beijing'
0 row(s) in 0.2320 seconds
hbase(main):054:0> get 'person', 'p1'
COLUMN                CELL                                                       basic:age            timestamp=1658618923507, value=15                          basic:name           timestamp=1658618824327, value=Amy                         info:addr            timestamp=1658618960873, value=beijing
3 row(s) in 0.1570 seconds
hbase(main):055:0> get 'person', 'p1', {COLUMN => 'basic'}
COLUMN                CELL                                                       basic:age            timestamp=1658618923507, value=15                          basic:name           timestamp=1658618824327, value=Amy
2 row(s) in 0.0440 seconds
hbase(main):056:0> get 'person', 'p1', {COLUMN => 'basic:age'}
COLUMN                CELL                                                       basic:age            timestamp=1658618923507, value=15
1 row(s) in 0.0350 seconds
hbase(main):057:0> get 'person', 'p1', 'basic:age'
COLUMN                CELL                                                       basic:age            timestamp=1658618923507, value=15
1 row(s) in 0.1030 seconds
hbase(main):058:0> get 'person', 'p1', 'basic:name','basic:age','info:addr'
COLUMN                CELL                                                       basic:age            timestamp=1658618923507, value=15                          basic:name           timestamp=1658618824327, value=Amy                         info:addr            timestamp=1658618960873, value=beijing
3 row(s) in 0.0790 seconds
hbase(main):059:0> put 'person','p2','basic:name','Sam'
0 row(s) in 0.4240 secondshbase(main):060:0> get 'person','p2','basic:name'
COLUMN                CELL                                                       basic:name           timestamp=1658619944413, value=Sam
1 row(s) in 0.0470 seconds
hbase(main):061:0> put 'person','p2','basic:gender','male'
0 row(s) in 0.0490 seconds
hbase(main):062:0> put 'person','p2','info:phone',182336698
0 row(s) in 0.0560 seconds

删除命令(删除列族中的某列和整个列族)

hbase(main):063:0> delete 'person','p2','info:phone'
0 row(s) in 0.2670 seconds
hbase(main):064:0> delete 'person','p2','info'
0 row(s) in 0.0360 seconds`在这里插入代码片`

删除行键p2的值

hbase(main):068:0> deleteall 'person','p2'
0 row(s) in 0.2760 seconds

修改列族中的某一列的值

hbase(main):069:0> put 'person','pa','basic:name','Tom'
0 row(s) in 0.2550 seconds

扫描person全表

hbase(main):071:0> scan 'person'
ROW                   COLUMN+CELL                                                p1                   column=basic:age, timestamp=1658618923507, value=15        p1                   column=basic:name, timestamp=1658618824327, value=Amy      p1                   column=info:addr, timestamp=1658618960873, value=beijing   pa                   column=basic:name, timestamp=1658620504909, value=Tom
2 row(s) in 0.3560 seconds
hbase(main):075:0> scan 'person',{COLUMNS=>['basic']}
ROW                   COLUMN+CELL                                                p1                   column=basic:age, timestamp=1658618923507, value=15        p1                   column=basic:name, timestamp=1658618824327, value=Amy      pa                   column=basic:name, timestamp=1658620504909, value=Tom
2 row(s) in 0.2150 seconds
hbase(main):076:0> scan 'person',{COLUMNS=>['basic:name']}
ROW                   COLUMN+CELL                                                p1                   column=basic:name, timestamp=1658618824327, value=Amy      pa                   column=basic:name, timestamp=1658620504909, value=Tom
2 row(s) in 0.1090 seconds

查看最近版本

hbase(main):079:0> get 'person', 'p1', {COLUMN => 'basic:name' , VERSIONS => 3}
COLUMN                CELL                                                       basic:name           timestamp=1658618824327, value=Amy
1 row(s) in 0.1860 seconds

删除person表

hbase(main):002:0> disable 'person'
0 row(s) in 3.9030 secondshbase(main):003:0> drop 'person'
0 row(s) in 2.6050 seconds

创建表(带版本)

hbase(main):004:0> create 'persion',{NAME=>'basic',VERSIONS=>3},{NAME=>'info',VERSIONS=>4}
0 row(s) in 1.6960 seconds
hbase(main):005:0> desc 'persion'
Table persion is ENABLED
persion
COLUMN FAMILIES DESCRIPTION
{NAME => 'basic', BLOOMFILTER => 'ROW', VERSIONS => '3', IN_MEMORY => 'false', KE
EP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COM
PRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6553
6', REPLICATION_SCOPE => '0'}
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '4', IN_MEMORY => 'false', KEE
P_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMP
RESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536
', REPLICATION_SCOPE => '0'}
2 row(s) in 0.2860 seconds
hbase(main):006:0> put 'persion','p1','basic:age',14
0 row(s) in 0.5000 secondshbase(main):007:0> put 'persion','p1','basic:age',15
0 row(s) in 0.0100 secondshbase(main):008:0> put 'persion','p1','basic:age',16
0 row(s) in 0.0490 secondshbase(main):009:0> put 'persion','p1','basic:age',17
hbase(main):011:0> get 'persion','p1',{COLUMN=>'basic:age',VERSIONS=>3}
COLUMN                CELL                                                       basic:age            timestamp=1658654249093, value=17                          basic:age            timestamp=1658654245954, value=16                          basic:age            timestamp=1658654243277, value=15
3 row(s) in 0.0230 seconds

Java操作hbase
首先配置windows本地hosts文件(如果不配置则日志报错,不能识别主机名hadoop01等)

#zookeeper配置地址映射
192.168.253.129 hadoop01
192.168.253.130 hadoop02
192.168.253.131 hadoop03
package cn.hbase;import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.junit.Before;
import org.junit.Test;public class HBaseDemo {Configuration conf;@Beforepublic void connect(){//连接hbase//获取hbase的配置conf=HBaseConfiguration.create();//设置zk的连接地址conf.set("hbase.zookeeper.quorum","192.168.253.129:2181,"+ "192.168.253.130:2181,192.168.253.131:2181");}//建表@Testpublic void createTable() throws Exception{//连接hbase,获取管理权限HBaseAdmin admin=new HBaseAdmin(conf);//创建一个表描述器HTableDescriptor desc=new HTableDescriptor(TableName.valueOf("student"));//创建列描述器HColumnDescriptor f1=new HColumnDescriptor("basic");HColumnDescriptor f2=new HColumnDescriptor("info");//像表中指定列族desc.addFamily(f1);desc.addFamily(f2);//建表admin.createTable(desc);//关流admin.close();}//添加数据@Testpublic void pubData() throws Exception{//获取表HTable table=new HTable(conf, TableName.valueOf("student"));//创建一个put对象//参数表示行键Put put=new Put("s1".getBytes());//family-列族//qualifier-列名//value-值put.add("basic".getBytes(), "id".getBytes(), "s202202".getBytes());put.add("basic".getBytes(), "name".getBytes(), "Bob".getBytes());//添加数据table.put(put);//关流table.close();}//统计百万条数据插入hbase----25s@Testpublic void putMillionData() throws IOException{long begin=System.currentTimeMillis();HTable table=new HTable(conf, TableName.valueOf("student"));List<Put> puts=new ArrayList<>();for (int i = 0; i < 1000000; i++) {Put put=new Put(("s"+i).getBytes());put.add("basic".getBytes(), "id".getBytes(), ("no"+i).getBytes());puts.add(put);if(puts.size()>=1000){table.put(puts);puts.clear();}}long end=System.currentTimeMillis();table.close();System.err.println(end-begin);}//删除数据@Testpublic void deleteData() throws IOException{//获取表HTable table=new HTable(conf, TableName.valueOf("student"));//创建delete对象Delete del=new Delete("s1".getBytes());
//      del.deleteColumn(family, qualifier, timestamp)table.delete(del);//删除table.close();}//查询---获取单条数据@Testpublic void getData() throws IOException{HTable table=new HTable(conf, TableName.valueOf("student"));//Get get=new Get("s2".getBytes());
//      get.addColumn(family, qualifier)
//      get.addFamily(family)//获取数据Result result = table.get(get);byte[] data = result.getValue("basic".getBytes(), "id".getBytes());System.err.println(new String(data));table.close();}//查询全部数据--扫描scan@Testpublic void scanData() throws IOException{HTable table=new HTable(conf, TableName.valueOf("student"));//无参,扫描全表;
//      Scan scan=new Scan();//指定行键到最后
//      Scan scan=new Scan(startRow);//指定范围---(s999990,s999999]Scan scan=new Scan("s999990".getBytes(), "s999999".getBytes());//获取扫描器ResultScanner rs = table.getScanner(scan);//将ResultScanner转化为一个迭代器来遍历Iterator<Result> it=rs.iterator();while(it.hasNext()){Result result = it.next();byte[] data = result.getValue("basic".getBytes(), "id".getBytes());System.err.println(new String(data));}table.close();}//删除表@Testpublic void dropTable() throws Exception{//获取管理权HBaseAdmin admin=new HBaseAdmin(conf);//禁用表admin.disableTable(TableName.valueOf("student"));//删除表admin.deleteTable(TableName.valueOf("student"));//admin.close();}//过滤到  132223类似行键值中间有222的数据@Testpublic void regex() throws IOException{HTable table=new HTable(conf, TableName.valueOf("student"));//Scan scan=new Scan();//rowCompareOp--比较模式//rowComparator---规则//过滤Filter filter=new RowFilter(CompareOp.EQUAL, new RegexStringComparator(".*222.*"));//scan.setFilter(filter);ResultScanner rs = table.getScanner(scan);Iterator<Result> it = rs.iterator();while(it.hasNext()){Result result = it.next();byte[] data = result.getRow();System.err.println(new String(data));}}
}

day01(HBase)相关推荐

  1. JAVA_基础部分_综合篇

    JVM (1) 基本概念: JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆 和 一个存储方法域.JVM 是运行在操作系统之上的,它与硬件没有直接的 ...

  2. hbase原理与实践_JAVA连接HBase客户端及HBase写入数据和读取数据原理解析

    JAVA连接HBase客户端 接着上篇文章进行代码的实践,从JAVA 客户端对 HBase的客户端进行一系列操作 工具类:HbaseUtil 静态代码块一次性创建连接对象 并赋值 返回连接对象 Con ...

  3. 【备忘】最新spark/hadoop/hbase/hive/kafka/redies大数据视频教程

    day01 软件安装.Linux相关.shell     day02 自动化部署高级文本命令     day03 集群部署zookeeper     day04 并发动态大数据机制.Java反射.动态 ...

  4. 执行HBase建表操作,每次创建表HRegionServer都会挂掉,而 HMaster还在!RetriesExhaustedException: Can't get the locations

    在IDE  执行HBase建表操作,每次创建表HRegionServer都会挂掉,而 HMaster还在! 报错如下: Exception in thread "main" org ...

  5. Hive对接Hbase

    大家: 好! 因项目实际需要,要求将hive中的数据对接入hbase中.在网上看的一篇博文的基础上,加上自己的理解以及相关的操作步骤,以及常见的几个错误,整理了此篇博客,希望对大家有所帮助. Bulk ...

  6. Day01 数据仓库项目简介

    Day01 数据仓库项目简介 文章目录 Day01 数据仓库项目简介 一.项目简介及需求 1. 数据仓库概念 2. 项目需求以及架构设计 二.技术选型.框架选型.集群规模等 1. 项目技术如何选型? ...

  7. 2021年大数据HBase(十七):❤️HBase的360度全面调优❤️

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录

  8. 2021年大数据HBase(十六):HBase的协处理器(Coprocessor)

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的协处理器(Coprocessor) 一.起源 二 ...

  9. 2021年大数据HBase(十五):HBase的Bulk Load批量加载操作

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的Bulk Load批量加载操作 一.Bulk L ...

最新文章

  1. 再见QQ,再见QQ游戏!
  2. 归纳推理测试没做完_敷完面膜不要做4件事,不但敷了面膜没效果,皮肤还变差了...
  3. 李洪强经典面试题10
  4. 从大学入门到研究生拿大厂offer,必须看的数据结构与算法书籍推荐,不好不推荐!
  5. Bootstrap4+MySQL前后端综合实训-Day09-PM【实训汇报、在同一校园网下,查看别人的项目——ipconfig】
  6. 安装JDK 1.7时could not locate a suitable jar utility解决方案
  7. 洛谷P4718 【模板】Pollard-Rho算法
  8. js和python交互_JSShell:一个基于python的交互式Shell
  9. IT项目管理-----给年轻工程师的十大忠告
  10. oracle滚动统计,sql – 按月滚动或运行Oracle总计
  11. 建议IPC采用RTMP(server+rtmppush)的流媒体框架。
  12. 平面变压器的设计(翻译)(5)
  13. oracle查找隐藏字符串,oracle chr(0) 隐藏字符串
  14. SC0084 AT32F407/437在UCOSIII上运行LwIP协议栈
  15. 别扔掉你的登机牌,黑客可以用它获取个人信息
  16. 苹果手机的计算机怎么设置快捷键大全,教程方法;苹果电脑快捷键大全最常用的都在这里了电脑技巧-琪琪词资源网...
  17. sql:mysql:修改表注释、字段注释、查看与修改注释(修改备注)
  18. Debian选择并安装软件需要下载很久的解决办法
  19. 试题 算法训练 礼物
  20. 织梦网站后台基本设置

热门文章

  1. 重点人员动态管控系统开发,智慧公安大数据分析平台建设
  2. 微信小程序顶部导航栏样式设置(自定义)
  3. 推荐一款好用的在线笔记工具evernote
  4. 小微需求的实现·1·打印购物管理系统的员工工资条- 三步走写法
  5. win10后台偷跑流量限制方法
  6. 加速mq消费的方式一
  7. 通过vnc连接到android模拟器,安卓虚拟电脑解决方案Termux+qemu+VNC简单流程
  8. 【VMware vSAN 7.0】6.7 手动配置 vSAN 延伸集群—我们有软硬件解决方案
  9. #私藏项目实操分享# 提高区块链的可扩展性并不需要牺牲安全和去中心化
  10. Spring Boot 集成 XXL-JOB