手写单例模式以及保证安全性
单例模式的几个特点 为了确保全局只有一个类的实例,所以类的构造器要私有化 单例类必须由自己创建自己的唯一实例 单例类必须给其他对象提供这一个实例 单例模式是一个最简单的设计模式,属于创建型结构。比如我们 window 中的任务管理器,回收站,操作系统就是一个单例的设计。也就是说我们使用的对象永远是同一个。程序中的单例大致可以分为 4 大类。饿汉式、懒汉式、双重锁和静态内部类。我们先来说饿汉式 饿汉式饿汉式是一个简单的写法,和名字一样。他很饿,饿的话救急着要东西。所以他会在类加载的时候就初始化。是一个线程安全的操作。但因为不是懒加载,所以不管我们用没用这个实例。他都会实例化。可能会造成一些不必要的内存。浪费内存资源。 1234567891011121314151617/** * @className: Singleton * @description: 饿汉式 * @date: 2022/08/25 * @author: Sora33 */public class Singleton { // 饿汉 private static Singleton...
自己写了个一键搭建 Redis 哨兵脚本
最近在家中无聊写了一个一键搭建 Redis 哨兵的脚本,是基于 Docker 搭建的,使用非常简单。 下载地址 https://wwu.lanzout.com/ieaAu09pjrsj 安装脚本流程 先开放阿里云 ICMP(Ipv4)端口,让服务器之间可以建立通信 只需要安装 Docker,Docker 安装跳转 https://soora33.github.io/posts/2733575.html 不需要搭建主从,更不需要安装 redis,脚本都会帮你完成 复制权限,直接执行,输入三个参数,哨兵搭建完成 1. 哨兵介绍大家设想一下,如果我们在生产环境部署一个 Redis,宕机了怎么办,一瞬间访问不到缓存的请求全部打在数据库上,数据库表示你行你上啊。很容易数据库就会崩,数据库一崩,用户数据做不了持久化,连锁反应造成了我们的服务崩溃了,所以,Redis 官方在 2.8 版本加入了 Sentinel 模式,也就是哨兵机制 2. 哨兵机制下面是 Redis...
RabbitMQ 消息确认机制和消息重发机制
一。机制首先我们要知道一条消息的传递过程。 生产者 -> 交换机 -> 队列 我们的生产者生产消息,生产完成的消息发送到交换机,由交换机去把这个消息转发到对应的队列上。这其中我们可能在生产者 -> 交换机丢失消息,也可能在 交换机 -> 队列上丢失消息。因此我们需要引入 2 个概念。 1: 生产者到交换机的可靠保证 (confirmCallback) 确认回调机制 2: 交换机到队列的保证 (returnCallback) 返回回调机制 二。保证生产者到交换机的可靠传递因为我们的消息都要经过路由,然后去对应的队列,所以第一条线路至关重要。我们使用 confirm 机制。这个 confirm 机制是一个异步的,也就是说我们发送一条消息之后可以继续发送下一条消息。比自带的事务好很多。 使用 confirm 机制首先需要在配置文件中开启 confirm 机制 12345678rabbitmq: host: localhost port: 5672 virtual-host: / username: admin password: password...
docker 容器内部设置 vim 镜像
我们有时候要进入到 Docker 容器内部修改一些文件,vi 用不了,vim 更不用说了… 这次主要分享下容器内部设置 vim 镜像,从之前的 10 分钟缩短到现在的 1 分钟。 1. 首先备份一下我们之前的镜像 1cp -a /etc/apt/sources.list /etc/apt/sources.list.bak 2. 接下来,换成国内 163 的镜像 1sed -i 's#http://deb.debian.org#http://mirrors.163.com#g' /etc/apt/sources.list 3. 使用 apt-get 指令,安装 vim 12apt-get updateapt-get install -y vim 安装完成,就可以使用 vim 了,方便快速的搞定
Docker 搭建 Nacos 高可用集群
使用三台阿里云服务器: 第一台: 47.101.102.10第二台: 47.101.102.20第三台: 47.101.102.30 1. 安装 dockerdocker 的安装可以参考我之前的一篇博客 docker 安装 2. 拉取 nacos 镜像使用 docker pull 命令拉取镜像。这里使用 2.0.4 版本 拉取 nacos 镜像docker pull nacos/nacos-server:v2.0.4查看 docker 镜像docker images 3. 创建 nacos 的持久化数据库我们只使用三台服务器中其中一台的数据库就可以,这里使用第一台服务器来作为持久化数据库。直接使用可视化工具创建一个数据库,名字叫 nacos_config然后运行以下 SQL...
RabbitMQ 延迟队列的使用
这次打算说一下 rabbitmq 的延迟队列。 延迟队列,名字中有个队列,队列是先进先出的。所以说延迟队列是一个有方向性的。 其次,延迟队列和普通队列最大的区别就是,普通队列里的消息是希望自己早点被取出来消费。而延迟队列中的消息都是由时间来控制的。也就是说,他们进入队列的时候,就已经被安排何时被取出了 rabbitmq 实现延迟队列主要有种方式。 第一种是使用普通队列和死信队列来模拟实现延迟的效果。大致上是将消息放入一个没有被监听的队列上,设置 TTL (一条消息的最大存活时间) 为延迟的时间,时间到了没有被消费,直接成为私信。监听私信队列来进行操作。 第二种是使用 rabbitmq 官方提供的 delayed 插件来真正实现延迟队列。本文对第二种进行详解 应用场景 订单超时支付取消订单 用户发起退款卖家 3 天不处理自动退款 预约抢购活动,活动开始前 10 分钟短信通知用户 安装延迟插件默认交换机是有 4 种模式的 现在我们去安装延迟插件 https://www.rabbitmq.com/community-plugins.html...
RabbitMQ 六大模式的理解及应用
基本介绍rabbitmq 是一个基于 Erlang 语言开发且非常好用的一款开源的 amqp (高级消息队列)。主要的业务场景有秒杀、消息的订阅分发,抢优惠卷等高并发场景。主要的亮点有三个 三大亮点 解耦:一个系统调用多个模块。互相调用的关系很复杂很麻烦。如果没有消息队列,每当一个新业务接入,我们都要在主系统调用新接口。使用消息队列,我们只需要关心是否送达。服务自己订阅想要的信息即可 削锋:高峰时期对服务器的压力。比如下单的时候,大量的数据直接访问过来根本没时间处理,不妨先把他们存到消息队列里,让服务器不至于崩溃的同时尽可能的快速执行队列中的任务 异步:对于不是特别重要的一些请求。假如说有一个操作,要调用三个服务,a200ms,b300ms,c200ms,如果不使用 mq 的话,用户至少要等 700ms,使用 mq 的话,直接发送 3 条消息到 mq 里,大大减少了耗时时间,同时用户体验也上个档次 说完优点,来说说缺点 三大缺点 系统可用性降低:mq 也会出问题,没使用 mq 之前,a 系统调用 b 系统,b 系统调用 c 系统。这样虽然耦合高,但是可以正常工作。如果把 mq...
MySQL 联合索引笔记
什么是联合索引? 联合索引指的是在一个表上,多个列加起来组成的一个索引。使用联合索引匹配的时候,首先会匹配第一个,如果匹配成功,会继续匹配第二个,依次类推。 最左前缀原则? 我们要使用联合索引,就必须要遵守最左前缀规则,最左前缀指的是查询的时候会从最左的索引开始匹配。比如现在 age 和 name 字段是一个联合索引,现在使用 select id,name from user where name = ‘张三’进行查询,因为这条 SQL 没有对 age 进行条件查询,而 age 又是联合索引的第一个。没有满足最左前缀原则,所以这条 SQL 绝对不会使用联合索引。 实战测试 MySQL 版本为 5.7 创建一张测试表,插入 AA、BB、CC 列的联合索引 123456789101112131415161718192021222324252627282930-- ------------------------------ Table structure for index_test-- ----------------------------DROP TABLE IF...
SpringBoot 整合 xxl-job
官网上是这么介绍 xxl-job 的: XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 特性 1、简单:支持通过 Web 页面对任务进行 CRUD 操作,操作简单,一分钟上手; 2、动态:支持动态修改任务状态、启动 / 停止任务,以及终止运行中任务,即时生效; 3、调度中心 HA(中心式):调度采用中心式设计,“调度中心” 自研调度组件并支持集群部署,可保证调度中心 HA; 4、执行器 HA(分布式):任务分布式执行,任务” 执行器” 支持集群部署,可保证任务执行 HA; 5、注册中心:执行器会周期性自动注册任务,调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址; 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; 7、触发策略:提供丰富的任务触发策略,包括:Cron...
5 分钟学会内网穿透
最近,在搞自己的一个项目。搭了一个 Micrometer+prometheus+grafana 的一个监控平台。 先给大家看一下结果 编辑 这个监控平台可以帮助我们查看项目的运行状态。包括 JVM 的堆占用、非堆占用、网络请求频率、CPU 使用率、新生代老年代等等。是一个非常全面的一个监控平台。 但是在搭建的时候,因为我 prometheus 是部署在服务器上的。我的项目跑在本地。这就很尴尬了,服务器访问不到我本机的项目。这不就大眼瞪小眼了吗。于是,二话不说,把内网穿透撸了一遍。 一。下载 cpolar我们需要一款工具来帮助我们实现内网穿透。我用的是 cpolar,又简单又快速。 https://www.cpolar.com/ 直接去上面官网,(记得注册一个账号) 下载 zip 然后解压安装。 安装完成后你会发现上面都没有发生,别着急。进入安装目录,打开 web 控制台。 输入我们刚刚注册好的账号密码。 输入我们本地项目的端口号。比如这里我设置的就是 http://localhost:8080 的地址 直接创建 然后点开隧道列表...