ThreadLocal在线程池中使用传输
问题由于线程池的创建参数并不依赖当前线程,而且核心线程不会消失,因此应当将线程与主线程视为无关,所以ThradLocal处理的Thread.threadLocals和InheritableThreadLocal处理的Thread.inheritableThreadLocals对于线程池都是无效的。因此为了解决ThreadLocal的传输问题,就不能用InheritableThreadLocal的思想。 本文的思路是既然不能直接线程相关,那么我们是可以把ThreadLocal中的数据拷贝下来,然后在新线程执行的时候设置到新线程中,这样实现传输,原理如下 首先定义一个Runnable用来封装真正要执行的Runnable和ThreadLocal然后在Run的时候用装饰器模式先执行ThreadLocal的设置,然后再执行原本方法,最后再移除 1234567891011121314151617181920212223//线程池封装Runnablepublic class ExecutorThreadLocalRunnableWrapper<T> implements...
centos安装RabbitMQ
安装 elrlang方式一12345678910# 获取elrlang脚本并执行加入存储库curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash## 安装erlang-23.3.4.11 ,这是 centos7最后一个版本yum -y install erlang-23.3.4.11-1.el7.x86_64#获取rabbitmq脚本并加入存储库curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash# 安装 rabbitmq-server-3.8.16yum -y install rabbitmq-server-3.8.16-1.el7.noarch 查看elrlang版本和操作系统对应关系,选择el/7对应的el/7...
linux软件配置
Vim 配置PS: 安装教程见对应系统的安装文章 vim /etc/vim/vimrcvim /etc/vim/vimrc.localvim /etc/vimrc其中一个 12345678910111213141516171819202122syntax on "开启高亮"set nu "显示行号"set showmode "显示模式"set showcmd "显示命令"set showmatch "括号匹配"set autoindent "自动缩进"set smartindent "智能缩进"set tabstop=4 "Tab键宽度"set...
Redis 主从同步详解
Redis 主从同步机制Redis 主从同步是实现高可用和读写分离的基础,包含两个核心阶段:全量复制和增量复制。 核心架构123456789101112主库(Master)├─ 处理写命令├─ 处理读命令├─ 生成 RDB 快照├─ 维护复制缓冲区└─ 向从库同步数据从库(Slave/Replica)├─ 接收主库数据├─ 只读模式(默认)├─ 可以级联复制└─ 支持读写分离(需配置) 阶段一:全量复制(Full Resynchronization)触发时机 从库首次连接主库 从库断线时间过长,复制缓冲区数据已被覆盖 手动执行 SLAVEOF 或 REPLICAOF 命令 完整流程12345678910111213141516171819202122232425261. 从库连接主库 ↓2. 从库发送 PSYNC 命令(首次发送 PSYNC ? -1) ↓3. 主库收到 PSYNC,触发 BGSAVE ↓4. 主库生成 RDB 快照文件 ├─ 调用 fork() 创建子进程 ├─ 子进程生成 RDB 文件 └─ 主进程继续处理客户端请求 ↓5....
Redis写时复制
Redis RDB 的写时复制(Copy-On-Write)写时复制是 Redis 生成 RDB 快照时的核心机制,理解它需要先了解 fork 系统调用。 核心概念1. Fork 系统调用1234567891011121314151617主进程(处理客户端请求):├─ 内存中有 10GB 数据├─ 需要生成 RDB 快照└─ 调用 fork() 创建子进程子进程(生成 RDB):├─ 获得父进程内存的"副本"├─ 将内存数据写入 RDB 文件└─ 完成后退出关键问题:如果 fork 真的拷贝 10GB 数据,需要:- 耗时很长- 需要额外 10GB 内存- 阻塞主进程解决方案:写时复制(COW) 2. 写时复制的工作原理1234567fork() 调用后:主进程内存页: 子进程"看到"的内存页:[页1] [页2] [页3] → [页1] [页2] [页3] ↑ ↑ 实际只有一份物理内存! ...
10 MySQL binlog 开启及使用
开启binlog配置/etc/mysql/my.cnf 在[mysqld]下配置 123456[mysqld]#开启binloglog-bin=/var/lib/mysql/log-binserver-id=1expire_logs_days=7 重启服务,这里使用Mariadb 12345#旧的centos使用这个,centos7 使用systemctl service mysql restart启动MariaDB命令:systemctl start mariadb.service停止MariaDB命令:systemctl stop mariadb.service重启MariaDB命令:systemctl restart mariadb.service 如果为docker,则重启docker服务,重启数据库无效 使用正常运行过程中,会生成日志文件log-bin.000001 log-bin.000002等使用mysqlbinlog工具可以查看文件内容mysqlbinlog log-bin.000001如果报错 unknown variable...
Redis安装配置
安装yum install redis 的版本过低,为3.x版本,因此不适用这种方式 123456# 1、安装Remi的软件源yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm# 2、yum安装redisyum --enablerepo=remi install redis -y# 3、查询redis版本redis-server -v 我安装的时候是redis7 配置打开Redis的配置文件/etc/redis.conf vim /etc/redis.conf 修改bind 1234# 允许ip 默认127.0.0.1bind 0.0.0.0# 解开下面的配置,设置密码,不设置密码允许所有访问是很危险的,如果内网使用则可以考虑不设置requirepass 123456 也可以在reids控制台修改密码config set requirepass 123456 启动systemctl start redis 配置开机启动systemctl enable...
websocket工程搭建
1. 说明websocket是一个全双工的网络协议,可以双向发送消息或接收消息,对于服务端与客户端之间的通信或者客户端相互通信十分友好概念不多说,下面就来搭建一个实际的工程 2. 工程搭建这里的工程搭建springboot结合spring来使用,整合spring的工程;其余的方法可以参见websocket种工程实现办法 2.1. 引入依赖1234567891011<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> ...
Map深层次对象获取工具
Map深层次对象获取工具此工具根据spel表达式,从嵌套Map中获取值,可以简化代码同时提供了Map链式创建的封装 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394public class MapUtil { private static final SpelExpressionParser PARSER = new SpelExpressionParser(); /** * 获取Map中的值 * @param map 需要取出值的map * @param name 取药取出的key 例如 spring.datasource 返回为 Map或Bean结构 * 例如...
树形结构转换工具
...
