docker images 查看所有镜像

docker rmi 镜像id 删除指定镜像

docker search 镜像名称 查找镜像

docker pull 镜像名称 拉取镜像

进入root用户:

su

如果有安装过docker,卸载旧版本:

yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-engine

安装所需软件包:

yum install -y yum-utils \

device-mapper-persistent-data \

lvm2

设置源地址:

yum-config-manager \

–add-repo \

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装Docker:

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

验证安装成功:

docker -v

启动Docker并开机自启:

systemctl start docker.service

systemctl enable docker.service

配置镜像加速:

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

卸载docker:

yum remove docker-ce

rm -rf /var/lib/docker

你下载的镜像是所有的容器都共享的!

容器的占用其实是很小的

docker容器共享内核空间,但用户空间隔离

共享内核空间即容器不需要每个都运行一个内核实例。这使得容器壁传统的虚拟机更加轻量级,因为每个

vm都得运行一整个客人操作系统和内核

避免重复开销:共享内核避免了多余的资源消耗,如内存和CPU时间,从而提高了效率

cggroup和namespace来实现资源的隔离操作

前面不是说会共享内核吗,我宿主机装的centos

但容器内进入 os-release文件里发现却是ubantu

难道说容器内都有一个操作系统???

其实不是的,容器里安装的只是操作系统的一部分即用户空间,内核空间还是宿主机的

那为什么不共享宿主机的用户空间?

容器内的app下载的依赖不会受到宿主机的影响

redis-cli的hotkeys参数

原理:遍历redis实例中的所有key,然后返回实例中热key信息

但有问题:1.redis的淘汰策略必须为LRU 2.需要全部扫描,性能差 3.信息不够全

Monitor命令统计

原理:Monitor可以实时抓取redis服务器接受到的命令,然后用

现成的访问工具(redis -faina)统计出抓取时间段内的访问的hotkeys

问题:

但它是一个守护进程,你要保证它高可用的

高并发时,内存会暴增

只能统计Monitor命令开启期间

抓包

Client/proxy端收集

客户端和代理端

画板

redis内核改造

参考得物开源

画板

  • 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控制;
  • DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一 个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新 的映射策略;
  • DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器, 即适配器设计模式的应用,从而很容易支持很多类型的处理器;
  • HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处 理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
  • ModelAndView 的逻辑视图名——> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策 略模式,很容易更换其他视图技术;
  • View——>渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此 很容易支持其他视图技术;
  • 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。

PS:什么叫很多类型的处理器

:::color4
Spring MVC 的 HandlerAdapter 就是适配器模式的应用
它让 DispatcherServlet 不需要关心处理器的类型,而是通过不同的适配器去支持 多种风格的处理器(Controller 接口、注解方法、HttpRequestHandler、自定义处理器等)

:::

分布式事务(三)、柔性事务之 TCC、Saga、本地消息表、事务消息、最大努力通知 - 墨天轮

https://zhuanlan.zhihu.com/p/590834427

本地消息表实现

业界常见方案,因为其他框架太重

主要思想就是将分布式事务拆分为本地事务和消息事务两个部分,本地事务在本地数据库提交or回滚,而消息事务则将消息写入消息中间内,以实现消息可靠投递和顺序性

做法

  • 创建一张本地消息表,用于记录要发的消息内容
  • 将业务表操作和消息表创建记录置于同一事务下(不要把发消息行为放进去,不然可能会因为网络延迟,导致生产者误认为是发送失败,造成异常回滚,实际是发送成功了)
  • 消费者端消费成功后,改本地消息状态

某个环节可能出现的错误

  • 消息投递失败,开定时任务,扫表重投
  • 消息消费失败,依靠消息的重投机制,不断重试
  • 回填状态失败,那么相当于业务数据已经一致了,但消息表里的状态是错的。
    • 定时任务继续重投消息,依靠幂等校验,去推进消息状态
    • 查下游系统的状态,如果成功了,则直接推进消息状态即可

优缺点

优点

- 没TCC,stea,2Pc重
- 扩展性好
- 适用范围广

缺点

- 定时任务,扫表性能较开销大
- 实现复杂度相对较高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Autowired
TransactionTemplate transactionTemplate;

public void order(OrderDTO orderDTO){

boolean transactionSuccess = transactionTemplate.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus status) {
try {
orderServive.createOrder(orderDTO);
messageService.createMessage(orderDTO);
//以上执行如果未抛异常,则成功,返回true
return true; // 表示事务执行成功
} catch (Exception e) {
// 如果发生异常,则标记事务为回滚
status.setRollbackOnly();
return false; // 表示事务执行失败
}
}
});

if (transactionSuccess) {
// 事务执行成功,可以执行 mqService.send(orderDTO)
mqService.send(orderDTO);
messageService.updateSuccess(orderDTO);
} else {
// 事务执行失败的处理逻辑
// 可以抛出异常或记录日志等
}
}