小项目也可以学习到很多东西

今天分享关于最近做的一个小项目学习一些感悟。

1.小项目也能学习到非常多的知识

最近做的是一个数据整理的一个项目,后台系统需要一些统计的数据,如果从原有的系统中查询,会大大影响到其他端的性能,而且相对于手机端去直接用户,后台系统面对的是公司人员和运营人员,用户量少,但是查询的数据确不少,需要做大量的计算,而这大量的计算就耗掉服务器的性能。为了保证线上手机和前端的性能,数据库做了优化工作,建立的索引也是根据用户来建立。后台系统搜索的条件特别多,没有建立的索引的情况下,在大量的数据中查询数据,还包括大量的计算,这就造成性能的影响,那么就需要哪空间换时间,并且后台系统要求的实时性并不高,那么就可以将关心的数据抽取出来,放到新的数据库中,然后在新的数据库中进行聚合,得到后台系统需要的数据,这里可以看关于数据仓库的概念。那么我做的这个项目就是将数据从原数据库中抽取数据到新数据库中,任务很简单。

但是,这个小项目却让我学习到很多知识:

1.数据库格式的问题,开发人员创建的数据库的字段都不做统一,因为公司用了两种数据库,mysql和mongodb,从这两个数据库中抽取数据,由于我使用的mysql当数据存储,在创建表字段时,就遇到特别多的麻烦,字段长度不同一,很多数据都没有做强制性规范,mysql和mongodb数据不同一,不过这不统一也正常,但是程序中又有了规范,如果按照程序中做,但是数据库中有大量不规范的数据字段。

2.做好数据容错处理,很多数据时增量抽取,即抽取前一天的数据,但是突然发现前两天的数据有一点问题,那么该如何做,需要在程序中启动另一个监听线程,该监听线程是每十分钟会读取数据库中的一个字段,该字段是否为true,为true则将这几天的数据删除,重新抽取。

3.因为跑的数据有先后顺序,例如需要先抽取用户的信息,然后对用户信息进行统计,如果用户的信息出现错误,那么后续的统计都会有问题。这里我设计了一个任务处理的小框架。在这个其中需要做到任务的顺序可配置,前一个任务没执行完,后续任务不能执行,一个队列中的任务可并行执行,不同优先级的任务串行执行。在实现这个逻辑,学习到了java中队列,树形结构,学习了多线程的知识,为了程序设计优美,学习了单例模式,观察者模式(EventBus),为了能够极大简化代码,使用注解,学习guava包,common-lang包中类,并且在该项目中添加了异常后发送邮件功能。

这是这个 很小的项目,我在其中学习很了特别多的知识。很多时候,在抱怨每天都在做增删改查的工作,感觉每天都做的是体力活,完全不费脑力的工作,其实不然,想要将工作做好,需要花费特别多的经历。写接口做的就是增删改查的工作,但是其中的能够操作的空间极大,使用SpringBoot做项目,是否在项目中添加了拦截工作,对请求过来做一些基础工作如日志打印,对异常是否有做统一的处理工作,后续的是否有做单元测试,对于接口是否有做压测,要将一个功能或者是一个项目做好,是需要非常多的精力的,所以小项目,如果我们肯花心思去做,发现会有特别多的事情要做,而且在这个小项目中可以学习到非常多的东西。

2.敢于实践,将想法都化成代码

将自己思想都化作代码,但是能够做到完全将思想化作代码是非常困难的。

很多时候,我们看别人分享,我们也记住了其中如何操作的,例如redis作为缓存,遇到缓存雪崩,缓存穿透等问题都能够说出个一二三来,但很少去亲手去实践。遇到这样的场景真的很少,比如我,开发了两年,公司的数据都很少,并发也不高,一个小的redis的集群,完全支持了线上访问,也不会遇到缓存穿透导致的查询速度慢的情况。如果没有真正遇到,动手解决过该问题,并不能很好的去理解该问题是什么一个情况,即使别人分享的很透彻,那也是他真正去解决过,形成了自己的经验。而我们看了,也是只住了有这么一个问题。而看到该问题,需要去将问题重现,并按照他人分享的方式去解决,这样才能是自己真正学到收了。

业务上没有碰到这样的问题,那该怎么办呢,那么就去模拟,自己东西写程序,然后利用工具模拟大量的请求,实现高并发的情况,观察在高并发的情况下,redis和数据库的情况,然后在根据该情况解决该问题,最后再来验证该问题。当自己做完这些的时候,才能真正的说自己做过在高并发的情况下,解决reidis缓存的一些问题。

再比如分库分表,网上有非常多的文章来介绍其思路。但是线上数据在并不大的情况下是不需要分库分表的,那么仅仅是看了文章,并没有深入的去了解,一个表面映像,如果是到了下一个公司,突然问分库分表的问题,虽然能够简单的说一下思路,但是真的讲操作的时候,很可能就错误百出。并且当已经是线上程序了,需要做分库分表工作时,需要该如何处理呢,线上程序停下来维护,将数据搬移到新的数据库中?是否有更好的方式呢,是否可以进行双写的操作,即数据的插入不仅写入旧数据库中,也写入分库分表中,然后将数据的更新删除操作发送到消息中间件中,当旧数据库中的数据都搬移到数据库中,然后将程序的数据库切换成分库分表数据库,消费消息中间件的消息,最后写一个程序进行数据的比对。这一系列的操作过程,只有在实际操作中能够得到检验,也只有在实践中才能将别人的知识化成自己的知识。

总结:编程是一个需要花精力做的事情,不要抱怨每天干的仅仅是增删改查的工作,小的项目也可以变成一个内容很丰富的项目,在小项目中也可以学习到非常多的知识。

你可能感兴趣的:(java)