责任链模式的设计与实现
责任链模式的设计与实现责任链是什么 解耦请求发送者和接收者:发送者无需知道请求被哪个处理器处理 动态组合处理器:可以灵活的动态改变链的结构 请求沿链传递:请求可以由链中的一个或多个处理器处理 一般用在什么场景 请求需要多个处理器:日志记录的不同级别处理 动态指定处理流程:请求的处理方式不固定,依赖于运行时的链条结构 清除条件分支:责任链代替if else或者switch语句 责任链模式的组成 处理器接口(Handler):定义处理请求的通用方法和设置下一个处理器的方法 具体处理器(Concrete Handler):实现处理器接口,处理请求或传递给下一个处理器 实现/** * 责任链请求对象:封装审批所需的上下文数据 * 说明:用于在处理器链中传递与共享数据 * @author Jaymr */@Getter@AllArgsConstructorpublic class ApprovalRequest { private final String applicant; // 申请人 private final String purpose; /...
策略模式相关
策略模式的介绍与实现策略模式是什么?策略模式是一种行为型设计模式,它允许你定义一系列算法,将每个算法封装起来,并使他们可以相互替换。让算法独立于他的调用方而变化。 比如:我们需要根据不同的支付环境去调用不同的支付策略。一般我们会写if else或者switch 但是有了策略模式,我们可以将每个支付策略封装成一个独立的类,并通过上下文类来调用不同的策略。这样就可以在不修改调用方代码的情况下,动态切换支付策略。 实现策略模式/* * 说明:以下代码演示策略模式(Strategy Pattern)。 * 建议在实际工程中将每个类/接口拆分到独立的文件中。 *//** * 支付策略的统一接口,定义支付行为 * 策略模式的 Strategy 角色:提供算法/行为的抽象 * @author Jaymr */interface PaymentStrategy { /** * 执行支付动作 * @param orderId 订单ID * @param amount 支付金额(单位:分) * @return 支付结果描述 */ Str...
关于Linux部署Java项目
Linux新服务器初始化部署Nginx 安装Nginx 首先要进行依赖下载 yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 在Linux上下载Nginx wget http://nginx.org/download/nginx-1.25.1.tar.gz 注:这也可以在windows上去手动下载Nginx的包,让后放到Linux系统中 (可选)为了方便管理,我们把这些软件放到一个文件夹中统一管理 # 创建文件夹 mkdir /usr/java#将包移入文件夹中 mv nginx-1.25.1.tar.gz /usr/java#转换到该文件夹下 cd /usr/java 解压包 #解压包tar -zxf nginx-1.25.1.tar.gz#转换到nginx文件夹下cd nginx-1.25.1 配置nginx ./configure 出现如下界面即为成功 编译nginx makemake install 出现“Leaving dir...
基于WebSocket和Netty打造聊天服务器
基于WebSocket和Netty打造聊天服务器什么是WebSocketWebSocket是一种基于TCP的通信协议,他在单个TCP连接上提供全双工通道。客户端和服务器建立连接之后,双方可以主动推送数据,而不需要反复握手 你可以设想一下,你和你朋友聊天,传统的HTTP就是对讲机,我说完了之后,你才能说。WebSocket就像打电话一样,两个人可以自由沟通。 关键特性:一次握手,长期使用,低延迟,轻量级。 好处传统的HTTP协议是无状态,短链接的,导致实时应用必须轮询。WebSocket则是 解决实时性需求 减少网络开销 支持双向通信 Spring集成WebSocket,只需要在类上加一个注解即可: // Spring Boot中,可用@ServerEndpoint注解快速创建WebSocket端点@ServerEndpoint("/chat")public class ChatEndpoint { @OnOpen public void onOpen(Session session) { System.out....
binlog的使用手册
binlog的使用手册binlog都能干嘛binlog是一个二进制日志文件记录数据变更,它可以 数据恢复 主从同步 数据回滚 核心价值就是记录所有数据库的数据变更,实现数据追踪与复制 怎么用binlog首先我们要在my.cnf中配置 [mysqld][mysqld]# 基本设置server-id = 1 # 必须设置!单机可设为1log_bin = /var/lib/mysql/mysql-bin # binlog路径(确保目录存在)mysql-bin为前缀binlog_format = ROW # 推荐ROW模式,数据最安全expire_logs_days = 7 # 自动清理7天前的日志max_binlog_size = 100M # 单个日志文件大小character-set-server=utf8mb4collation-server=utf8mb4_unicode_ci# 高级优化(可选)sync_binlog = 1 # 每次事务都刷盘(最安全)binlog_row_image = full # 记录完整行数据 关于binlog-format的三种...
Redis的主从同步
Redis主从同步什么是Redis的主从模式主从模式中,一个高可用的Redis服务由一个主节点和若干个从节点组成。Redis中采用读写分离来保证主节点和从节点之间的数据一致性, 主节点支持数据写入和数据读取,从节点只支持数据读取 主节点会与从节点之间执行主从数据同步,以保证主节点数据和从节点数据的一致性 主从数据同步主从数据同步主要分为以下几种情况: 从节点与主节点刚建立连接时进行全量同步 主节点与从节点正常运行时的数据同步 主节点与从节点连接断开后又重连时会进行增量同步或者全量同步 全量同步触发条件 从节点第一次连接主节点 从节点保存的复制id和主节点不匹配 从节点的复制偏移量不在主节点的复制积压缓冲区中 执行步骤 从节点向主节点发送PSYNC命令从节点通过配置文件中的replicaof {masterip} {port} 获得主节点ip和port,然后向主节点发送psync {repID} {offset} 指令,其中repID表示主节点唯一标识,offset为复制偏移量,因为当前从节点与主节点尚未连接,且尚未开始复制,所以repID为 ?,offset为 -1;发...
Redis防止订单超卖
Redis防止订单超卖背景想象一下,你开了一家超火爆的奶茶店,每天限量 100 杯招牌奶茶。顾客们都在线疯狂抢购。核心问题就是:如何确保这 100 杯奶茶不会被第 101 个顾客抢走? 简单地在数据库里减库存 stock = stock - 1是绝对不行的,高并发下瞬间就超卖了! 解析核心目的就是要解决在高并发下单的场景下,保证商品库存扣减的原子性和一致性 Redis是基于内存的,读写速度快,能抗住高并发。Redis可以使用Lua脚本实现CAS语义,可以将判断库存和扣减库存绑定为一个原子操作,确保在操作执行的时候不会出错。 实现 首先编写一个lua脚本 -- KEYS[1]: 库存的键名,例如: stock:product_1001-- ARGV[1]: 要购买的数量 (通常是 1,字符串类型,需要转数字)local stock_key = KEYS[1]local quantity_to_buy = tonumber(ARGV[1])-- 1. 获取当前库存local current_stock = tonumber(redis.call('GET...
CAS机制
CAS机制知识点助记可以把CAS比作去停车场停车 车位状态牌 = 内存中的值(V) 你看到的空位 = 预期值(A) 你的车 = 新值(B) 管理员 = CPU的原子指令 只有当你亲眼看到车位是空的(A=V)才能把自己的车停进去(V=B)。这期间被别人抢先就要重新观察 解析CAS(Compare-And-Swap)是CPU提供的原子指令。顾名思义:比较并交换。 CAS属于乐观锁的一种实现方式,主要就是为了解决synchronized等锁机制会导致线程阻塞/唤醒的性能消耗 它在并发下是没有锁的,线程不阻塞,可以通过重试来解决冲突 使用Redis实现防止商品超卖
MySQL的日志种类
MySQL的日志种类日志种类大体分为以下几种 错误日志 (Error Log):就像快递公司的客服投诉和系统故障记录本。 二进制日志 (Binlog):就像快递公司的所有包裹出入库的流水账。 重做日志 (Redo Log):就像快递仓库门口的临时装卸记录板。 回滚日志 (Undo Log):就像快递公司的包裹退回记录单。 慢查询日志 (Slow Query Log):就像快递公司的效率监控报告。 通用查询日志 (General Query Log):就像快递公司的全方位监控录像。 分析 Error Log他主要是记录MySQL服务器启动、运行、停止过程中一些严重的警告和错误信息 再my.cnf中配置: [mysqld]log-error = /var/log/mysql/error.log # 指定错误日志文件路径 Binlog - 核心这是一个逻辑日志,记录所有更改数据的SQL语句或数据行,但不包括SELECT和SHOW这类的查询 主要应用场景有 主从复制 数据恢复 审计 在my.cnf中配置 [mysqld]server-id = 1 # 主从复制...
MySQL的MVCC
MySQL的MVCC知识点助记现在,图书馆(数据库)里面有一本非常热门的小说,很多人都想读,也有些人想在上面写。 如果没有MVCC,那么这一本书一次就只能借给一个人,这保证了数据安全,但效率极低(串行化) 有MVCC: 每当有人要写笔记(UPDATE),他就把当前书页复制一份,让读者在复印件上写,原书永远留在图书馆 当有人要读的时候(SELECT),管理员就会根据这个读者的入馆时间,给他看那一刻所有书的快照复印件 解析MVCC (Multi-Version Concurrency Control):多版本并发控制。 主要通过为数据行创建多个版本(快照)来实现并发控制,读操作读取的是历史某个节点的的旧版本快照,写操作则创建新版本,这样做到读写分离,不会阻塞这样可以大幅提升数据库在读写混合场景下的并发性能。 具体实现InnoDB主要通过三个关键技术和一个核心组件来实现MVCC 隐藏字段 每行数据都有两个或三个隐藏字段 DB_TRX_ID(6字节):事务ID,标识最后一个插入或更新此行数据的事务ID DB_ROLL_PTR(6字节):回滚指针,指向这条记录的上一个版本的地...
