Linux云计算SRE-第十七周
1. 做三个节点的redis集群。
1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本
[root@node0 ~]# vim install_redis.sh#!/bin/bash
# 指定脚本解释器为bashREDIS_VERSION=redis-7.2.7
# 定义Redis的版本号PASSWORD=123456
# 设置Redis的访问密码INSTALL_DIR=/apps/redis
# 指定Redis的安装目录CPUS=$(lscpu | awk '/^CPU\(s\)/{print $2}')
# 获取CPU核心数量,用于编译时的并行处理. /etc/os-release
# 加载系统发行版信息color () {# 定义一个函数,用于输出彩色文本信息RES_COL=60MOVE_TO_COL="echo -en \\033[${RES_COL}G"SETCOLOR_SUCCESS="echo -en \\033[1;32m"SETCOLOR_FAILURE="echo -en \\033[1;31m"SETCOLOR_WARNING="echo -en \\033[1;33m"SETCOLOR_NORMAL="echo -en \E[0m"echo -n "$1" && $MOVE_TO_COLecho -n "["if [ $2 = "success" -o $2 = "0" ] ;then${SETCOLOR_SUCCESS}echo -n $" OK " elif [ $2 = "failure" -o $2 = "1" ] ;then ${SETCOLOR_FAILURE}echo -n $"FAILED"else${SETCOLOR_WARNING}echo -n $"WARNING"fi${SETCOLOR_NORMAL}echo -n "]"echo
}prepare(){# 准备安装环境,安装Redis编译所需的依赖包if [ $ID = "centos" -o $ID = "rocky" ];thenyum -y install gcc make jemalloc-devel systemd-develelseapt update apt -y install gcc make libjemalloc-dev libsystemd-devfiif [ $? -eq 0 ];thencolor "安装软件包成功" 0elsecolor "安装软件包失败,请检查网络配置" 1exitfi
}install() {# 安装Redisif [ ! -f ${REDIS_VERSION}.tar.gz ]; then# 如果Redis源码包不存在,则下载wget http://download.redis.io/releases/${REDIS_VERSION}.tar.gz || { color "Redis 源码下载失败" 1; exit; }fitar xf ${REDIS_VERSION}.tar.gz -C /usr/local/src# 解压源码包到/usr/local/srccd /usr/local/src/${REDIS_VERSION}# 进入解压后的目录make -j $CPUS USE_SYSTEMD=yes PREFIX=${INSTALL_DIR} install && color "Redis 编译安装完成" 0 || { color "Redis 编译安装失败" 1; exit; }# 编译并安装Redis,使用CPU核心数量加速编译ln -s ${INSTALL_DIR}/bin/redis-* /usr/local/bin/# 创建Redis命令的软链接到/usr/local/binmkdir -p ${INSTALL_DIR}/{etc,log,data,run}# 创建Redis所需的目录结构cp redis.conf ${INSTALL_DIR}/etc/# 复制Redis配置文件到安装目录的etc子目录sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' \-e "/# requirepass/a requirepass $PASSWORD" \-e "/^dir .*/c dir ${INSTALL_DIR}/data/" \-e "/logfile .*/c logfile ${INSTALL_DIR}/log/redis-6379.log" \-e "/^pidfile .*/c pidfile ${INSTALL_DIR}/run/redis_6379.pid" ${INSTALL_DIR}/etc/redis.conf# 修改Redis配置文件,设置密码、数据目录、日志文件和PID文件路径if id redis &> /dev/null; thencolor "Redis 用户已存在" 1elseuseradd -r -s /sbin/nologin rediscolor "Redis 用户创建成功" 0fi# 检查Redis用户是否存在,不存在则创建chown -R redis.redis ${INSTALL_DIR}# 更改Redis安装目录的拥有者为redis用户cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 1024
vm.overcommit_memory = 1
EOFsysctl -p# 修改系统内核参数并应用if [ $ID = "centos" -o $ID = "rocky" ]; thenecho 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.localchmod +x /etc/rc.d/rc.local/etc/rc.d/rc.localelseecho -e '#!/bin/bash\necho never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.localchmod +x /etc/rc.local/etc/rc.localfi# 禁用透明大页,根据系统类型选择不同的方法cat > /lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \$MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000[Install]
WantedBy=multi-user.target
EOF# 创建Redis的systemd服务文件systemctl daemon-reloadsystemctl enable --now redis &> /dev/null# 重新加载systemd配置,并启用Redis服务if [ $? -eq 0 ]; thencolor "Redis 服务启动成功,Redis信息如下:" 0elsecolor "Redis 启动失败" 1exitfi# 检查Redis服务是否启动成功,并输出相应信息sleep 2redis-cli -a $PASSWORD INFO Server 2> /dev/null# 等待2秒,然后使用redis-cli获取Redis服务器信息
}prepare
# 调用prepare函数准备环境install
# 调用install函数安装Redis
2、构建redis节点node0(10.0.0.100)、node1(10.0.0.101)、node2(10.0.0.102)的集群。
[root@node0 ~]# bash install_redis.sh
# 执行install_redis.sh脚本以安装Redis[root@node0 ~]# sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/a cluster-require-full-coverage no' /apps/redis/etc/redis.conf
# 使用sed命令修改Redis配置文件,启用密码认证、集群模式等[root@node0 ~]# systemctl restart redis
# 重启Redis服务以应用配置更改# 以下命令用于在其他节点上复制脚本、安装Redis并配置集群模式
[root@node1 ~]# scp install_redis.sh 10.0.0.110:/root
# 将脚本复制到node1
[root@node2 ~]# scp install_redis.sh 10.0.0.120:/root
# 将脚本复制到node2[root@node1 ~]# bash install_redis.sh
# 在node1上执行脚本安装Redis
[root@node1 ~]# sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/a cluster-require-full-coverage no' /apps/redis/etc/redis.conf
# 修改node1上的Redis配置
[root@node1 ~]# systemctl restart redis
# 重启node1上的Redis服务[root@node2 ~]# bash install_redis.sh
# 在node2上执行脚本安装Redis
[root@node2 ~]# sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/a cluster-require-full-coverage no' /apps/redis/etc/redis.conf
# 修改node2上的Redis配置
[root@node2 ~]# systemctl restart redis
# 重启node2上的Redis服务[root@node0 ~]# redis-cli -a 123456 --cluster create 10.0.0.100:6379 10.0.0.110:6379 10.0.0.120:6379
# 使用redis-cli命令创建Redis集群,包含node0、node1和node2上的Redis实例
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 6a1fcf17824b5b05000d222d4f5fc54f5eb95ba3 10.0.0.100:6379slots:[0-5460] (5461 slots) master
M: f54c4e03dd0e6d6c64804a0645d28a17012ffe16 10.0.0.110:6379slots:[5461-10922] (5462 slots) master
M: 4c2d7e08d91d439b00f7d692269afc8073bd1597 10.0.0.120:6379slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join>>> Performing Cluster Check (using node 10.0.0.100:6379)
M: 6a1fcf17824b5b05000d222d4f5fc54f5eb95ba3 10.0.0.100:6379slots:[0-5460] (5461 slots) master
M: 4c2d7e08d91d439b00f7d692269afc8073bd1597 10.0.0.120:6379slots:[10923-16383] (5461 slots) master
M: f54c4e03dd0e6d6c64804a0645d28a17012ffe16 10.0.0.110:6379slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node0 ~]#redis-cli -a 123456 -c INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:4f5c6acc29267a7c0abb5d99683fbb122b77c816
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0[root@node1 ~]#redis-cli -a 123456 -c INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:273975d582c1f2dcce034819de2d425e085c550c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0[root@node2 ~]#redis-cli -a 123456 -c INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:0e495f096ccffdace37cd7c452c3f6c5db44e69e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
2. 总结redis持久化的两种方式和原理
Redis 持久化是将内存数据存储到硬盘,防止服务器宕机导致数据丢失的机制,主要提供 RDB 和 AOF 两种方式:
一、RDB 持久化
原理:
1、快照式持久化:在特定时间点生成内存数据的二进制快照(RDB 文件,默认 dump.rdb),通过 rdbSave 函数将数据序列化写入文件。重启时通过 rdbLoad 函数加载数据到内存。
2、触发机制:
- 手动触发:
SAVE:阻塞主线程生成快照,影响服务。
BGSAVE:后台 fork 子进程生成快照,不阻塞主线程。
- 自动触发:通过配置文件 save <seconds> <changes> 设置条件(如 save 900 1 表示 900 秒内至少 1 次修改触发)。
优缺点:
优点:
文件紧凑(二进制压缩),加载速度快,适合备份与灾难恢复。
缺点:
数据可能丢失(两次快照间的修改未持久化)。
大数据量时 fork 子进程可能占用较多内存,影响性能。
二、AOF 持久化
原理:
- 命令追加式持久化:记录所有写操作命令到文本文件(默认 appendonly.aof),重启时重放命令恢复数据。
- 写回策略(通过 appendfsync 配置):
always:每次写操作同步写入磁盘,数据最安全但性能最低。
everysec(默认):每秒批量同步,平衡安全与性能(最多丢失 1 秒数据)。
no:依赖操作系统同步,性能最高但数据风险最大。
- 文件重写:
目的:压缩冗余命令(如多次 set 同一键),生成更小的新 AOF 文件。
实现:后台异步执行,不影响主线程处理新命令。
优缺点:
优点:
数据安全性高(可配置实时/准实时持久化)。
文件可读性强,支持手动修复或恢复误操作。
缺点:
文件体积较大,恢复速度慢于 RDB。
高并发写入时可能影响性能(尤其是 always 模式)。
三、总结
对比项 | RDB | AOF |
---|---|---|
数据安全性 | 可能丢失部分数据 | 更高(依赖策略) |
文件大小 | 小(二进制压缩) | 大(文本记录命令) |
恢复速度 | 快(直接加载内存快照) | 慢(逐条执行命令) |
性能影响 | fork 子进程可能占用内存 | 频繁写入可能增加 I/O 压力 |
实际应用建议:
- 高安全性场景:启用 AOF(
everysec
模式)。 - 快速恢复场景:启用 RDB。
- 综合方案:同时开启 RDB + AOF(RDB 用于定期备份,AOF 保障实时数据安全)。
3.从内核事件原理层面阐述为什么redis这么快
Redis的极致性能来源于多个层面的协同优化,尤其在内核事件处理机制上表现突出。从内核事件原理层面来看,主要归因于以下几个关键因素:
一、内存存储:内核访问的物理基础
Redis 将数据存储在内存中,内存的直接访问速度是磁盘的 10^5~10^6 倍,避免了磁盘 I/O 的阻塞问题。
-
内核与内存协作:
内核通过页缓存(Page Cache)和直接内存映射(mmap)机制管理内存,Redis无需频繁与磁盘交互,所有操作均在用户态内存中完成,减少了系统调用和上下文切换次数。 -
零拷贝优化:
当 Redis 响应客户端请求时,数据从内存直接写入内核的套接字缓冲区(Socket Buffer),通过sendfile或writev系统调用实现零拷贝传输,减少数据在内核态与用户态之间的复制开销。
二、单线程模型与事件驱动:内核事件的高效调度
Redis 采用 单线程 Reactor 模式,结合 I/O 多路复用技术,最大化利用内核的事件通知机制。
-
I/O 多路复用的内核实现:
-
使用 epoll(Linux)或 kqueue(BSD)监听所有客户端连接的套接字。
-
当某个套接字就绪(可读/可写)时,内核通过事件回调通知 Redis 主线程,触发对应的文件事件处理器。
-
优势:
-
水平触发(LT):确保事件不丢失,适合 Redis 的请求处理模式。
-
边缘触发(ET):减少重复通知,提升效率。
-
-
-
单线程的优势:
-
零锁竞争:无需处理多线程的锁同步问题,避免死锁和上下文切换开销。
-
无阻塞操作:所有操作(命令执行、响应发送)均非阻塞,主线程专注于事件循环。
-
-
事件循环(aeEventLoop):
-
核心流程:
-
通过 epoll_wait 监听就绪事件。
-
将事件分发给对应的处理器(如命令请求处理器、命令回复处理器)。
-
处理完所有就绪事件后,检查时间事件(如定时任务)。
-
-
优先级策略:优先处理文件事件(用户请求),确保实时性。
-
三、高效数据结构:减少内核交互开销
Redis 的数据结构设计以内存高效访问和低系统调用频率为目标:
-
SDS(简单动态字符串):
-
预分配内存空间,减少 malloc 系统调用次数。
-
记录字符串长度,避免遍历计算长度(O(1) 时间复杂度)。
-
-
跳表(Skip List):
-
多层索引结构加速范围查询,减少遍历次数。
-
内存连续访问模式,提升 CPU 缓存命中率。
-
-
压缩列表(ZipList):
-
紧凑内存布局,减少内存碎片和缺页中断(Page Fault)概率。
-
四、持久化机制:内核的异步协作
Redis 通过fork子进程实现 RDB 和 AOF 持久化,利用内核的写时复制(Copy-On-Write)机制:
-
RDB 快照:
-
子进程通过fork创建,共享父进程内存页。
-
内核在父进程修改内存时触发写时复制,子进程独立持久化数据,避免阻塞主线程。
-
-
AOF 日志:
-
主线程将命令追加到内核缓冲区,子进程异步刷盘,通过 fsync 控制同步策略(如 everysec 平衡性能与安全)。
-
五、通信协议:内核缓冲区的批量处理
Redis 使用 RESP 协议,通过批量数据格式减少网络传输次数:
-
批量数据格式:将多个命令或响应合并传输,减少 read/write 系统调用次数。
-
内核缓冲区优化:
-
客户端请求和响应数据先写入内核缓冲区,由内核异步完成网络传输,避免主线程阻塞。
-
通过TCP_CORK 或 Nagle 算法合并小包,减少网络报文数量。
-
优化维度 | 内核事件原理的体现 | 性能收益 |
---|---|---|
内存存储 | 避免磁盘 I/O 阻塞,依赖内核页缓存和零拷贝技术 | 读写延迟低至微秒级 |
单线程与事件驱动 | 基于 epoll 的事件通知机制,无锁无上下文切换 | 单线程吞吐量达 10W+ QPS |
数据结构 | 减少内存碎片和系统调用,提升 CPU 缓存命中率 | 复杂操作(如范围查询)效率高 |
持久化 | 子进程与写时复制(COW)机制,避免主线程阻塞 | 持久化过程对服务影响极小 |
通信协议 | 批量数据格式 + 内核缓冲区异步传输 | 网络传输效率高,延迟波动小 |
综上所述,Redis之所以能够在性能上表现出色,主要得益于其基于内存的存储设计、单线程模型与事件驱动机制、高效的数据结构设计、持久化机制以及高效的通信协议等多个方面的优势。Redis 通过内核事件机制的高效调度,结合内存存储、单线程模型和数据结构优化,在高并发、低延迟、高吞吐场景下表现卓越,成为内存数据库的标杆。
相关文章:

Linux云计算SRE-第十七周
1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...

Python在数字货币交易中的算法设计:从策略到实践
Python在数字货币交易中的算法设计:从策略到实践 随着区块链技术的发展和加密货币市场的繁荣,数字货币交易已经成为金融领域的一个重要分支。从个体投资者到量化基金,算法交易(Algorithmic Trading)正在为提高交易效率和决策质量提供强大的支撑。在这些技术应用中,Pytho…...

高纬度、跨极区导航技术
本文是何昆鹏老师所写,在此非常感谢何老师的分享。 全球导航,特别是极区导航,一直被美俄导航领域所关注。美俄本身部分国土就处于极区,很多战略军事部署与全球航线也都处于该区域,加之其战略军事任务也都强调全球覆盖…...

用AI学编程2——python学习1
一个py文件,学会所有python所有语法和特性,给出注释,给出这样的文件 Python 学习整合文件 """ Python 学习整合文件 包含 Python 的基础语法、数据结构、函数定义、面向对象编程、异常处理、文件操作、高级特性等内容 每个部…...

用数据唤醒深度好眠,时序数据库 TDengine 助力安提思脑科学研究
在智能医疗与脑科学快速发展的今天,高效的数据处理能力已成为突破创新的关键。安提思专注于睡眠监测与神经调控,基于人工智能和边缘计算,实现从生理体征监测、智能干预到效果评估的闭环。面对海量生理数据的存储与实时计算需求,安…...

Ubuntu下MySQL的安装与使用(一)
目录 用户切换 MySQL的安装 MySQL的初步使用 登录与退出 Linux和mysql中的普通用户和root用户 查看、创建与使用 简单应用 MySQL 数据库在 Linux 文件系统中的存储结构 数据库、数据库服务、数据库管理系统(宏观) 微观下的DBMS SQL语言及其分…...

步进电机软件细分算法解析与实践指南
1. 步进电机细分技术概述 步进电机是一种将电脉冲信号转换为角位移的执行机构,其基本运动单位为步距角。传统步进电机的步距角通常为 1.8(对应 200 步 / 转),但在高精度定位场景下,这种分辨率已无法满足需求。细分技术…...

pytorch retain_grad vs requires_grad
requires_grad大家都挺熟悉的,因此穿插在retain_grad的例子里进行捎带讲解就行。下面看一个代码片段: import torch# 创建一个标量 tensor,并开启梯度计算 x torch.tensor(2.0, requires_gradTrue)# 中间计算:y 依赖于 x&#x…...

RabbitMQ消息队列中间件安装部署教程(Windows)-2025最新版详细图文教程(附所需安装包)
目录 前言 一、安装Erlang环境 1、下载Erlang安装包 2、安装Erlang 3、设置环境变量 二、安装RabbitMQ环境 1、下载RabbitMQ安装包 2、安装RabbitMQ 3、设置环境变量 三、启动RabbitMQ 1、开启RabbitMQ管理插件 2、启动RabbitMQ 四、访问RabbitMQ 前言 RabbitMQ 是…...

vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结
上一个新公司接手了一个vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后台管理项目,因为vue2在2023年底已经不更新维护了,elementUI也只支持到vue2,然后总结了一下vue3的优势,最后批准升级成为了vitevue3vue-router4.5element…...

车载以太网测试-3【Wireshark介绍】
1 摘要 Wireshark 是一款开源的网络协议分析工具,广泛用于网络故障排查、协议分析、网络安全检测等领域。它能够捕获网络数据包,并以详细的、可读的格式显示这些数据包的内容。广泛应用于车载网络测试,是车载网络测试工程师必须掌握的工具。…...

扫雷雷雷雷雷雷雷
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节课我们不学习新的知识,我们来做一个扫雷小游戏 目录 扫雷小游戏概述一、扫雷游戏分析…...

图片分类实战:食物分类问题(含半监督)
食物分类问题 simple_class 1. 导入必要的库和模块 import random import torch import torch.nn as nn import numpy as np import os from PIL import Image #读取图片数据 from torch.utils.data import Dataset, DataLoader from tqdm import tqdm from torchvision impo…...

RuoYi框架添加自己的模块(学生管理系统CRUD)
RuoYi框架添加自己的模块(学生管理系统) 框架顺利运行 首先肯定要顺利运行框架了,这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…...

机器学习在地图制图学中的应用
原文链接:https://www.tandfonline.com/doi/full/10.1080/15230406.2023.2295948#abstract CSDN/2025/Machine learning in cartography.pdf at main keykeywu2048/CSDN GitHub 核心内容 本文是《制图学与地理信息科学》特刊的扩展评论,系统探讨了机…...

【JAVA架构师成长之路】【电商系统实战】第9集:订单超时关闭实战(Kafka延时队列 + 定时任务补偿)
30分钟课程:订单超时关闭实战(Kafka延时队列 定时任务补偿) 课程目标 理解订单超时关闭的业务场景与核心需求。掌握基于 Kafka 延时队列与定时任务的关单方案设计。实现高并发场景下的可靠关单逻辑(防重复、幂等性)。…...

《探秘课程蒸馏体系“三阶训练法”:解锁知识层级递进式迁移的密码》
在人工智能与教育科技深度融合的时代,如何高效地实现知识传递与能力提升,成为众多学者、教育工作者以及技术专家共同探索的课题。课程蒸馏体系中的“三阶训练法”,作为一种创新的知识迁移模式,正逐渐崭露头角,为解决这…...

K8s 1.27.1 实战系列(六)Pod
一、Pod介绍 1、Pod 的定义与核心设计 Pod 是 Kubernetes 的最小调度单元,由一个或多个容器组成,这些容器共享网络、存储、进程命名空间等资源,形成紧密协作的应用单元。Pod 的设计灵感来源于“豌豆荚”模型,容器如同豆子,共享同一环境但保持隔离性。其核心设计目标包括…...

Java CountDownLatch 用法和源码解析
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

Unity引擎使用HybridCLR(华佗)热更新
大家好,我是阿赵。 阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司,在面试的时候很重要的一个点,就是会不会用Lua。使用Lua的原因很简单,就是为了热更新。 热更新游戏内容很重要。如果…...

深度学习进阶:神经网络优化技术全解析
文章目录 前言一、优化问题的本质1.1 目标1.2 挑战 二、梯度下降优化算法2.1 基础SGD2.2 动量法2.3 Adam优化器 三、正则化技术3.1 L2正则化3.2 Dropout 四、学习率调度4.1 为什么要调度?4.2 指数衰减4.3 ReduceLROnPlateau 五、实战优化:MNIST案例5.1 完…...

肿瘤检测新突破:用随机森林分类器助力医学诊断
前言 你有没有想过,科技能不能在肿瘤检测中发挥巨大的作用?别着急,今天我们将带你走进一个“聪明”的世界,通过随机森林分类器进行肿瘤检测。对,你没听错,机器学习可以帮助医生更快、更准确地判断肿瘤是良性还是恶性,就像医生口袋里的“超级助手”一样,随时准备提供帮…...

DeepSeek学习 一
DeepSeek学习 一 一、DeepSeek是什么?二、Deepseek可以做什么?模型理解提问内容差异使用原则 模式认识三、如何提问?RTGO提示语结构CO-STAR提示语框架DeepSeek R1提示语技巧 总结 一、DeepSeek是什么? DeepSeek是一家专注通用人工…...

编程考古-Borland历史:《.EXE Interview》对Anders Hejlsberg关于Delphi的采访内容(上)
为了纪念Delphi在2002年2月14日发布的25周年(2020.2.12),这里有一段由.EXE杂志编辑Will Watts于1995年对Delphi首席架构师Anders Hejlsberg进行的采访记录。在这次采访中,Anders讨论了Delphi的设计与发展,以及即将到来的针对Windows 95的32位版本。 问: Delphi是如何从T…...

高并发之接口限流,springboot整合Resilience4j实现接口限流
添加依赖 <dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>1.7.0</version> </dependency><dependency><groupId>org.springframework.boot…...

电脑如何拦截端口号,实现阻断访问?
如果你弟弟喜欢玩游戏,你可以查询该应用占用的端口,结合以下方法即可阻断端口号,让弟弟好好学习,天天向上! 拦截端口可以通过防火墙和路由器进行拦截 ,以下是常用方法: 方法 1:使用…...

RK3588 安装ffmpeg6.1.2
在安装 ffmpeg 在 RK3588 开发板上时,你需要确保你的开发环境(例如 Ubuntu、Debian 或其他 Linux 发行版)已经设置好了交叉编译工具链,以便能够针对 RK3588 架构编译软件。以下是一些步骤和指导,帮助你安装 FFmpeg: 1. 安装依赖项 首先,确保你的系统上安装了所有必要的…...

SQL SELECT DISTINCT 语句
在 SQL 中,SELECT DISTINCT 语句用于从表中查询不重复的值。这对于需要从数据库检索唯一值时非常有用。DISTINCT 关键字会去除结果集中重复的行,只返回唯一的记录。 SELECT DISTINCT column1, column2, ... FROM table_name; column1, column2, ... 是…...

MELON的难题
MELON的难题 真题目录: 点击去查看 E 卷 200分题型 题目描述 MELON有一堆精美的雨花石(数量为n,重量各异),准备送给S和W。MELON希望送给俩人的雨花石重量一致,请你设计一个程序,帮MELON确认是否能将雨花石平均分配。 输入描述 第1行输入为雨花石个数: n,0 < n &l…...

Restful 接口设计规范
一、资源与 URL 1. 使用名词表示资源 URL 应该以名词为主,用来表示具体的资源,而不是动词。例如,/users 表示用户资源集合,/users/{id} 表示单个用户资源。 2. 采用复数形式 一般来说,资源的 URL 应该使用复数形式…...