极客时间课程推荐(第一波)

最近在极客时间学习了一些课程,总上感觉老师写的专栏水准都是挺高的,确实学到了不少内容,重点是每个专栏的价格也不贵,所以推荐给大家,顺便也薅下商家的羊毛。
有想学习的小伙伴可以扫描支持一下。:stuck_out_tongue:

推荐一:朱赟de技术管理课

这个是我购买的第一个课程,硅谷女博士的技术管理科,其实里面不光有技术管理,还有一些工作方法,心路成长总结等,女博士啊,看了之后确实收获不少,我觉得你值得拥有。
[![女博士的技术管理课](https://i.loli.net/2019/09/30/c61CyVhAfKgla8E.jpg "女博士的技术管理课")](https://i.loli.net/2019/09/30/c61CyVhAfKgla8E.jpg "女博士的技术管理课")

推荐二:MySQL实战45讲

这个课程身为码农的我们还真的好好学习一下,这个课程我看了1遍,现在正在看第2遍,说实话第一遍看下来确实挺不容易的,里面对我来说70%以上的章节都是新知识点,而且里面确实干活满满,还得继续学,我的预期是在年底前看完看三遍。
[![大牛丁奇的MySQL课程](https://i.loli.net/2019/09/30/8ClFIShy3c7Ekef.jpg "大牛丁奇的MySQL课程")](https://i.loli.net/2019/09/30/8ClFIShy3c7Ekef.jpg "大牛丁奇的MySQL课程")

推荐三:玩转Git三剑客

这个是个视频课程,60集,当时是因为项目第一次用Git所以买了之后,对一些章节进行了突击学习,这种基础课程60节真的是超值,老师讲的也很细。还犹豫啥不会Git的小伙伴,赶紧来一套。
[![超值Git学习视频教程](https://i.loli.net/2019/09/30/kOZqxnWMuyetzrA.jpg "超值Git学习视频教程")](https://i.loli.net/2019/09/30/kOZqxnWMuyetzrA.jpg "超值Git学习视频教程")

Docker常用命令总结

查看docker服务端和客户端版本
# docker version

查看docker容器信息,显示 Docker 系统信息,包括镜像和容器数。
# docker info

帮助命令
# docker –help

查看docker进程
docker ps
[参数列表]
-l 返回最后的容器的状态
-a 看所有容器包括已经停止的容器

从服务器拉取镜像
# docker pull  

列出本地所有镜像
# docker images
# docker image prune // 删除所有悬虚镜像

存储镜像
# docker save 

载入镜像
# docker load 

删除容器
# docker rmi 

将已终止容器启动
# docker start 

停止正在运行的容器
# docker stop

命令来停止容器或然后再启动容器。
# docker restart

提交本地修改容器
# docker commit 

查看docker容器信息
# docker inspect <容器名>

查看容器
# docker container ls  //查看所有运行的容器
# docker container prune  //删除所有的停止的运行的容器

查看数据卷
# docker volume
# docker volume prune //删除所有停止使用的数据卷

查看docker的宿主机端口映射容器端口
# docker port <容器名>

查看docker 系统镜像、容器、数据卷使用情况
# docker sytem df  

从宿主机进入docker容器
docker exec -it <容器id> bash
docker exec -it <容器id> sh
docker exec -it <容器id> bash
docker exec -it <容器id> sh

物理机和容器之间复制命令如下:
容器复制文件到物理机:docker cp <容器名称>:<容器目录> <物理机目录>
物理机复制文件到容器:docker cp <物理机目录> <容器名称>:<容器目录>
eg:docker cp channelWeb:/opt/tomcat/apache-tomcat-7.0.75/webapps/channel-web.war /home/app/

查看docke容器内日志
# docker logs -f –tail=100  <容器名>

查看docker各容器CPU占用情况
# ctop

运行docker虚拟机
# docker run –name <虚拟机别名> –rm -p <宿主机端口:虚拟机端口>  –network  <自定义网络>  <镜像名称>
[参考资料]
[参数列表]
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开。
-d 让 Docker 容器在后台以守护态(Daemonized)形式运行
-v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。用户也可以通过 :ro 指定为只读。
-p 标示来指定端口。

进入容器 
# docker exec -it <容器名称> bash

导出容器快照
# docker export 

导入容器快照
# docker import 

《RabbitMQ 实战指南》读书笔记

RabbitMQ的模型架构介绍
可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上, RabbitMQ 就好比由邮局、邮箱和邮递员组成的一个系统。
  • producer:生产者(发件人),消息的投递方
  • broker:消息中间件的中间节点(邮局,也可以看作一台Rabbit MQ服务器)
  • exchange:交换器(中分拣员),它根据分发规则,匹配查询表中的routing key,分发消息到queue中去。
  • queue:队列(收件人查收信件时的邮箱)
  • routingkey:路由键(填写在包裹上的地址),在某些情形下, RoutingKey 与BindingKey 可以看作同一个东西。
  • bing:绑定(???),通过绑定将exchange和queue关联起来,某些情况下会分配一个bandingkey(direct、topic)
  • bandingkey:绑定键(于包裹的目的地)
  • comsumer:消费者(收件人),消息的消费方
Exchange分类
  • fanout(广播,一对多)、不用配置RoutingKey 和 BandingKey,交换器会无视BindingKey将消息路由到所有绑定到该交换器的队列中。
  • direct(直连,一对一)、RoutingKey 和 BandingKey 必须相同,消息才能正常发送到queue
  • topic(主题,模糊,一对多)、RoutingKey 和 BandingKey 做模糊匹配,两者不是相同的
  • headers(基本上不用)
Routingkey中可以包含两种通配符
  • “.”  字符串分割符
  • “#” 通配任何零个或多个word
  • “*” 通配任何单个word

connection 和 channel 之间的关系
Connection 可以用来创建多个Channel 实例,但是Channel 实例不能在线程问共享,应用程序应该为每一个线程开辟一个Channel 。某些情况下Channel 的操作可以并发运行,但是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响友送方确认( publisherconfrrm)机制的运行,所以多线程问共享Channel 实例是非线程安全的RabbitMQ 采用类似NIO的做法,选择TCP 连接复用,不仅可以减少性能开销便于管理。同时RabbitMQ 可以确保每个线程的私密性,就像拥有独立的连接一样。当每个信道的流量不是很大时,复用单一的Connection 可以在产生性能瓶颈的情况下有效地节省TCP 连接资源。

每个线程把持一个信道(channel),所以信道复用了Connection 的TCP 连接。当信道本身的流量很大时,这时候多个信道复用一个Connection 就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个Connection ,将这些信道均摊到这些Connection 中,Connection 可以用来创建多个Channel 实例,但是Channel 实例不能在线程问共享,应用程序应该为每一个线程开辟一个Channel 。某些情况下Channel 的操作可以并发运行,但是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响友送方确认( publisher confrrm)机制的运行,所以多线程问共享Channel 实例是非线程安全的。


AMQP 生产者发送消息流程
AMQP 消费者发送消息流程

高级参数
  • mandatory 参数
  • alternate-exchange 备份交换机
  • 过期时间 TTL
    • 设置消息ttl:x-message-ttl
    • 设置队列ttl:x-expires
  • 死信队列 x-dead-letter-exchange
  • 延迟队列,没有直接支持,通过DLX 和TTL 模拟出延迟队列的功能。
  • 优先级队列 x-max-priority

MyBaits常见问题总结


1、mybaits中使用小于号

【错误分析】
如过在mybatis中使用<>&等字符,配置文件中会提示如下错误
The content of elements must consist of well-formed character data or markup.
【解决方法】
方法一   如果是在动态语句中,则需要转换

符号:

方法二 (推荐), 此时特殊符号不进行解析

【参考资料】



2、mybatis 可以返回map类型对象

注意:resultMap  和 resultType 区别



3、mybaits 查询sql中in的写法



4、mybatis 查询like 正规写法

正确方法一:

正确方法二:
like “%”#{name}”%”
错误方法
like ‘%”#{name}”%’
【参考资料】

MySQL数据join不走索引问题排查

【问题场景】

有个30多行的大SQL执行效率特别慢,问题集中在一个子查询上,开始没有建索引,可是发现索引都创建了,不走索引,大SQL简化一下,提出不走索引的部分,如下图所示

简单点,有三张表需要关联查询,关联关系如下

A表

B表 关联 A.col = B.id

C表 关联 B.col = C.id

问题出在 B表 关联 A.col = B.id,为啥?执行计划就是不走id主键,C表 关联 B.col = C.id都可以正常走

【解决思路】

1、尝试单表查询,验证索引是否正常 试了一下单表查询B是可以走主键索引,正常,排出索引问题

2、尝试优化SQL 修改了一下SQL,将left join 分别改为inner join,join和子查询,几种方式都不能走索引,排出优化可能

3、尝试在其他环境执行

发现在其他环境下可以正常,走索引,说明不是SQL的问题,排出SQL问题。

TMD !!! 到底哪出问题

既然有环境可以,肯定是哪里配置有问题,慢慢对比一下,于是从表结构,索引创建方式,逐一排查,还是没有发现问题。

没有思路了,困意来袭,下班回家,明日再战


新的一天开始,没办法,在baidu继续搜搜,“SQL 不走索引”

忽然间发现了一篇文章 https://www.cnblogs.com/jarjune/articles/7912722.html

启发了我,是不是两张表的编码方式不一样呢,有思路来,开搞,哈哈 ……

先看表的编码,哇塞,uft8mb4

再看字段的编码,神马,uft8mb4

我们默认都是uft8,谁干的,我的刀呢 …… 修改了表的编码和字段的编码方式,终于可以正常走索引了

【总结】

  • 对于大SQL,不要抱着大西瓜跑步,轻装上路。精确定位问题,简化问题,逐步缩小范围
  • 在一两个人开发的时候,大家都熟悉规范,使用默认的编码方式,一般会忽略编码方式不同的问题,所以团队开发要注意遵守规范
  • 在使用join连接查询的时候,如果编码不一致,就不走索引了