什么是 Docker?
容器技术的起源假设你们公司正在秘密研发下一个 “今日头条” APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。 测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,“明明在人家的环境上可以运行的”。 从整个过程可以看到,不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。 有的同学可能会说:“等等,先别改变世界,我们有虚拟机啊,VMware 好用的飞起,先搭好一套虚拟机环境然后给测试和运维 clone...
Redis - 集群
哨兵模式sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 slave 进程是否正常工作。 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。 哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。 故障转移时,判断一个 master node 是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题。 即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的,因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就很坑爹了。 哨兵的核心知识 哨兵至少需要 3 个实例,来保证自己的健壮性 哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。 对于哨兵 + redis...
超好用的 Docker 可视化管理工具
今天给大家介绍一个超好用的一款 Docker 容器可视化工具。叫 Portainer,中文名叫集装箱起重机。听名字就知道是个狠角色。把 Docker 吊起来打 首先来看下页面 非常的大气简洁,有一些功能很实用,像什么重启,停止,删除点个按钮就可以实现。 1. 安装镜像 我们先创建 portainer 的目录,这里我选择 /usr/local/docker 下 创建 portainer 文件夹 下载最新版的 portainer 1docker pull portainer/portainer 2. 安装汉化包因为 portainer 默认英文,我们需要下载汉化包,进入 portainer 的目录 (这一步很重要,不然汉化包挂载不到容器内部) 12cd portainerwget https://labx.me/dl/4nat/public.zip --2022-05-01 23:09:00-- https://labx.me/dl/4nat/public.zip 解压汉化包 (这里如果报错,是因为没有下载 unzip 解压软件) 12# 解压unzip...
研究 guava 布隆过滤器
介绍 布隆过滤器采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在 使用场景 redis 防止缓存击穿的解决方案 数据去重 过滤垃圾信息 简单原理 布隆过滤器本质上是一个二进制数组,元素的值不是 1 就是 0. 当我们存一个商品 id 为 10 的商品,假设我们经过三次哈希,存的数组下标为 1,3,7,就将这三个下标的元素改为 1. 这样每次访问 redis 之前,先访问布隆过滤器。查询 id 为 10 的商品的时候,经过布隆过滤器的哈希算法,获取到该商品对应的下标是 1,3,7。那么,如果这三个数组的下标对应的元素都为 1 则表示存在该商品,放行这次请求。如果有一个为 0,则不存在该商品。 布隆过滤器判断存在不一定真的存在,但是,判断不存在则一定不存在。 针对布隆过滤器的一些误判,我们可以增加二进制数组位数或者增加 Hash 次数来解决。 使用布隆过滤器并测试引入谷歌 guava 依赖 12345<dependency> ...
SpringBoot 通过 Ajax 异步上传图片
由于之前使用的是 SSM 框架,使用的是自己的 Tomcat, 换上 SpringBoot 之后 Tomcat 就成内置的了,继续用以前的方法上传都上传在了随机位置,研究了一下图片上传和预览 记录一下需要用到 2 个工具类 (工具类也是从网上下载的), 文末会附上工具类 首先我们要知道 ajax 上传需要的三个重要属性cache: 默认值 true 代表缓存 当设置为 false 的时候,再次发送请求,读的是浏览器的数据而不是之前缓存在浏览器中的数据 可以保证每次都是新的数据processData: 是否序列化数据,默认值是 true 代表将数据序列化,这里我们上传文件设置为 falsecontentType: 默认值 application/x-www-form-urlencoded 是设置我们发送给服务器的数据格式,而常用的 dataType 则是设置我们收到服务器数据的格式先来看一下前台页面,一个简单的上传图片按钮和一个下载按钮 js 中是对应的函数 12345678910111213141516171819202122<html lang="en"...