当前位置: 首页 > news >正文

【Docker-Dev】Mac M2 搭建docker的redis环境

Redis的dev环境docker搭建

  • 1、前言
  • 2、官方文档重点信息提取
    • 2.1、创建redis实例
    • 2.2、使用自己的redis.conf文件。
  • 3、单机版redis搭建
  • 4、redis集群版
    • 4.1、一些验证
    • 4.2、一些问题
  • 结语

1、前言

本文主要针对M2下,相应进行开发环境搭建,然后做一个文档记录,是第二弹文章,搭建是采用docker compose文件。
 希望对相关人有帮助。如果只想要Docker-Compose文件,请转到第三节的单机模式和第四节的集群模式。

针对第四节集群模式,这里有个地方需要提前说明,目前redis cluster的搭建模式,存在一个问题无法解决,即无法通过Docker暴露出的端口进行宿主机的外部访问连接,后续只能看看是否研究开启tsl或者其他方式允许访问。从内部各种方式可以验证出,集群状态是正常的,而且数据能正常访问。

原本是打算使用redis-commander进行docker集群内访问redis cluster,但是很可惜,官方似乎在docker compose组建的运行环境下是存在问题的,Issue看这。

2、官方文档重点信息提取

redis的docker镜像官网地址在此处点击。

hub地址是需要翻墙访问

2.1、创建redis实例

docker run --name some-redis -d redis

如果想持久化,则是如下命令:

docker run --name some-redis -d redis redis-server --save 60 1 --loglevel warning

redis-server --save 60 1 --loglevel warning,这是传递给 Redis 服务器的参数,它告诉 Redis 服务器在后台每隔 60 秒检查一次数据库,如果有至少一个键被修改,则将其写入磁盘。后面的 1 表示如果至少有一个键被修改,则每秒进行一次检查。–loglevel warning 设置 Redis 服务器的日志级别为 “warning”,表示只记录警告级别的日志。

2.2、使用自己的redis.conf文件。

创建自己的Dockerfile文件,将上下文中的redis.conf添加到/data/中,如下所示

FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

也可以使用docker命令

docker run -v /myredis/conf:/usr/local/etc/redis --name myredis redis redis-server /usr/local/etc/redis/redis.conf

其中/myredis/conf/是包含redis.conf文件的本地目录。使用这种方法意味着你不需要为你的redis容器创建Dockerfile。
映射的目录应该是可写的,因为根据配置和操作模式,Redis可能需要创建额外的配置文件或重写现有的配置文件。

3、单机版redis搭建

先创建redis单机版的目录。

mkdir redis-single

然后在redis-single目录下,创建两个目录,一个是conf,一个是data

mkdir conf data

在conf目录下创建redis.conf文件

# redis-single.conf
# 允许来自任何IP的连接
bind 0.0.0.0
# 设置启动保护模式
# protected-mode yes
# 设置密码
requirepass test123save 900 1      # 在900秒(15分钟)内,如果至少有1个键被修改,就创建一个RDB快照
save 300 10       # 在300秒(5分钟)内,如果至少有10个键被修改,就创建一个RDB快照
save 60 10000     # 在60秒内,如果至少有10000个键被修改,就创建一个RDB快照appendonly yes # 启用了 AOF 持久化
appendfsync everysec   # 将写操作追加到AOF文件并在每秒同步一次

上述配置为aof持久化的时机,解释如下:

关键字持久化时机解释
appendfsyncalways每执行一次更新命令,持久化一次
appendfsynceverysec每秒钟持久化一次
appendfsyncno不会主动执行持久话,依赖于操作系统的空闲调用

然后回退到上一级目录,即redis-single目录下,创建docker-compose.yml文件,文件内容如下所示:

version: '3.1'services:redis-single:image: redis:latestrestart: alwaysports:- "6379:6379"volumes:- /Users/tanqiwei/docker-dev/redis-single/data:/data- /Users/tanqiwei/docker-dev/redis-single/conf/redis-single.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]

然后输入下面命令启动:

docker compose up

请添加图片描述
然后外部用一些redis的可视化客户端连接进行连接,然后进行key的创建和更新都是正常的。
请添加图片描述

4、redis集群版

redis集群版,最开始写的很顺利,而且成功运行,但是目前为止,我依旧没找到任何可以通过外部手段连接该集群的方式,等待后续更新,集群是正常创建的。

由于使用redis cluster,创建3节点主,3节点副本,所以一共是6个节点。

首先创建redis-cluster目录

mkdir redis-cluster

同样是在这个目录下,创建conf data两个文件夹。

mkdir conf data

然后进入conf目录,创建redis-master.conf文件,内容如下:

# redis-cluster.conf
# 启用集群模式
bind 0.0.0.0
cluster-enabled yes
cluster-node-timeout 5000
requirepass test123
cluster-config-file nodes.conf
masterauth test123# 在900秒(15分钟)内,如果至少有1个键被修改,就创建一个RDB快照
save 900 1   
# 在300秒(5分钟)内,如果至少有10个键被修改,就创建一个RDB快照
save 300 10  
# 在60秒内,如果至少有10000个键被修改,就创建一个RDB快照     
save 60 10000     # 启用了 AOF 持久化
appendonly yes
# 将写操作追加到AOF文件并在每秒同步一次
appendfsync everysec   

然后使用cp命令创建另外5个文件(文件内容一模一样)。

tanqiwei@tanqiweideMacBook-Pro conf % ls
redis-master.conf	redis-node2.conf	redis-slave1.conf
redis-node1.conf	redis-node3.conf	redis-slave2.conf

然后回到上一层下的data目录,分别创建如下六个文件夹(文件夹名分别为master、node1、node2、node3、slave1、slave2):

tanqiwei@tanqiweideMacBook-Pro data % ls
master	node1	node2	node3	slave1	slave2

接着回到redis cluster,创建下面的docker-compose文件。

version: '3.1'services:redis-cluster:image: 'redis:latest'entrypoint: /bin/sh -ccommand: >"echo yes | redis-cli --cluster create198.20.0.31:6379198.20.0.32:6379198.20.0.33:6379198.20.0.34:6379198.20.0.35:6379198.20.0.36:6379--cluster-replicas 1 --pass test123"networks:redis_cluster_subnet:ipv4_address: 198.20.0.30depends_on:- redis-master- redis-slave1- redis-slave2- redis-node1- redis-node2- redis-node3redis-master:image: redis:latestrestart: alwaysports:- "7001:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/master:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-master.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.31redis-slave1:image: redis:latestrestart: alwaysports:- "7002:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/slave1:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-slave1.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.32redis-slave2:image: redis:latestrestart: alwaysports:- "7003:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/slave2:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-slave2.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.33redis-node1:image: redis:latestrestart: alwaysports:- "7004:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/node1:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-node1.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.34      redis-node2:image: redis:latestrestart: alwaysports:- "7005:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/node2:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-node2.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.35 redis-node3:image: redis:latestrestart: alwaysports:- "7006:6379"volumes:- /Users/tanqiwei/docker-dev/redis-cluster/data/node3:/data- /Users/tanqiwei/docker-dev/redis-cluster/conf/redis-node3.conf:/etc/redis/redis.confcommand: ["redis-server", "/etc/redis/redis.conf"]networks:redis_cluster_subnet:ipv4_address: 198.20.0.36     networks:redis_cluster_subnet:driver: bridgeipam:config:- subnet: 198.20.0.0/24    

在这个docker compose文件里面,为了能6个节点互联,且能够固定IP,所以我采用了子网的方式。

networks:redis_cluster_subnet:driver: bridgeipam:config:- subnet: 198.20.0.0/24

然后每个redis集群,其实按照单机版的方式处理,只是加了网络的选项,而且配置文件设置了以集群方式开启。

最后定义了一个名为 redis-cluster 的服务,使用最新版本的 Redis 镜像。entrypoint 和 command 部分包含了在容器启动时执行的命令,用于初始化 Redis 集群。

然后执行docker compose up的命令就能启动成功。

请添加图片描述

请添加图片描述

4.1、一些验证

docker exec -it redis-cluster-redis-master-1 /usr/local/bin/redis-cli -c -a test123 --cluster check 198.20.0.31:6379

输出如下所示:

tanqiwei@tanqiweideMacBook-Pro data % docker exec -it redis-cluster-redis-master-1 /usr/local/bin/redis-cli -c -a test123 --cluster check 198.20.0.31:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
198.20.0.31:6379 (b244b72f...) -> 0 keys | 5461 slots | 1 slaves.
198.20.0.33:6379 (183e2e42...) -> 0 keys | 5461 slots | 1 slaves.
198.20.0.32:6379 (cfcf1409...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.>>> Performing Cluster Check (using node 198.20.0.31:6379)
M: b244b72fc5375c7e559ccb02aff9992e0d1aa0d0 198.20.0.31:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 183e2e42276ab7a4dfdfb426cb3e01a65a038362 198.20.0.33:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 91c8156bd7afd58c252d09ea416b68abbd3ddb49 198.20.0.35:6379slots: (0 slots) slavereplicates b244b72fc5375c7e559ccb02aff9992e0d1aa0d0
S: 7cf393d7371a927104ae861cdb8dc675f2a35281 198.20.0.36:6379slots: (0 slots) slavereplicates cfcf14091a752771d47e092321e3f4ade75f6de7
S: df71e5c164e2f99e41b1a951d7bc60c6e9daa7eb 198.20.0.34:6379slots: (0 slots) slavereplicates 183e2e42276ab7a4dfdfb426cb3e01a65a038362
M: cfcf14091a752771d47e092321e3f4ade75f6de7 198.20.0.32:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

redis-cluster-redis-master-1是启动后的redis服务名,按docker ps查询得到。

输入下面命令进入对应的docker服务:

docker exec -it redis-cluster-redis-master-1 /usr/local/bin/redis-cli -c -a test123 -h 198.20.0.31 -p 6379

请添加图片描述

然后进行一些集群信息访问:
请添加图片描述
请添加图片描述

目前可以确认服务内部的ok的,至于最开始无法命令get是因为从节点一般做备份,不允许读取,所以得开readonly命令。

4.2、一些问题

在进行docker compose down或者docker compose stop命令后,再次重启会提示。

[ERR] Node XXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

在google查了许久没有头绪,只能每次重启前进行数据清理。

删除每个redis下的appendonly.aof、dump.rdb、xxx.conf文件。
例如我在redis-cluster目录下时执行这个命令。

rm -rf data/*/*

第二个问题是无法进行外部连接访问,任何redis的连接器包括原生的redis-cli,在docker宿主机的情况下,无法连接内部集群,只能通过容器内部访问。

这个问题找了半天都没有头绪,后续有时间研究出来了,再更新文档

结语

目前搭建redis单机是没问题的,按自己思路搭建集群也没问题,后面发现无法通过宿主机外部连接访问,进行了各种查询,也尝试过海外其他人的方案,都无法让外部宿主机进行访问。
我认为可能有其他方式,或者配置上的问题,目前研究时间有限,等后续抽时间研究好了,再更新文档。

相关文章:

【Docker-Dev】Mac M2 搭建docker的redis环境

Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下,相应进行开发环境搭建,然后做一个文档记录…...

docker +gitee+ jenkins +maven项目 (一)

jenkins环境和插件配置 文章目录 jenkins环境和插件配置前言一、环境版本二、jenkins插件三、环境安装总结 前言 现在基本都是走自动化运维,想到用docker 来部署jenkins ,然后jenkins来部署java代码,做到了开箱即用,自动发布代码…...

IDEA 开发中常用的快捷键

目录 Ctrl 的快捷键 Alt 的快捷键 Shift 的快捷键 Ctrl Alt 的快捷键 Ctrl Shift 的快捷键 其他的快捷键 Ctrl 的快捷键 Ctrl F 在当前文件进行文本查找 (必备) Ctrl R 在当前文件进行文本替换 (必备) Ctrl Z 撤…...

Ubuntu Desktop 死机处理

Ubuntu Desktop 死机处理 当 Ubuntu Desktop 死机时,除了长按电源键重启,还可以使用如下两种方式处理。 方式1:ctrlaltFn 使用 ctrl alt F3~F6: 切换到其他 tty 命令行。 执行 top 命令查看资源占用最多的进程,然后使用 kill…...

Hermite矩阵

Hermite矩阵 文章目录 Hermite矩阵一、正规矩阵【定义】A^H^矩阵【定理】 A^H^的运算性质【定义】正规矩阵、特殊的正规矩阵【定理】与正规矩阵酉相似的矩阵也是正规矩阵【定理】正规的上(下)三角矩阵必为对角矩阵【定义】复向量的内积【定理】Schmitt正交化 二、酉矩阵&#x…...

HTML 实操试题(二)

创建一个简单的HTML文档&#xff1a; 包含<!DOCTYPE html>声明。包含<html>标签&#xff0c;并设置lang属性为英语。包含<head>标签&#xff0c;其中包含<meta charset"UTF-8">和一个自定义的页面标题。包含<body>标签&#xff0c;其…...

MongoDB 面试题

MongoDB 面试题 1. 什么是MongoDB&#xff1f; MongoDB是一种非关系型数据库&#xff0c;被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#xff0c;支持动态查询和索引&#xff0c;也支持BSON格式的数据存储&#xff0c;这…...

LeetCode 1154. 一年中的第几天:2023年最后一道每日一题

【LetMeFly】1154.一年中的第几天&#xff1a;2023年最后一道每日一题 力扣题目链接&#xff1a;https://leetcode.cn/problems/day-of-the-year/ 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&…...

《深入理解JAVA虚拟机笔记》OutOfMemoryError 异常

在《Java 虚拟机规范》的规定里&#xff0c;除了程序计数器外&#xff0c;虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError &#xff08;下文称 OOM&#xff09;异常的可能。 Java堆溢出 Java 堆用于储存对象实例&#xff0c;我们只要不断地创建对象&#xff0c;并…...

R306指纹识别模块指令系统

一&#xff1a;指令集 1. GR_GetImage 指令代码&#xff1a;01H 功能&#xff1a;从传感器上读入图像存于图像缓冲区 2. GR_GenChar 指令代码&#xff1a;02H 功能&#xff1a;根据原始图像生成指纹特征存于 CharBuffer1 或 CharBuffer2 3. GR_Match 指令代码&#xff…...

redis的搭建及应用(三)-Redis主从配置

Redis主从配置 为提升Redis的高可用性&#xff0c;需要搭建多个Redis集群以保证高可用性。常见搭建方式有&#xff1a;主从&#xff0c;哨兵集群等&#xff0c;本节我们搭建一主二从的多Redis架构。 redis主从安装1主2从的方式配置&#xff0c;以端口号为redis的主从文件夹。 主…...

Java学习,一文掌握Java之SpringBoot框架学习文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…...

javaWeb学生信息管理系统2

一、学生信息管理系统SIMS 一款基于纯Servlet技术开发的学生信息管理系统&#xff08;SIMS&#xff09;&#xff0c;在设计中没有采用SpringMVC和Spring Boot等框架。系统完全依赖于Servlet来处理HTTP请求和管理学生信息&#xff0c;实现了信息的有效存储、检索和更新&#xf…...

Linux Shell 019-文本行处理工具sed

Linux Shell 019-文本行处理工具sed 本节关键字&#xff1a;Linux、Bash Shell、文本行处理工具 相关指令&#xff1a;sed、 sed介绍 sed是Stream Editor&#xff08;流编辑器&#xff09;的缩写&#xff0c;简称流编辑器&#xff1b;用来处理文件的。sed是一行一行读取文件…...

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一&#xff1a;fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载&#xff1a;7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…...

【leetcode】栈与队列总结

本文内容来自于代码随想录 栈 用栈实现队列 两个栈实现队列。思路&#xff1a;两个栈分别表示入栈和出栈。 入队&#xff1a;直接入栈出队&#xff1a; a. 出栈为空&#xff0c;先把入栈中的元素全部放到出栈中&#xff08;相当于反过来&#xff0c;这样在出栈的时候先进的元…...

[EFI]HP Spectre 13 v102nl电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 HP Spectre 13 v102nl 处理器Intel Core i7-7500U (7th gen - Kaby Lake)已驱动内存8 GB LPDDR3-1866 SDRAM已驱动硬盘512 GB Toshiba NVMe™ M.2 SSD已驱动显卡Intel HD Graphics 620已驱动声卡Conexant CX8200 (0x2008)已驱动网卡I1211 Gigabit Etherne…...

【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec

【Pytorch】学习记录分享7——PyTorch自然语言处理基础-词向量模型Word2Vec 1. 词向量模型Word2Vec)1. 如何度量这个单词的&#xff1f;2.词向量是什么样子&#xff1f;3.词向量对应的热力图&#xff1a;4.词向量模型的输入与输出![在这里插入图片描述](https://img-blog.csdni…...

【Kotlin 】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中&#xff0c;笔者发现很多异步或者耗时的操作&#xff0c;都使用了Kotlin中的协程&#xff0c;所以特地研究了一番。 定义 关于协程&#xff08;Coroutine&#xff09;&#xff0c;其实…...

用Xshell连接虚拟机的Ubuntu20.04系统记录。虚拟机Ubuntu无法上网。本机能ping通虚拟机,反之不能。互ping不通

先别急着操作&#xff0c;看完再试。 如果是&#xff1a;本机能ping通虚拟机&#xff0c;反之不能。慢慢看到第8条。 如果是&#xff1a;虚拟机不能上网&#xff08;互ping不通&#xff09;&#xff0c;往下一直看。 系统是刚装的&#xff0c;安装步骤&#xff1a;VMware虚拟机…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...