iasql-engine 是基于pg 的基础设施即数据
来自官方的一张图 这张图比较形象的说明了iasql-engine的功能 说明 iasql-engine 的的理念很不错,目前只支持基于aws 的,也在计划支持其他云厂商的,代码基于了typescript orm 使用了typeorm 还是值得学习参考的
参考资料 https://github.com/iasql/iasql-enginehttps://iasql.com/
1 标准输入、输出与标准错误输出 系统为这三个文件分配了文件标识符fd(file descripter),在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。
它们的文件标识符,分别为0,1,2,关系如下表:
文件描述符 名称 通用缩写 默认值 0 标准输入 stdin 键盘 1 标准输出 stdout 屏幕 2 标准错误 stderr 屏幕 1.1 输出重定向 语法 说明 > 把标准输出重定向到一个新文件,”>” 会覆盖原有的内容。 >> 把标准输出重定向到一个文件中,不覆盖原有的内容(追加)。 2 > 把标准错误重定向到一个文件中 2 >> 把标准错误重定向到一个文件中(追加) 2 > &1 把标准输出和错误重定向到一个文件(追加) 1.2 输入重定向 语法 说明 < filename文件作为标准输入 << delimiter 从标准输入中读入,直到遇到delimiter分界符 1.
字符编码与配置文件 储存引擎 MySQL字段类型 MySQL字段约束条件 字符编码与配置文件 # 查看MySQL默认字符编码 \s 在5.x系列,会出现Latin1或gbk编码 在8.x系列,统一为utf8mb4,它是utf8优化版本,支持存储表情 # 统一字符编码 5.x 统一编码操作 my-default.ini配置文件 步骤1: 拷贝一份my-default.ini配置文件,并修改名称为my.ini 步骤二:清空my.ini文件内的内容 步骤三:添加固定的配置信息 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 步骤四: 保存并重启服务端就ok了 net stop mysql net start mysql
存储引擎 # 存储引擎含义 存储引擎可以理解为处理数据的不同方式 eg: a.txt文件 a会放密码箱里 b会转成pdf存储 c会做多个备份 d会制作封面美化 # 查看存储引擎 show engines; # 需要了解的引擎 # MyISAM 5.1之前版本MySQL默认的存储引擎 特点为:存取数据的速度快, 但是功能较少,安全性比较低 # InnoDB 5.1之后版本MySQL默认的存储引擎 特点: 功能较多,安全性较高,存取速度没有MyISAM快 # BlackHole 任何写到这个里面的数据都会消失(类似于垃圾回收处理站) # Memory 以内存作为数据存取地,速度快,但是一断电数据立刻丢失 # 自定义存取引擎 create table 名称(id int)engine=myisam; create table 名称(id int)engine=innodb; create table 名称(id int)engine=blackhole; create table 名称(id int)engine=memory;
ImportError: cannot import name 'newaxis' from 'tensorflow.python.ops.numpy_ops.np_array_ops'
File E:\Eprogramfiles\Anaconda3\lib\site-packages\nbeats_keras\model.py, line 4, in <module> import tensorflow.experimental.numpy as tnp File E:\Eprogramfiles\Anaconda3\lib\site-packages\tensorflow\_api\v2\experimental\numpy\__init__.py, line 206, in <module> from tensorflow.python.ops.numpy_ops.np_array_ops import newaxisImportError: cannot import name 'newaxis' from 'tensorflow.python.ops.numpy_ops.np_array_ops' (E:\Eprogramfiles\Anaconda3\lib\site-packages\tensorflow\python\ops\numpy_ops\np_array_ops.py)
from tensorflow.python.ops.numpy_ops.np_array_ops import newaxis
线程的状态有哪几种?他们之间是如何转换的?
目录 1、线程状态分类 线程一共有六种状态,分别为New、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED,同一时刻只有一种状态,通过线程的getState方法可以获取线程的状态。
2、状态详解 Thread的状态使用java.lang.Thread.State枚举表示。
2.1、状态1:NEW 当线程被创建出来还没有被调用start()时候的状态。
public class NewState { public static void main(String[] args) { Thread thread1 = new Thread(thread1); System.out.println(thread1.getState()); } } 输出
NEW 2.2、状态2:RUNNABLE 当线程被调用了start(),且处于等待操作系统分配资源(如CPU)、等待IO连接、正在运行状态,即表示Running状态和Ready状态。
注:不一定被调用了start()立刻会改变状态,还有一些准备工作,这个时候的状态是不确定的。
public class RunnableState { public static void main(String[] args) { Thread thread1 = new Thread(thread1); thread1.start(); System.out.println(thread1.getState()); } } 输出
RUNNABLE 2.3、状态3:BLOCKED 等待监视器锁而被阻塞的线程的线程状态,当进入synchronized块/方法或者在调用wait()被唤醒/超时之后重新进入synchronized块/方法,但是锁被其它线程占有,这个时候被操作系统挂起,状态为阻塞状态。
阻塞状态的线程,即使调用interrupt()方法也不会改变其状态。
下面看案例代码,thread1持有lock对象的锁一直没有释放,而thread2也想获取lock对象的锁,但是锁一直被thread1持有者,导致thread2被阻塞在@1处,此时thread2的状态就是BLOCKED状态。
import java.util.concurrent.TimeUnit; public class BlockedState { static String lock = 锁; public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(thread1) { @Override public void run() { synchronized (lock) { //死循环导致thread1一直持有lock对象锁 while (true) ; } } }; thread1.
概要 字符编码与配置文件介绍 存储引擎 MySQL字段类型 MySQL字段约束条件 内容 1、字符编码与配置文件 # 查看MySQL默认字符编码: \s 如果是5.X系列 显示的编码有很多种 比如有:latin1 gbk 如果是8.X系列 显示的统一是utf8mb4 其中utf8mb4是utf8的优化版本 支持存储表情 # 统一字符编码 5.X默认编码有多种 可能会导致乱码的情况 所以应该统一编码 my-default.ini配置文件 步骤1:拷贝一份该配置文件并修改名称为my.ini 步骤2:清空my.ini文件内的内容 步骤3:添加固定的配置信息即可 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 步骤4:保存并重启服务端即可生效 cmd-net stop mysql-net start mysql-\s 2、存储引擎 # 什么是存储引擎 存储引擎可以理解为处理数据的不同方式 比如: 有一个a.txt的文件 ,每个人存储形式可能会不一样 有的人会放在密码箱中 有的人会转成pdf的形式 有的人会做好多个备份 还有的人会制作封面美化等 # 查看存储引擎:show engines; # 我们需要了解掌握的引擎 MyISAM: 这是一个5.1之前版本MySQL默认的存储引擎 特点:存储数据的速度快 但是功能很少 安全性较低 InnoDB 这是一个5.
一.什么是索引
索引是mysql的一种数据结构,这种数据结构称之为key,大白话说索引就是一种数据的组织方式
表中的一行行数据按照索引规定的结构组织成了一种树形结构,该树叫B+树
二.为何要用索引
优化查询速度
三.如何正确看待索引
错误的认知
1.软件上线之后,运行了一段时间,发现软件运行很卡,想到要加索引。火烧眉毛再想着加索引,光把问题定位到索引身上就耗费很长时间,排查成本很高
最好是在软件开发之初配合开发人员,定位常用的查询字段,然后为该字段提前创建索引
2.索引越多越好
索引是用于加速查询的,降低写效率
如果某一张表的ibd文件中创建了很多颗索引树,意味着很小一个update语句就会导致很多颗索引叔都需要发生变化,从而把硬盘io打上去
四.储备知识
1.索引根本原理就是把硬盘io次数降下来
为一张表中的一行行记录创建索引就好比为书的一页页内容创建目录
有了目录结构之后,我们以后的查询都应该通过目录去查询
2.一次磁盘io带来的影响
7200转/分钟,120转/s
一次io的延迟时间=平均寻道时间(5ms)+平均延迟时间(4ms)——>9ms
3.磁盘预读
一页就是一个磁盘块
innodb存储引擎一页16k,即一次io读16k到内存中
五.索引分类
六.创建索引的俩个步骤
create index xxx on user(id);
1.提取索引字段的值当作key,value就是对应的本行记录
10————>10zs
7————>7ls
13————>13ww
2.以key的为基础比较大小,生成树型结构
七.B+
二叉树—>平衡二叉树—>B树—>B+树
leaf node:叶子节点
non-leaf node:根节点,树枝节点
create index xxx on user(id)
目录MySQL字符编码与配置文件查看MySQL默认字符编码统一字符编码存储引擎什么是存储引擎查看存储引擎需要了解的引擎自定义选择存储引擎创建表的完整语法字段类型整型使用浮点型使用字符类型验证定长与变长特性扩展数字的含义枚举与集合枚举集合日期类型使用约束条件字段类型与约束条件的关系无需正负号零填充非空默认值唯一值主键自增
MySQL 字符编码与配置文件 查看MySQL默认字符编码 #在MySQL环境下输入:\s 如果是5.X系列 显示的编码有多种 latin1 gbk 如果是8.X系列 显示的统一是utf8mb4 utf8mb4是utf8优化版本 支持存储表情 统一字符编码 5.X默认编码有多种 可能会导致乱码的情况 所以应该统一编码
# 步骤1:拷贝一份my-default.ini配置文件并修改名称为my.ini # 步骤2:清空my.ini文件内的内容 # 步骤3:添加固定的配置信息即可 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 # 步骤4:保存并重启服务端即可生效 net stop mysql net start mysql 存储引擎 什么是存储引擎 存储引擎是MySQL数据库管理系统的一个重要特征,它以插件的形式被(MySQL)引入,为数据库中的表提供类型支持(它指定了表的类型),决定着一个表是如何存储和索引数据、以及是否支持事务。 # 存储引擎可以理解为处理数据的不同方式 eg: 有一个a.txt文件 戴某某会放在密码箱中 张某某会转成pdf存储 李某某会做多个备份 潘某某会制作封面美化等 查看存储引擎 show engines; 需要了解的引擎 'MyISAM' 5.1之前版本MySQL默认的存储引擎 特点:存取数据的速度快 但是功能很少 安全性较低 'InnoDB' 5.
电商大家都用过吧,下单后若未支付,通常都有一段支付倒计时,比如15分钟,若时间到了之后,还未支付的,订单将被关闭,库存将被释放。
这种业务就需要用到延迟队列的功能,将任务丢到延迟队列、设置一个延迟时间、回调函数,到了时间之后,延迟队列将回调指定的函数消费指定的任务。
下面代码是一个通用的延迟队列的实现,大家可以直接拿去用。
代码还是比较简单的,技术要点:
调用addTask方法将任务丢到延迟队列中,主要参数(延迟时间、任务信息、回调【任务到期后会进行回调】)使用到了java中的延迟队列DelayQueue来存放延迟任务下面的构造方法会自动调用一个start方法,start方法中会自动启动一个线程,线程轮询从延迟队列中拉取到期的任务,然后丢到线程池executorService.submit中进行处理,会自动调用创建延迟任务中指定的回调函数main方法中有使用步骤 import java.util.concurrent.*;import java.util.function.Consumer;import java.util.logging.Logger;public class DelayQueueService<T> {Logger logger = Logger.getLogger(DelayQueueService.class.getName());//延迟队列名称private String delayQueueName;private DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();//处理队列中任务的线程池private ExecutorService executorService;public DelayQueueService(String delayQueueName) {this(delayQueueName, Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 4));}public DelayQueueService(String delayQueueName, ExecutorService executorService) {this.delayQueueName = delayQueueName;this.executorService = executorService;//启动队列消费this.start();}/*** 添加任务** @param delayedTimeUnit 延迟时间单位* @param delayedTime 延迟时间* @param task 任务* @param consumer 任务消费者(到期了会回调)*/public void addTask(TimeUnit delayedTimeUnit, long delayedTime, T task, Consumer<T> consumer) {this.delayQueue.offer(new DelayedTask(delayedTimeUnit, delayedTime, task, consumer));}private void start() {//轮询从延迟队列中拉取任务,然后调用线程池进行处理Thread pollThread = new Thread(() -> {while (true) {try {DelayedTask delayedTask = this.
1.缩短键值对的存储长度;
在 key 不变的情况下,value 值越大操作效率越慢,因为 Redis 对于同一种数据类型会使用不同的内部编码进行存储,比如字符串的内部编码就有三种:int(整数编码)、raw(优化内存分配的字符串编码)、embstr(动态字符串编码),这是因为 Redis 的作者是想通过不同编码实现效率和空间的平衡,然而数据量越大使用的内部编码就越复杂,而越是复杂的内部编码存储的性能就越低。
这还只是写入时的速度,当键值对内容较大时,还会带来另外几个问题:
内容越大需要的持久化时间就越长,需要挂起的时间越长,Redis 的性能就会越低; 内容越大在网络上传输的内容就越多,需要的时间就越长,整体的运行速度就越低; 内容越大占用的内存就越多,就会更频繁地触发内存淘汰机制,从而给 Redis 带来了更多的运行负担。 因此在保证完整语义的同时,我们要尽量地缩短键值对的存储长度,必要时要对数据进行序列化和压缩再存储,以 Java 为例,序列化我们可以使用 protostuff 或 kryo,压缩我们可以使用 snappy。
2.使用 lazy free(延迟删除)特性;
Redis4.0后支持惰性删除/延迟删除。意思是在删除的时候提供异步延时释放键值的功能,把键值释放操作放在 BIO(Background I/O)单独的子线程处理中,以减少删除对 Redis 主线程的阻塞,可以有效地避免删除 big key 时带来的性能和可用性问题。
4种场景:
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
lazyfree-lazy-eviction:表示当 Redis 运行内存超过 maxmeory 时,是否开启 lazy free 机制删除; lazyfree-lazy-expire:表示设置了过期时间的键值,当过期之后是否开启 lazy free 机制删除; lazyfree-lazy-server-del:有些指令在处理已存在的键时,会带有一个隐式的 del 键的操作,比如 rename 命令,当目标键已存在,Redis 会先删除目标键,如果这些目标键是一个 big key,就会造成阻塞删除的问题,此配置表示在这种场景中是否开启 lazy free 机制删除; slave-lazy-flush:针对 slave(从节点)进行全量数据同步,slave 在加载 master 的 RDB 文件前,会运行 flushall 来清理自己的数据,它表示此时是否开启 lazy free 机制删除。 建议开启其中的 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-server-del 等配置,这样就可以有效的提高主线程的执行效率。