2020上半年问题总结

#### 前言 工作的时候,因为是内网开发,所以遇到难题Milo都记在纸上。原本想一月一发,事实上却因为各种缘由拖了大半年,一下子整理起来问题还真有点多。以下内容可以说是问题集锦,或者大杂烩了。 #### 问题总结 + Front-End - 强制刷新 答:使用this.$forceUpdate()...

前言

工作的时候,因为是内网开发,所以遇到难题Milo都记在纸上。原本想一月一发,事实上却因为各种缘由拖了大半年,一下子整理起来问题还真有点多。以下内容可以说是问题集锦,或者大杂烩了。

问题总结

  • Front-End

    • 强制刷新 答:使用this.$forceUpdate();

    • 立即刷新绑定的数据 答:使用this.$set(对象, 属性, 值);

    • Echarts3中,legend如何底部显示? 答:可以使用x和y属性定位。例如:x: ‘center’, y: ‘bottom’

    • Echarts3中,坐标文字如何对齐刻度线? 答:在xAxis或者yAxis中设置axisTick的属性alignWithLabel为true。

    • Echarts3中,如何调整图与外层的边距? 答:调整grid中的left,top,right,bottom属性即可,无需调整div的边距。

    • Echarts3中,如何设置值为0时,不显示tooltip? 答:设置formatter,值为0时,调整回调函数中的params参数。

    • Echarts3的柱状图中,如果某个y值为0,如何设置不显示它的x柱? 答:略。

    • nextTick()的作用?答:在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM。因为Vue实现响应式并不是数据发生变化之后DOM立即变化,而是按一定的策略进行DOM的更新。nextTick()的作用? 答:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。因为Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM。

    • 如何跨页面触发刷新? 答:使用this.root.eventHub.root.eventHub.emit、this.root.eventHub.root.eventHub.on();、this.root.eventHub.root.eventHub.off();。其中,this.root.eventHub.root.eventHub.off()写在beforeDestroy(){}中。

    • vue中引用图片的方式? 答:除了使用@/assets/路径以外,还可以先import图片,然后再引用。

    • 正则表达式:/[,|.| ]|OR/ 答:[]中只匹配其中一个。|右边匹配OR。整体解释是:匹配逗号,句号,空格,或者OR。

    • 埋点的实现? 答:略。

  • Back-End

    • 使用static变量,还是使用@Value,还是使用@PostConstruct? 答:代码中尽量不要不出现魔法数值。取而代之使用取名的静态变量,或者配置。

    • Variable used in lambda expression should be final or effectively final异常。 答:使用数组或者原子类型AtomicInteger。我通常是使用数组,因为有一次使用AtomicInteger时,出现了无法定位的数值不改变问题。

    • yml配置文件中,list或者set的写法? 答:

pets:
	- 1
	- 2
	- 3
// 或者
pets: [1,2,3]
  • 运行docker的几种方式?
docker start container
docker exec container
docker run image
  • 如何删除docker镜像? 答:先使用rm删除容器,再使用rmi删除镜像。

  • 使用poi-tl时,如何在同一个占位符上插入多张图片? 答:首先,一定要是v1.7.0以上,如果要使用#this占位符,一定要v1.7.2以上。其次,修改模板文件,使用区块标签。

  • Json中,如何添加多个相同的key,但value值不同? 答:多加一层JsonObject inner = new JsonObject();

  • Java8如何获取时间戳? 答:LocalTime.now();

  • Java8中,Date类型如何转换成Temporal类型? 答:Date.toInstant。

  • 国密算法? 答:略。有现成的jar包。bcprov-jdk15on的v1.64和hutool-all的5.2.5。

  • 拷贝数组? 答:使用System.arrayCopy(src, srcStart, target, targetStart, length);

  • IDEA重新编译/热部署? 答:CTRL + F9或者JRebel插件。

  • 如何进行自定义全局异常处理? 答:首先创建@ControllerAdvice,其次创建@ExceptionHandler。

  • axis 2中关于RPC调用? 答:略。

  • 如何制作自定义starter? 答:略。

  • @Cacheable和@CachePut的用法 答:@CachePut可以确保方法被执行,同时方法的返回值也被记录到缓存中。@Cacheable当重复使用相同参数调用方法的时候,方法本身不会被调用执行,即方法本身被略过了,取而代之的是方法的结果直接从缓存中找到并返回了。@CachePut和@Cacheable这两个标签可以结合使用,当需要根据请求改变值的时候,利用@CachePut将值改变并写入到缓存中,而@Cacheable标签除了第一次之外,一直是取的缓存的值。注意:必须是同一个缓存实例。且,key值必须是相同的。

  • redisTemplate和stringRedisTemplate操作? 答:redisTemplate是对象操作。stringRedisTemplate是字符串操作。

  • rabbitmq执行流程? 答:rabbitmq——发送——交换器——交换器对应的queue。

  • actuator是什么? 答:起到监控作用。另外,启动配置中,设置-verbose可以显示jvm启动详情。

  • Elasticsearch限制超过10000数据量的查询,如何解决? 答:方法一:通过设置index 的设置参数max_result_window的值。方法二:使用scroll(游标)的方式进行查询。其中,方式二似乎无法进行翻页。

  • @Value(“{}")和@Value("#{}")的区别? 答:前者直接翻译成字符串。如果配置值为空,写法是@Value("{配置项:默认配置}”)。后者是SpEL表达式,会解析内容。如果配置值为空,写法是@Value(”#{表达式?:默认值}”)。如果是在设置list的默认值,将list内容以逗号拼接即可。

  • 如何导出mysql数据? 答:mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名;

  • 如何导入sql文件? 答:进入mysql命令行,source A.sql;

  • SQL如何截取子字符串? 答:substring(“AAA”, 0, 4);表示:从第0位开始,截取4位。

  • token的生成机制? 答:略。

  • awk的用法? 答:略。

经验总结

  1. 修改template和修改借口一样,一定要检查所有使用该组件的地方。
  2. 算法有分布式和非分布式之分,在分布式环境下,要考虑选择的算法是否可用。
  3. 编程的时候一定要有:分布式和大数据的思想,一定要考虑大数据量的情况。例如,前端要考虑显示X亿Y千万,后端要考虑使用多线程处理。
  4. 编程步骤一定是:先写算法思想的注释,再编码。
  5. 实现需求的步骤一定是:先重构现有的代码,再考虑能否最简单的实现方式,考虑后再进行实现。因为一味地添加代码,增加字段,最终只会使系统越来越臃肿,而变得无法维护。
  6. 重构一定是:一个功能一段代码,提高代码复用。变量有时候是必不可少的,可以用于定位异常。
  7. 代码中一定要有log输出,因为上了远程环境,很多时候通过log可以直接定位bug点。
  8. 删除操作尽量不要使用xxxTemplate.delete(),要使用逻辑删除。例如,把某个字段置为1。
  9. 删除数据时,要考虑效率问题。例如,删除7天前的数据,如果7天前的数据有好几十亿,删除操作会影响到业务流程的执行效率。应该考虑异步多线程操作会不会影响到当前的业务需求。
  10. 如果列表中多个组件调用同一个弹出框,不能在for遍历里写弹出框,会导致弹出框组件数据异常,它会总是列表项最后一项。应该在for循环范围外,独立创建一个template。
  11. 前端可以使用+ new Date(),其含义为转换数值。
  12. 后端查询涉及统计/聚集时,可以采用定时写表,随时查询的形式进行。
  13. 定时器的调用可以提取到一个单独的微服务中,首先避免直接调用正式环境的借口。其次,发布时可以独立发布,同样不影响系统运行。
  14. vue中使用watch时,如果设置了immediate为true。它在绑定时会立即执行,监控对象的值为空时也会执行handler。监控时应该判断具体的属性。
  15. 后端修改CRUD代码时,应该时刻谨记数据的回填,保证整个CRUD流程数据回填的完整性。
  16. 为了防止后端乱码问题,配置项和配置值尽量使用英文数字下划线。涉及中文时,提交代码和发布到线上环境,应该将中文转化成accii码。
  17. 系统启动时,一般会将部分数据写入缓存中。应该考虑是否可以提供刷新缓存的接口,和刷新定时器一样,应该单独一个微服务。避免某些数据更新后,需要重启正式环境。

转载须知

本文欢迎转载,但请务必保留原文链接,谢谢!

商业合作请联系邮箱:choibunbing@gmail.com