ARTS(一)

ARTS第一周,2019年3月17日,星期日,天气晴。

A:算法学习(Algorithm)

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例2:

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

算法描述:这个题需要找到规律,按着规律分析即可。先将字符串按照题目规律存放在字节数组中,然后遍历二维数组即可。

代码如下:

class Solution {
    public String convert(String s, int numRows) {
        if (s == null || s.length() < 1 || numRows <= 1) {
            return s;
        }
            
        int len = s.length();
        // 存储转换后的图像
        char[][] arrs = new char[numRows][len];
        int row = 0, col = 0;
        int index = 0;
        while (index < len) {
            while (row < numRows && index < len) {
                arrs[row++][col] = s.charAt(index++);
            }
            row --;  // row 回到最后一行
            while (row > 0 && index < len) {
                arrs[--row][++col] = s.charAt(index++);
            }
            // row 回到第二行, col列的第一个字符已经被上面的循环填充
            row ++;   
        }
        
        StringBuilder ret = new StringBuilder();
        for(int i = 0; i < numRows; i++) {
            for (int j = 0; j < len; j ++) {
                char c = arrs[i][j];
                if(c != '\u0000') {
                    ret.append(c);
                }
            }
        }
        return ret.toString();
    }
}

R:Review 英文文档

1、Java性能监控工具:jps

2、链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html

3、jps 命令可以列出当前机器上运行的所有 JVM进程,包括 jps 进程自身。

命令格式:jps [option] [hostid]   

  - option:选项参数,在没有指定选项参数时,则只会打印 进程端口号应用程序名(或JAR文件名)的简短形式。

  - hostid:主机id,好像可以打印远程机器上的JVM进程信息。如果不指定 hostid,则默认为当前主机。

options:  

  -q : 禁止显示类名、Jar文件名、传递给主方法的参数,只显示本地JVM的端口号列表。

   -m : 显示传递给主方法的参数,如果没有参数只显示主方法类名。对于嵌入式的jvm,值可能为null。

   -l : 显示应用程序的主类的完整包路径名,或应用程序的 jar 文件的完整路径名。

    例如:在idea中启动SpringBoot项目,打印出主类的全路径名

    例如:在命令行通过 java -jar xx-0.0.1-SNAPSHOT.jar 启动项目,输出Jar文件的完整名称。

  -v : 显示启动时传递给jvm的参数。

  -V : 禁止显示类名、Jar文件名、传递给主方法的参数,只显示本地JVM的端口号列表。

hostid:

  如果需要查看其他机器上的 jvm 进程,需要在待查看机器上启动 jstatd 服务,然后通过jps命令查看。

T:技术总结(Technology)

mysql的存储引擎总结:

1、InnoDB存储引擎

  InnoDB 是 mysql 的默认事务型引擎,同时也是使用最广泛的存储引擎。他被设计用来处理大量的短期(short-lived)事务,短期事务大部分情况是正常提交的,很少会被回滚。

  InnoDB 的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。因此 InnoDB 在事务型需求和非事务需求中都使用很广泛。

InnoDB概览

  InnoDB 的数据存储在表空间(tablespace)中,表空间是一个由InnoDB管理的黑匣子,由一系列的数据文件组成。在mysql4.1之后,InnoDB可以将每个数据表和索引存储存放在单独的文件中。InnoDB也可以使用裸设备作为表空间的存储介质。

  InnoDB 采用 MVCC(多版本并发控制)支持高并发,并且实现了四个标准的隔离级别(读未提交、读已提交、可重复读、串形化)。其默认的隔离级别是REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,防止幻影行的插入。

  InnoDB 表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能。但是它的二级索引都必须包含主键列,因此主键列要尽可能的小。InnoDB的存储格式是平台独立的,也就是说可以将数据和索引文件从Intel平台复制到 PowerPc平台。

  InnoDB 内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够在内存中自动创建 hash索引 以加速读操作的自适应哈希索引(adaptive hash index),以及能够加速插入操作的插入缓冲区(insert buffer)等。注:建议阅读官方手册中的"InnoDB 事务模型和锁",还有了解 InnoBD的MVCC架构。

  作为事务型存储引擎,InnoDB 通过一些机制和工具支持真正的热备份,Oracle提供的 MySQL Enterprise Backup、Percona 提供的开源的 XtraBackup 都可以做到这一点。MYSQL 的其它存储引擎不支持热备份,要获取一致性的视图需要停止对所有表的写入,而在读写混合的场景中,停止写入可能也以为着停止读写。

2、MyISAM 存储引擎

  MySQL 5.1 及之前,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁、崩溃后的安全恢复。MyISAM绝不是一无是处,对于只读的数据,或者表比较小,可以忍受修复(repair)操作,则依然可以使用MyISAM引擎。

MyISAM存储:

  MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以 .MYD 和 .MYI为扩展名。mysql 会根据表定义来决定采用动态行还是静态 (长度固定) 行。 MyISAM表可以存储的行记录数,取决于可用的磁盘空间或者操作系统中单个文件的最大尺寸。

  在MySQL5.0中,MyISAM如果是变长行,默认配置只能处理 256TB 的数据,因为指向数据记录的指针长度是6字节。在更早版本中,指针长度默认4字节,所以只能处理4GB的数据。而所有的MYSQL版本都支持 8字节的指针。所以要改变 MyISAM表指针的长度 (调高或调低),可以通过修改表的 MAX_ROWS 和 AVG_ROW_LENGTH 选项值实现,两者想乘就是表可能达到的最大大小。修改这两个参数,会导致整张表和索引重建,需要很长时间。

MyISAM特性:

  加锁与并发:mysql会对整张表进行加锁(共享锁或排他锁)。但是在表有读取查询时,也可以插入新的记录(这就是并发插入,CONCURRENT INSERT)。

  修复:对于 MyISAM表,mysql 可以手工或者自动 执行检查和修复操作,这里的修复和事务恢复以及崩溃恢复是不同的概念。执行表的修复可能会导致一些数据的丢失,而且修复很费时。可以通过 CHECK TABLE mytable 检查表的错误,如果有错误可以通过执行 REPAIR TABLE mytable 进行修复。另外,如果mysql服务器已经关闭,可以通过 myisamchk 命令行工具进行检查和修复操作。

  索引特性:对于 MyISAM表,即使是 BLOB 和 TEXT等长字段,也可基于前 500个字符创建索引。 MyISAM表也支持全文索引(基于分词创建的索引),支持复杂的查询。

  延迟更新索引健:创建 MyISAM表时,如果指定 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写入内存中的键缓冲区(in-memory key buffer),只有在清理键缓冲区或关闭表时才会将对应的索引块写入磁盘。这种方式可以提高性能,但是在数据库或主机崩溃时会造成索引损坏,需要进行修复操作。延迟更新索引的操作可以在全局设置,也可以单个表设置。

MyISAM 压缩表

  如果表创建并导入数据之后,不会进行修改,这样的表或许适合采用  MyISAM表压缩表。

  可以使用 myisampack 对  MyISAM表进行压缩(也叫打包pack)。压缩表是不可以修改的(除非先解压缩、修改数据、再压缩)。压缩表可以极大减少磁盘空间占用,减少磁盘I/O,从而提升查询性能。压缩表支持索引,但索引是只读的。

  以现在的硬件能力,对于大多数场景,读取压缩表数据时的解压带来的开销影响并不大,而减少I/O带来的好处要大的多。压缩时表中的记录是独立压缩的,所以读取单个行时不需要解压整个表(甚至不用解压整个页面)

 MyISAM 性能

   MyISAM 引擎设计简单,数据紧密存储,在某些场景下性能很好。但是 MyISAM的表锁是非常典型的性能问题。

3、MYSQL 内建的其他存储引擎

Archive引擎

  Archive引擎只支持 INSERT 和 SELECT 操作。在MySQL5.1之前不支持索引。Archive引擎会缓存所有的写并利用 zlib 对插入的行进行压缩,比MyISAM表的磁盘I/O更少。但是每次 SELECT 都要全表扫描。所以Archive 表适合日志类或数据采集类应用,这类应用做数据分析时往往需要采集全部数据;或者在一些需要更快速的 INSERT 操作的场合下也可以使用。

  Archive引擎支持行级锁和专用的缓冲区,可以实现高并发插入。在一个查询开始到返回所有行数之前,Archive引擎会阻止其他的 INSERT操作,实现一致性读。另外也实现了批量插入在完成之前对读操作不可见。这种机制模仿了事务和MVCC的一些特性,但Archive引擎不是一个事务型引擎,而是针对插入和压缩做了一些优化。

Blackhole引擎

  Blackhole引擎没有实现存储机制。但服务器会记录 Blackhole表的日志,所以可用于复制数据到备库,或者简单记录到日志。(不推荐使用)

CSV引擎

  CSV引擎可以将普通的 CSV文件作为 MYSQL的表来处理,但这张表不支持索引。CSV引擎可以在数据库运行时拷入或烤出文件。可以实现 Excel数据 -> CSV文件 -> 复制到MySQL数据目录下,然后在 MYSQL中打开使用。同理,外部程序也可以读取 CSV格式的数据。因此 CSV引擎可以作为一种数据交换的机制,很有用。

Memory引擎

  如果要快速的访问数据,并且数据不会被修改,重启后丢失也没关系,那么可以使用 Memory表。Memory表比MyISAM 至少快一个数量级,因为数据都保存在内存中。

  Memory表的结构在重启后还会保留,但数据会丢失。

  Memory表在很多场景可以发挥更好的作用:

  • 用于查找 或者 映射表,例如将邮件和州名映射的表。
  • 用于缓存周期性聚合数据的结果。
  • 用于缓存数据分析中产生的中间数据。

  Memory表支持hash索引,查询很快。但是无法取代传统基于磁盘的表。Memory是表级锁,并发写入较低,不支持BLOB和TEXT列,并且没行长度是固定的(varchar 实际存储时会转为 char)。

  如果MySQL在查询中需要使用临时表来保存结果,内部使用的临时表就是 Memory表。如果查询结果查过Memory的限制,或者含有BLOB或者TEXT字段,则临时表会转换为 MyISAM表。

  区分临时表和 Memory表:临时表是用 create temporary table 语句创建的表,可以使用任何存储引擎,因此和 Memory表不同。临时表只在单个连接中可见,当连接断开时,临时表将不存在。

NDB 集群引擎

  2003年,当时的 MySQL AB公司从索尼爱立信公司收购 NDB数据库。然后开发了 NDB集群存储引擎,作为 SQL 和 NDB原生协议之间的接口。MySQL服务器、NDB 集群存储引擎,以及分布式的、share-nothing的、容灾的、高可用的NDB数据库组合,被称为 MySQL集群(MySQL Cluster)。

S:分享(Share

   在遇到选择的时候,一定要静下心来好好想一想,自己到底想要什么。如果要和别人商量,一定要找行业大佬商量,这样决策会比较正确。

  平时和别人交流的时候,当遇到自己疑惑的地方,并且这个问题以后还有可能会出现,那么一定要当面了解清楚,否则你下次还是不明白,这期间会困绕你很久。

  面对浮躁的社会,不要浮躁、不要和社会上的人比、心里要有一盘大棋,这三年一定要沉淀出一些东西,沉淀出能让自己立于不败的本事。

  有好的想法就去尝试,不要给自己设限。任何事情如果单靠想,想的结果都是会失败,只有行动起来,一点一点的前进,解决过程中的问题,那么才有可能成功。

  对于学习,如果学一个知识点,一定要学懂、学会,并记录下来,尽量和以前的知识串起来,并抽空回顾。如果学了一知半解,并且没有做笔记,没有回顾,那么就等于没学。

 


  

 

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html

猜你喜欢

转载自www.cnblogs.com/shenqidu/p/10547737.html