首页 开发编程 正文

php怎么放添加背景

每个实例上有3个db需要分别拆分。select*fromdb1.shard_auto;select*fromdb1.shard_auto问题2:select*fromshard_mod_long;current_date);...

php怎么放添加背景,Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

MySQL的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错。

关于分库分表

当然自己也理了一下,分库分表的这些内容,如果分成几个策略或者阶段,大概有下面的几种。

最上面的第一种是直接拆表,比如数据库db1下面有test1,test2,test3三个表,通过中间件看到的还是表test,里面的数据做了这样的拆分,能够在一定程度上分解压力,如果细细品来,和分区表的套路有些像。

接下来的几类也是不断完善,把表test拆解到多个库中,多个服务器中,如果做了读写分离,全套的方案这样的拆解改进还是很大的。如此来看,数据库中间件做了很多应用和数据库之间的很多事情,能够流行起来除了技术原因还是有很多其他的因素。

分库分表的测试环境模拟

如果要在一台服务器上测试分库分表,而且要求架构方案要全面,作为技术可行性的一个判定参考,是否可以实现呢。

如果模拟一主两从的架构,模拟服务分布在3台服务器上,这样的方案需要创建9个实例,每个实例上有3个db需要分别拆分。

大体的配置如下:

master1: 端口33091

(m1)slave1: 端口33092

(m1)slave2: 端口33093

master2: 端口33071

(m2)slave1: 端口33072

(m2)slave2: 端口33073

master3: 端口33061

(m3)slave1: 端口33062

(m3)slave2: 端口33063

画个图来说明一下,其中db1,db2,db3下面有若干表,需要做sharding

所以我们需要模拟的就是这个事情。

使用Mycat碰到的几个小问题解惑

使用Mycat的时候碰到了几个小问题,感觉比较有代表性,记录了一下。

问题1:

首先是使用Mycat连接到数据库之后,如果不切换到具体的数据库下,使用[数据库名].[表名]的方式会抛出下面的错误,可见整个过程中,Mycat拦截了SQL信息做了过滤,在转换的时候找不到目标路由。当然实际使用中,规范使用肯定不会有这个问题。

mysql> select * from db1.shard_auto;

ERROR 1064 (HY000): find no Route:select * from db1.shard_auto

问题2:

在配置了sharding策略之后,insert语句抛出了下面的错误,这个是对语法的一个基本的要求。

mysql> insert into shard_mod_long values(1,'aa',date);

ERROR 1064 (HY000): partition table, insert must provide ColumnList

问题3:

如果sharding策略配置有误,很可能出现表访问正常,但是DML会有问题,提示数据冲突了。至于如何配置sharding,下面会讲。

mysql> select * from shard_mod_long;

Empty set (0.00 sec)

mysql> insert into shard_mod_long(ID,name,shard_date) values(1,'aa',current_date);

ERROR 1105 (HY000): Duplicate entry '1' for key 'PRIMARY'

问题4:

如果sharding的配置有误,很可能出现多份冗余数据。

查看执行计划就一目了然,通过data_node可以看到数据指向了多个目标库。

mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);

+-----------+------------------------------------------------+

| DATA_NODE | SQL |

+-----------+------------------------------------------------+

| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |

| pxcNode21 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |

| pxcNode31 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |

+-----------+------------------------------------------------+

这种情况如果有一定的需求还是蛮不错的,做sharding可惜了。问题就在于下面的这个table配置。

<table name="shard_auto" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="auto-sharding-long" />

需要去掉 type="global"的属性,让它sharding。

Mycat里面的sharding策略

Mycat的分片策略很丰富,这个是超出自己的预期的,也是Mycat的一大亮点。

大体分片规则如下,另外还有一些其他分片方式这里不全部列举:

(1)分片枚举:sharding-by-intfile

(2)主键范围:auto-sharding-long

(3)一致性hash:sharding-by-murmur

(4)字符串hash解析:sharding-by-stringhash

(5)按日期(天)分片:sharding-by-date

(6)按单月小时拆分:sharding-by-hour

(7)自然月分片:sharding-by-month

在开始之前,我们要创建下面的表来模拟几个sharding的场景,表名根据需求可以改变。

create table shard_test(ID int primary key, name varchar(20),shard_date date);

主键范围分片

主键范围分片是参考了主键值,按照主键值的分布来分布数据库在不同的库中,我们先在对应的sharding节点上创建同样的表结构。

关于sharding的策略,需要修改rule.xml文件。

常用的sharding策略已经在Mycat里面实现了,如果要自行实现也可以定制。比如下面的规则,是基于主键字段ID来做sharding,分布的算法是rang-long,引用了function rang-long,这个function是在对应的一个Java类中实现的。

<tableRule name="auto-sharding-long">

<rule>

<columns>ID</columns>

<algorithm>rang-long</algorithm>

</rule>

<function name="rang-long"

class="io.mycat.route.function.AutoPartitionByLong">

<property name="mapFile">autopartition-long.txt</property>

当然主键的范围是不固定的,可以根据需求来定制,比如按照一百万为单位,或者1000位单位,文件是 autopartition-long.txt 文件的内容默认如下,模板里是分为了3个分片,如果要定制更多的就需要继续配置了,目前来看这个配置只能够承载15亿的数据量,可以根据需求继续扩展定制。

# range start-end ,data node index

# K=1000,M=10000.

0-500M=0

500M-1000M=1

1000M-1500M=2

插入一些数据来验证一下,我们可以查看执行计划来做基本的验证,配置无误,数据就根据规则流向了指定的数据库下的表里。

mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);

+-----------+------------------------------------------------+

| DATA_NODE | SQL |

+-----------+------------------------------------------------+

| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |

+-----------+------------------------------------------------+

还有一个查看sharding效果的小方法,比如我插入一个极大的值,保证和其他数据不在一个分片上,我们运行查询语句两次,结果会有点变化。

sharing的效果

mysql> select * from shard_auto;

+---------+------+------------+

| ID | name | shard_date |

+---------+------+------------+

| 1 | aa | 2017-09-06 |

| 2 | bb | 2017-09-06 |

| 5000001 | aa | 2017-09-06 |

+---------+------+------------+

3 rows in set (0.00 sec)

稍作停顿,继续运行。

mysql> select * from shard_auto;

+---------+------+------------+

| ID | name | shard_date |

+---------+------+------------+

| 5000001 | aa | 2017-09-06 |

| 1 | aa | 2017-09-06 |

| 2 | bb | 2017-09-06 |

+---------+------+------------+

3 rows in set (0.01 sec)

Hash分片

Hash分片其实企业级应用尤其广泛,我觉得一个原因是通过这种数据路由的方式,得到的数据情况是基本可控的,和业务的关联起来比较直接。很多拆分方法都是根据mod方法来平均分布数据。

sharding的策略在rule.xml里面配置,还是默认的mod-long规则,引用了算法mod-long,这里是根据sharding的节点数来做的,默认是3个。

<tableRule name="mod-long">

<rule>

<columns>id</columns>

<algorithm>mod-long</algorithm>

</rule>

</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">

<!-how many data nodes -->

<property name="count">3</property>

</function>

比如查看两次insert的结果情况。

mysql> explain insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date);

+-----------+------------------------------------------------+

| DATA_NODE | SQL |

+-----------+------------------------------------------------+

| pxcNode22 | insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date) |

+-----------+------------------------------------------------+

mysql> explain insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date);

+-----------+------------------------------------------------+

| DATA_NODE | SQL |

+-----------+------------------------------------------------+

| pxcNode23 | insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date) |

+-----------+------------------------------------------------+

可以看到数据还是遵循了节点的规律,平均分布。

至于schema.xml的配置,是整个分库的核心,我索性也给出一个配置来,供参考。

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

<!-定义MyCat的逻辑库 -->

<schema name="db1" checkSQLschema="false" sqlMaxLimit="100" >

<table name="shard_mod_long" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="mod-long" />

<table name="shard_auto" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="auto-sharding-long" />

</schema>

<!-定义MyCat的数据节点 -->

<dataNode name="pxcNode11" dataHost="dtHost" database="db1" />

<dataNode name="pxcNode21" dataHost="dtHost2" database="db1" />

<dataNode name="pxcNode31" dataHost="dtHost3" database="db1" />

<!-定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->

<!-dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->

<!-balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->

<!-writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->

<dataHost name="dtHost" maxCon="500" minCon="20" balance="1"

writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

<!--心跳检测 -->

<heartbeat>show slave status</heartbeat>

<!--配置后台数据库的IP地址和端口号,还有账号密码 -->

<writeHost host="hostMaster" url="192.168.163.128:33091" user="mycat_user" password="mycat" />

</dataHost>

<dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"

writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

<!--心跳检测 -->

<heartbeat>show slave status</heartbeat>

<!--配置后台数据库的IP地址和端口号,还有账号密码 -->

<writeHost host="hostMaster" url="192.168.163.128:33071" user="mycat_user" password="mycat" />

</dataHost>

<dataHost name="dtHost3" maxCon="500" minCon="20" balance="1"

writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

<!--心跳检测 -->

<heartbeat>show slave status</heartbeat>

<!--配置后台数据库的IP地址和端口号,还有账号密码 -->

<writeHost host="hostMaster" url="192.168.163.128:33061" user="mycat_user" password="mycat" />

</dataHost>

</mycat:schema>

=================================================================================================

用Mycat,学会数据库读写分离、分表分库

php疑难杂症铺 2017-09-13 14:31

用Mycat,学会数据库读写分离、分表分库

系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。希望通过这篇文章的介绍,能学会Mycat的使用。

安装

Mycat官网:http://www.mycat.io/

可以了解下Mycat的背景和应用情况,这样使用起来比较有信心。

Mycat下载地址:http://dl.mycat.io/

官网有个文档,属于详细的介绍,初次入门,看起来比较花时间。

下载:

建议大家选择 1.6-RELEASE 版本,毕竟是比较稳定的版本。

安装:

根据不同的系统选择不同的版本。包括linux、windows、mac,作者考虑还是非常周全的,当然,也有源码版的。(ps:源码版的下载后,只要配置正确,就可以正常运行调试,这个赞一下。)

Mycat的安装其实只要解压下载的目录就可以了,非常简单。

安装完成后,目录如下:

目录说明binmycat命令,启动、重启、停止等catletcatlet为Mycat的一个扩展功能confMycat 配置信息,重点关注libMycat引用的jar包,Mycat是java开发的logs日志文件,包括Mycat启动的日志和运行的日志。

配置

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

文件说明server.xmlMycat的配置文件,设置账号、参数等schema.xmlMycat对应的物理数据库和数据库表的配置rule.xmlMycat分片(分库分表)规则

Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。

我们现在做一个主从、读写分离,简单分表的示例。结构如下图:

服务器IP说明Mycat192.168.0.2mycat服务器,连接数据库时,连接此服务器database1192.168.0.3物理数据库1,真正存储数据的数据库database2192.168.0.4物理数据库2,真正存储数据的数据库

Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后,连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,如:jdbc:mysql://192.168.0.2:8066/

server.xml

示例

重点关注下面这段,其他默认即可。

参数说明user用户配置节点--name登录的用户名,也就是连接Mycat的用户名--password登录的密码,也就是连接Mycat的密码--schemas数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs--privileges配置用户针对表的增删改查的权限,具体见文档吧

我这里配置了一个账号test 密码也是test,针对数据库lunch,读写权限都有,没有针对表做任何特殊的权限。

schema.xml

schema.xml是最主要的配置项,首先看我的配置文件。

参数说明schema数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应dataNode分片信息,也就是分库相关配置dataHost物理数据库,真正存储数据的数据库

每个节点的属性逐一说明:

schema:

属性说明name逻辑数据库名,与server.xml中的schema对应checkSQLschema数据库前缀相关设置,建议看文档,这里暂时设为folsesqlMaxLimitselect 时默认的limit,避免查询全表

table:

属性说明name表名,物理数据库中表名dataNode表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的nameprimaryKey主键字段名,自动生成主键时需要设置autoIncrement是否自增rule分片规则名,具体规则下文rule详细介绍

dataNode

属性说明name节点名,与table中dataNode对应datahost物理数据库名,与datahost中name对应database物理数据库中数据库名

dataHost

属性说明name物理数据库名,与dataNode中dataHost对应balance均衡负载的方式writeType写入方式dbType数据库类型heartbeat心跳检测语句,注意语句结尾的分号要加。

应用场景

数据库分表分库

配置如下:

我在192.168.0.2、192.168.0.3均有数据库lunch。

lunchmenu、restaurant、userlunch、users这些表都只写入节点dn1,也就是192.168.0.2这个服务,而dictionary写入了dn1、dn2两个节点,也就是192.168.0.2、192.168.0.3这两台服务器。分片的规则为:mod-long。

主要关注rule属性,rule属性的内容来源于rule.xml这个文件,Mycat支持10种分表分库的规则,基本能满足你所需要的要求,这个必须赞一个,其他数据库中间件好像都没有这么多。

table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些分表和分库的实现,建议还是看下文档。我这里选择的mod-long就是将数据平均拆分。因为我后端是两台物理库,所以rule.xml中mod-long对应的function count为2,见下面部分代码:

数据库读写分离

配置如下:

这样的配置与前一个示例配置改动如下:

删除了table分配的规则,以及datanode只有一个

datahost也只有一台,但是writehost总添加了readhost,balance改为1,表示读写分离。

以上配置达到的效果就是102.168.0.2为主库,192.168.0.3为从库。

注意:Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost,这个问题当时候我纠结了好久,数据写入writehost后,readhost一直没有数据,以为是自己配置的问题,后面才发现Mycat就没有实现主从复制的功能,毕竟数据库本身自带的这个功能才是最高效稳定的。

至于其他的场景,如同时主从和分表分库也是支持的了,只要了解这个实现以后再去修改配置,都是可以实现的。而热备及故障专业官方推荐使用haproxy配合一起使用,大家可以试试。

使用

Mycat的启动也很简单,启动命令在Bin目录:

如果在启动时发现异常,在logs目录中查看日志。

wrapper.log 为程序启动的日志,启动时的问题看这个

mycat.log 为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。

mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好的执行。

Mycat带来的最大好处就是使用是完全不用修改原有代码的,在mycat通过命令启动后,你只需要将数据库连接切换到Mycat的地址就可以了。如下面就可以进行连接了:

连接成功后可以执行sql脚本了。

所以,可以直接通过sql管理工具(如:navicat、datagrip)连接,执行脚本。我一直用datagrip来进行日常简单的管理,这个很方便。

Mycat还有一个管理的连接,端口号是9906.

连接后可以根据管理命令查看Mycat的运行情况,当然,喜欢UI管理方式的人,可以安装一个Mycat-Web来进行管理,有兴趣自行搜索。

简而言之,开发中使用Mycat和直接使用Mysql机会没有差别。

常见问题

使用Mycat后总会遇到一些坑,我将自己遇到的一些问题在这里列一下,希望能与大家有共鸣:

Mycat是不是配置以后,就能完全解决分表分库和读写分离问题?

Mycat配合数据库本身的复制功能,可以解决读写分离的问题,但是针对分表分库的问题,不是完美的解决。或者说,至今为止,业界没有完美的解决方案。

分表分库写入能完美解决,但是,不能完美解决主要是联表查询的问题,Mycat支持两个表联表的查询,多余两个表的查询不支持。 其实,很多数据库中间件关于分表分库后查询的问题,都是需要自己实现的,而且节本都不支持联表查询,Mycat已经算做地非常先进了。

分表分库的后联表查询问题,大家通过合理数据库设计来避免。

Mycat支持哪些数据库,其他平台如 .net、PHP能用吗?

官方说了,支持的数据库包括MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,很赞。

尽量用Mysql,我试过SQL Server,会有些小问题,因为部分语法有点差异。

Mycat 非JAVA平台如 .net、PHP能用吗?

可以用。这一点MyCat做的也很棒。

学PS难不难?

Adobe Photoshop,简称“PS”,是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具。

对Photoshop爱好者而言,通过Photoshop处理过的图片,即非原始、非未处理的图片。一般用于修复修改照片、视觉创意、界面设计、图标制作、电商设计等。

听起来好像很专业的感觉,其实也没那么复杂。

它就像一支笔一样,至于你能写出什么或者画出怎样的水平那就得后期怎么去学了。

而学习好PS也不是一朝一夕就能学好的,小编玩PS有15年,下面写一些心得体会。

1.兴趣,兴趣是最好的老师,也是学习的开始。如果你感兴趣,就会事半功倍。

2.什么都不懂,没有美术基础,也不是科班出身,怎么办呢?

这个不是每个人天生都自带的,你所见到的每个高手都是也不是天生就会,也不是天赋过人,之所以人家玩得好那是人家学的比较早,通过自己的努力才得来的成功,这个每个人都是可以通过自身努力而获得的,当然你也不例外

3.学习从模仿开始,先把别人的作品作为练习的对象,进行反复练习,不断的摸索规律,总结经验。

4.对于设计的审美,这个是非常重要的。这个就是区别于一个设计师的水准了。每个人审美不一样,那么怎么提高自己的审美呢,建议大家平时多去看一些优秀的作品,多思考,慢慢的审美的感官就会不断提高。

5.有人问:自学好还是有人带更好呢?自学并不是说学不会,但是需要很强的耐心跟毅力,三分钟热度可以不行。不过如果有老师指导,帮你指路,那就更好了,会避免很多不必要的弯路。

学习PS能做什么,有什么用处呢,个人觉得有如下几点用处:

(1)平面设计:PS最常用是平面设计,我们平时看到的图书封面,海报等各种类型的印刷制品,大多数是通过PS软件设计出来的。在平面设计与制作中,photoshop已经完全渗透到了包装、海报、平面广告、印刷等各个环节。

(2)照片修复、美化:PS 对修复图像方面实在下足了功夫,我们可以通过里面各种工具来进行照片修复,比如修复画笔工具、修补工具、仿制图章工具等工具,我们只要灵活运用这些工具就可以将照片很完美的修复出来。

(3)网页设计:这几年IT行业越来越火,网页设计师也是非常抢手的,那么要做好一个好的设计师,首先你要学会PS,所以学好PS对做好网页设计是非常有帮助的。除了上面3点外,在广告摄影,绘画、婚纱照片设计等领域都运用到PS技术。Photoshop 的应用领域非常广泛,毫不夸张地说,凡是有图像的地方,基本都能找到 Photoshop 的影子。

这么多领域用到PS技术,那我们该如何学好PS呢,有3点不错建议分享给大家:(1)多看书,看视频:先可以在网上找些免费基础教程进行学习,当你看好视频有一定基础后,你也可以去网上买一本最热销的关于PS的书,照着书全部在做一遍,在学习过程中要做好一些有用的笔记,这样对你以后的使用很有帮助。在PS学习过程中,你首先要打好基础,一些重要的工具要多加练习,熟能生巧。(2)多练,多实践:只有练的多了,才能掌握那种度,做出来的图片自然而然就很好看,PS总的来说不是很难,只是想做出好的作品要有灵感,多练,实践,时间长了就好了。(3)多模仿,多思考:网上可以多找一些例子模仿去做,慢慢做多了,手感来了,技术就会慢慢提高了,当你自己对这方面有一定经验了,这样后续你做起来的图片也就会越来越自然了。平时可以找个相似的场景或物件,认真观察,从现实中找到一些灵感进行创作。

能做到这几点,下一个PS高手就是你!

什么行业最赚钱?

什么行业最赚钱?这个还真没法说。

因为三百六十行,行行出状元,每一个行业都有做得好的,也有干不下去的。所以,没人敢说哪一个行业最赚钱,只能说有些行业很赚钱。

我认为,越是一些不被大众关注的行业,越容易产生暴利。就是我们常说的闷声发大财。越是了解的人越多的行业,大部分人感觉好的行业,竞争压力越大,越难挣钱。在我看来,以下几个行业是比较挣钱的:

一、眼镜行业

作为暴利行业中的“代表”,眼镜行业从来都不是浪得虚名的。一副眼镜的利润到底有多高,很多人都不是很清楚,但总之高到让很多消费者难以想象。通常一副眼镜的成本是几十块钱,但售价却高达300-400元。虽然这包括配戴眼镜的成本和检测费用,但即便如此,一副眼镜的利润也高达150-200元。另外因为我国近视率越来越高,也导致了对眼镜的需求变大,而且由于大家重视眼睛,对廉价的产品也不是很放心,这也导致眼镜行业价格虚高。

二、废品回收

也许平时的一些生活废品,用不上的一些旧东西,我们不太在意,随手就丢垃圾箱了。但在有些人眼中,它却是宝贝。

现在越来越多的人开始关注了废品回收这个行业,也看到很多专门的环保科技公司,采用了“网络+垃圾回收”的模式,吸引了资本市场的青睐。这个行业未来的潜力也非常大。

三、特色小吃

谈到美食,想必每个人都吃过路边的小吃摊,虽然这些小吃摊的卫生看上去并不太好,但制作出来的食物味道都算不错,物美价廉,深受老百姓的喜爱。如果经营一家特色小吃店,价格也不贵,大部分人都能消费得起,所以利润非常可观。

四、日用品

日用品行业是一个不怎么被关注的行业,但它是一个成本低,利润高,从不缺少客户的行业。它包括的方面特别多,包括了我们日常使用的牙膏、洗发水、卫生纸、垃圾袋等方方面面。这些产品的成本其实很低,但是每年的价格都在上涨,毛利润特别高。更重要的是,这些都与大家的生活息息相关,从不缺少客户。

五、美容行业

有句话说得好,女人的钱最好赚。不错,爱美是女人的天性,时下享受生活、追求时尚成为当今女性的一种新潮流。所以。为了让自己更美,哪怕平时省吃俭用,也要在美容上投入大量资金,花钱毫不手软。尤其近年化妆护理、瘦身美容等观念不断猛烈宣传攻势,几乎激起了每个女人爱美的天性欲望,也因此拉动了女性美容产业的兴起。

六、健康行业

近年来,随着人们生活压力的增大,亚健康人群越来越多,人们对健康问题也越来越重视。随着人们收入水平的提高,人们越来越关注健康问题。各类养生产品,保健品越来越多,未来健康行业也是国家重点发展的一个行业,所以前景一片广阔。

七、养老行业

随着我国现在老龄化越来越严重,人们对养老问题也越来越关注,也带动了一些健康医疗、养老社区、文化娱乐等产业。所以,养老产业是一个非常广泛的产业,只要围绕老年人需求的一些行业,未来都有很大的发展前景。

八、教育行业

我们都知道孩子是父母的掌中宝,心头肉,每个父母都望子成龙,望女成凤,希望自己的孩子能成就一番事业,不想让孩子输在起跑线上。因此,不管家庭条件如何,都想把最好的给孩子。早早地就给孩子规划好了未来,各种辅导,培训教育能报的都报了。所以,现在各类教育行业也是非常火爆。

九、婚庆

男大当婚,女大当嫁,婚姻人生就一次,所以对待婚礼都十分重视,都希望能有个完美的婚礼。一个优秀的婚庆公司也是十分挣钱的。婚庆的好处是不用主动寻找客户,客户是主动上门的。只要我们做得专业,服务周到,有新意,就会得到客户的认可,从而会主动帮你宣传,这样我们的客户群体会越来越大。所以,一个好的婚庆公司,要不断有新的策划方案,做出与众不同,别出新意的婚礼才能吸引更多人。

十、自媒体行业

现在,随着互联网技术的发展,以及智能化设备的普及,自媒体行业发展也越来越快。像直播带货,短视频拍摄等,深受年轻一代人的喜爱。因为自媒体行业门槛比较低,操作比较简单,不需要太多投入,所以,发展也是非常快。

这是我认为的比较赚钱的一些行业,如有不足,欢迎补充!如果感觉说得有道理,欢迎点赞评论,转发加关注!

遇到这种情况该怎么办?

作为一个多年开发的码农,明确的告诉你,放心去吧

码农,两条出路,一条是在一个小公司,混个管理,因为开发,等你到了30,就很难再有机会出去了

第二条,就是趁着年轻,多出去看看,多学习,才是重要的,虽然到了腾讯,百度这样的公司,会因为开发,模块化,会导致你的工作简单,枯燥,但是,至少,知识面广了,如果能和产品经理,一起创业,那就前途无量。

要不就强大自己,要不,就选择一个好的团队

个人再强大,也干不过一个团队,加油吧。

python做可视化数据分析?

Python语言的可读性、可解释性都很强。还拥有很多方便的第三方库,可以灵活选择需要的库,绘制出很漂亮的可视化图表。

从数据描述、描述性统计分析、模型构建,到最后模型表现对比,都可以使用Python及适当的第三方库,实现精美可视化。

以下,用动手做过的要给案例为例子,做简单说明。案例的具体代码,可以点击文末链接细看!

描述性统计分析阶段:饼图——展现标签类变量,单变量中各类标签的占比

观察数据集中流失与未流失客户的占比情况

环形图(饼图的一种)——按照目标变量进行分类,绘制单个标签变量中不同类型的占比。

环形图,按照客户是否流失进行分类,每类客户中男女的占比

上面展现的这个环形图画法,可以封装为一个函数。调用函数,传入需要绘制的变量,就可以绘制响应变量的双环形图;还可以直接使用for循环,一次绘制n多个图。

甚至还可以根据你想要的展示结果进行调整,一次展示更多内容。

柱状图、直方图——分组展现数值型数据的分布情况

按照是否流失进行划分,观察不同存续期间的用户占比

散点图(Scatter plot)——观察数值型数据分布情况最简单的方法

数据集中三个数值型数据,按照用户是否流失划分之后的散点图

除了展现单变量中的数据分布,还可以绘制双变量散点图,初步观察两个变量之间的关系。

按照存续时间长短份分类,用户月消费与总消费关系散点图

展现变量相关性的Heatmap

heatmap热力图

主成分分析(PCA)结果可视化

输出2维特征的主成分分析结果散点图展示

雷达图(Radar plot)——用于用户画像分析很合适

按照用户是否流失划分,各个分类变量计数情况

模型构建阶段

以逻辑回归为例:

可以显示模型report表格

分类report

混淆矩阵可视化、模型的得分可视化

混淆矩阵和模型得分

特征重要性可视化

特征重要性排序

使用多个模型,可以在最后将所有模型表现进行汇总比较各个指标输出为表格

模型指标得分表格输出

第一列显示了构建的分类模型,一共11个。

各模型、各指标得分情况的水平柱状图

各模型、各指标水平柱状图

各模型混淆矩阵组合图

模型混淆矩阵组合图

模型ROC曲线组合图

模型ROC曲线组合图

模型精密找回曲线组合图

PR曲线组合图

完整过程,可以参照以下文章:

Kaggle|电信客户流失分析:Part one

Kaggle|电信用户流失分析:Part two

Kaggle|电信用户流失分析:Part three

Kaggle|电信用户流失分析:Part four

本文转载自互联网,如有侵权,联系删除