设计模式—itorator模式

itorator模式,又称迭代模式,本质是提供统一的接口,让外部可以顺序访问到内部的数据。

 

对外暴露两个接口:

  1. hasNext,是否还有下一个元素
  2. next,返回下一个元素

 

为什么需要这种模式?因为底层数据实现可能是数组,也可能是链表,前者可以通过下标遍历,后者通过指针遍历。但是这样子,在调用的时候,调用者还要分别处理。假如我们在它们上面包裹一层,提供hasNext和next函数,那么调用者就可以统一来遍历处理了。

 

uml图:

例子:

我们平常的各种调味品,例如糖,盐,味精,我们都可以放到一个一个相同的罐子存储,使用时候用勺子拿出一点点。统一的取出方法,能判断还能不能取出,这就是迭代模式。

 

 

centos7 安装redis

安装redis


yum install -y redis

 

启动redis


systemctl start redis

 

配置内网密码登录,打开配置文件vim /etc/redis.conf


# 修改成内网ip

bind 172.24.214.105

# 添加下面的配置,配置密码

requirepass 密码

 

centos7 安装mysql5.7

安装mysql

 


wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

yum -y install mysql57-community-release-el7-10.noarch.rpm

yum -y install mysql-community-server

 

启动mysql


systemctl start mysqld.service

 

查看默认密码


grep "password" /var/log/mysqld.log

 

接着第一次使用的时候要修改默认密码


ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

 

添加一个可以远程访问的账号


grant all privileges on *.* to '用户名'@'%' identified by '密码';

flush privileges;

 

python操作HDF5文件

HDF5一种能高效存储和分发科学数据的新型数据格式,然后主要有group和dataset两种概念。每个文件都类似于linux文件系统,其中group类似于文件夹,dataset类似于文件。

 

首先python要读写hdf5格式文件首先要安装一个库:h5py

然后就跟平时的文件读写是一样的,下面给出例子:

 

# coding:UTF-8

import h5py

with h5py.File("data/1.data", "w") as fp:

    fp.create_group("/b/b1")
    fp.create_group("/b/b2")
    fp.create_group("/a/a1")
    fp.get("/b").create_group("b3")
    fp.get("/b/b3").create_dataset("data", data="abc")
    fp.get("/b/b3").attrs['data'] = True
    fp["/b/b3"]['data'].attr = True
    del fp['/b/b3']['data']

    for k in fp['/b']:
        print(k)

    del fp['/b']

 

其中File对象默认指向于根目录,然后create_group是创建一个group,create_dataset是创建一个dataset。然后创建的group时候指定的名字,等同于文件系统创建文件夹,例如/b/b1是两级结构了。dataset可以存储各种基础类型数据。然后读取可以像字典一样操作,修改数据可以通过group的attrs属性修改对应的dataset,或者dataset的attr属性直接修改内容。删除数据,直接像操作字典一样即可。

 

mycat分表策略

     1.一致性hash

 


<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0 -->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,
以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何
东西 -->
</function>

     2.32位循环冗余校验多项式算法

 


<function name="crc32slot"
class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
</function>

 

     3.枚举法

 


<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>

 

      4.范围约定

 


<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>

 

       5.求模法

 


<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>

 

     6.固定分片hash算法

 


<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>

 

      7.按单月小时拆分

 


<function name="latestMonth"
class="io.mycat.route.function.LatestMonthPartion">
<property name="splitOneDay">24</property>
</function>

 

      8.自然月分片

 


<function name="partbymonth"
class="io.mycat.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2015-01-01</property>
</function>

 

       9.范围取模分片

 


<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
<property name="mapFile">partition-range-mod.txt</property>
</function>

 

      10.Google的一致性哈希算法

 


<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
<property name="totalBuckets">3</property>
</function>

 

mycat单库多表

首先要使用单库多表功能,mycat要1.6.5及以后版本

然后conf/schema.xml的table标签subTables指定表名字,例如我们要分表为order1,order2,order3则可以填写subTables=”order$1-3″

然后conf/rule.xml里面配置的function以前需要指定数据库数量的,现在改成表数量即可。

 

下面给出配置文件的demo:

 


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="schema1" checkSQLschema="true" sqlMaxLimit="100" >
<table name="user" primaryKey="id" autoIncrement="true" dataNode="d1,d2,d3,d4,d5" rule="rule1"/>

<table name="order" primaryKey="id" autoIncrement="true" subTables="order$1-3" dataNode="d1" rule="rule2"/>
</schema>

<dataNode name="d1" dataHost="localhost1" database="db1"/>
<dataNode name="d2" dataHost="localhost1" database="db2"/>
<dataNode name="d3" dataHost="localhost1" database="db3"/>
<dataNode name="d4" dataHost="localhost1" database="db4"/>
<dataNode name="d5" dataHost="localhost1" database="db5"/>

<dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
</writeHost>
</dataHost>
</mycat:schema >


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">

<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="rule2">
<rule>
<columns>id</columns>
<algorithm>func2</algorithm>
</rule>
</tableRule>

<function name="func1" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">5</property>
</function>

<function name="func2" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>

</mycat:rule >

mycat入门小试

mycat是什么?mycat本质是关系型数据库中间件。

mycat解决了什么问题,让我们实现无感知的分表,就是分表之后还是像以前单表那样子使用。

 

安装:

因为mycat是java写的,所以要先安装java。(安装java可以参考:https://blog.yubang.app/?p=31)

然后在官网下载对应版本,官网是http://www.mycat.io/

然后解压,即可运行

运行命令如下:


./mycat start 启动

./mycat stop 停止

./mycat console 前台运行

./mycat install 添加到系统自动启动(暂未实现)

./mycat remove 取消随系统自动启动(暂未实现)

./mycat restart 重启服务

./mycat pause 暂停

./mycat status 查看启动状态

 

最关键一步,就是配置。我们只需要关心conf/server.xml,conf/schema.xml,conf/rule.xml这三个文件

 

1.conf/server.xml这个文件是用来配置mycat的系统参数和登录用的用户名密码


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>

<property name="sequnceHandlerType">2</property>

<property name="processorBufferPoolType">0</property>

<property name="handleDistributedTransactions">0</property>

<property name="useOffHeapForMerge">1</property>

<property name="memoryPageSize">1m</property>

<property name="spillsFileBufferSize">1k</property>

<property name="useStreamOutput">0</property>

<property name="systemReserveMemorySize">384m</property>

<property name="useZKSwitch">true</property>

</system>


<user name="root">
<property name="password">123456</property>
<property name="schemas">schema1</property>

</user>

<user name="user">
<property name="password">user</property>
<property name="schemas">schema1</property>
<property name="readOnly">true</property>
</user>

</mycat:server>

 

可以看到<system>标签里面是mycat的基本配置,然后<user>标签是配置登录的用户名和密码,其中name是用户名,password是密码schemas是分片策略。

 

2.conf/schema.xml文件是指定分片策略的


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="schema1" checkSQLschema="true" sqlMaxLimit="100" >
<table name="user" primaryKey="id" autoIncrement="true" dataNode="d1,d2,d3,d4,d5" rule="rule1"/>
</schema>

<dataNode name="d1" dataHost="localhost1" database="db1"/>
<dataNode name="d2" dataHost="localhost1" database="db2"/>
<dataNode name="d3" dataHost="localhost1" database="db3"/>
<dataNode name="d4" dataHost="localhost1" database="db4"/>
<dataNode name="d5" dataHost="localhost1" database="db5"/>

<dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
</writeHost>
</dataHost>
</mycat:schema >

 

dataHost标签是配置我们真实的数据库信息,name是一个自定义名字,heartbeat是用于保持心跳的,writeHost 是表示写库,host=”hostM1″不需要修改,url是数据库地址,user是数据库用户名,password是数据库密码

dataNode标签是指定一个数据库里面的database,name是自定义名称,dataHost是dataHost标签的name名字,database是我们的数据库名字

schema标签是分片配置,也是conf/schema.xml文件需要的schemas。name是自定义名字,也是conf/schema.xml文件指向的名字。table 标签是配置具体的表,dataNode分散到那些database,rule是指定分布规则。

 

3.conf/rule.xml这个文件是配置表如何分散到若干个数据库规则的

 


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">

<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>

<function name="func1" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">5</property>
</function>

</mycat:rule >

 

tableRule标签是定义规则的,name是规则名字,columns是用于指定分片规则的表字段,algorithm是指定分片函数的

function标签是定义分片函数的,name是自定义名字,class对应内置的分片策略,property 是指定一些参数,各种分片策略是不同的

 

分表之后最总要一个事情就是自增id了,最简单的方法,conf/server.xml里面的<property name=”sequnceHandlerType”>2</property>定义成2,然后conf/schema.xml的table指定autoIncrement,然后字段记得定义成bigint,然后插入就会采用本地时间戳方式生成id

 

我们要测试mycat,可以用命令行测试


mysql -u root -P8066 -h 127.0.0.1 -p

然后数据库选择用户名对应的schemas,里面的表就是schemas配置的table,剩下的操作跟平时是一致的。

 

http协议之content-type

response里面的content-type一般是告诉浏览器如何处理收到的数据

下面是nginx默认的配置,content-type 和对应的文件后缀


text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;

text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;

image/png png;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
image/svg+xml svg svgz;
image/webp webp;

application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;

application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;

application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;

audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;

video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;

开源库—java工具类

Hutool 对文件、流、加密解密、转码、正则、线程、XML、日期、Http客户端 等 JDK 方法进行封装,组成各种 Util 工具类

项目地址:https://gitee.com/loolly/hutool