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

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 模式)。

三、总结
对比项RDBAOF
数据安全性可能丢失部分数据更高(依赖策略)
文件大小小(二进制压缩)大(文本记录命令)
恢复速度快(直接加载内存快照)慢(逐条执行命令)
性能影响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 多路复用技术,最大化利用内核的事件通知机制。

  1. I/O 多路复用的内核实现

    • 使用 epoll(Linux)或 kqueue(BSD)监听所有客户端连接的套接字。

    • 当某个套接字就绪(可读/可写)时,内核通过事件回调通知 Redis 主线程,触发对应的文件事件处理器。

    • 优势

      • 水平触发(LT):确保事件不丢失,适合 Redis 的请求处理模式。

      • 边缘触发(ET):减少重复通知,提升效率。

  2. 单线程的优势

    • 零锁竞争:无需处理多线程的锁同步问题,避免死锁和上下文切换开销。

    • 无阻塞操作:所有操作(命令执行、响应发送)均非阻塞,主线程专注于事件循环。

  3. 事件循环(aeEventLoop)

    • 核心流程

      1. 通过 epoll_wait 监听就绪事件。

      2. 将事件分发给对应的处理器(如命令请求处理器、命令回复处理器)。

      3. 处理完所有就绪事件后,检查时间事件(如定时任务)。

    • 优先级策略:优先处理文件事件(用户请求),确保实时性。

三、高效数据结构:减少内核交互开销

        Redis 的数据结构设计以内存高效访问和低系统调用频率为目标:

  1. SDS(简单动态字符串)

    • 预分配内存空间,减少 malloc 系统调用次数。

    • 记录字符串长度,避免遍历计算长度(O(1) 时间复杂度)。

  2. 跳表(Skip List)

    • 多层索引结构加速范围查询,减少遍历次数。

    • 内存连续访问模式,提升 CPU 缓存命中率。

  3. 压缩列表(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的访问…...

lvgl在ubuntu中模拟运行

文章目录 前言具体的步骤 前言 lvgl是一个图像UI的开源框架&#xff0c;用于嵌入式的设备之中。 在学习lvgl时&#xff0c;我们最好是现在PC上模拟运行&#xff0c;所以我们学习lvgl的第一步可以说是在我们的电脑上搭建模拟的运行环境。 参考官方的操作 lvgl在ubuntu上模拟运…...

Unity引擎使用HybridCLR(华佗)热更新

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

【Linux】权限相关知识点

思考 我们平时使用Linux创建文件或目录时的默认权限是多少&#xff1f; [rootlocalhost test]# mkdir dir [rootlocalhost test]# touch file [rootlocalhost test]# ll total 0 drwxr-xr-x 2 root root 6 Mar 8 15:23 dir #755 -rw-r--r-- 1 root root 0 Mar 8 15:23 f…...

Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)

1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…...

vue3 vite项目安装eslint

npm install eslint -D 安装eslint库 npx eslint --init 初始化配置&#xff0c;按项目实际情况选 自动生成eslint.config.js&#xff0c;可以添加自定义rules 安装ESLint插件 此时打开vue文件就会标红有问题的位置 安装prettier npm install prettier eslint-config-pr…...

Python Flask框架学习汇编

1、入门级&#xff1a; 《Python Flask Web 框架入门》 这篇博文条理清晰&#xff0c;由简入繁&#xff0c;案例丰富&#xff0c;分十五节详细讲解了Flask框架&#xff0c;强烈推荐&#xff01; 《python的简单web框架flask【附例子】》 讲解的特别清楚&#xff0c;每一步都…...

Excel·VBA江西省预算一体化工资表一键处理

每月制作工资表导出为Excel后都需要调整格式&#xff0c;删除0数据的列、对工资表项目进行排序、打印设置等等&#xff0c;有些单位还分有“行政”、“事业”2个工资表就需要操作2次。显然&#xff0c;这种重复操作的问题&#xff0c;可以使用VBA代码解决 目录 代码使用说明1&a…...

【A2DP】SBC 编解码器互操作性要求详解

目录 一、SBC编解码器互操作性概述 二、编解码器特定信息元素(Codec Specific Information Elements) 2.1 采样频率(Sampling Frequency) 2.2 声道模式(Channel Mode) 2.3 块长度(Block Length) 2.4 子带数量(Subbands) 2.5 分配方法(Allocation Method) 2…...

redis数据类型以及底层数据结构

redis数据类型以及底层数据结构 String&#xff1a;字符串类型&#xff0c;底层就是动态字符串&#xff0c;使用sds数据结构 Map:有两种数据结构&#xff1a;1.压缩列表&#xff1a;当hash结构中存储的元素个数小于了512个。并且元 …...

R软件线性模型与lmer混合效应模型对生态学龙类智力测试数据层级结构应用

全文链接&#xff1a;https://tecdat.cn/?p40925 在生态与生物学研究中&#xff0c;数据常呈现复杂结构特征。例如不同种群、采样点或时间序列的观测数据间往往存在相关性&#xff08;点击文末“阅读原文”获取完整代码、数据、文档&#xff09;。 传统线性模型在处理这类非独…...

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果&#xff1a; PixPin_2025-02-19_09-15-59 效果图&#xff1a; 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…...

C语言-语法

数据类型 字符串 C中字符串拼接不用+号,直接使用空格。 char* str = "hello" "world"; 换行链接,加上\就不会报错 char* longStr = "00000000000000000000000000000\ 00000000000000000000000000000"; typedef C 语言提供了 typedef …...

Unity组件TrailRenderer屏幕滑动拖尾

Unity组件TrailRenderer屏幕滑动拖尾 介绍制作总结 介绍 今天要做一个拖动效果&#xff0c;正好用到了TrailRenderer这个组件&#xff0c;正好分享一下 效果参考如下&#xff1a; 制作 1.创建空物体TrailObject添加组件TrailRenderer 下面的材质可以根据自己想要制作的效果去…...

基于昇腾MindIE与GPUStack的大模型容器化部署从入门到入土

引言 昇腾MindIE作为华为面向大模型推理的高性能引擎&#xff0c;结合GPUStack的集群管理能力&#xff0c;能够实现多机多卡的高效资源调度与模型服务化部署。本文将以DeepSeek R1-32B模型为例&#xff0c;详细解析从环境准备到服务验证的全流程实践&#xff0c;涵盖昇腾NPU驱…...

大模型信息整理

1. Benchmarks Reasoning, conversation, Q&A benchmarks HellaSwagBIG-Bench HardSQuADIFEvalMuSRMMLU-PROMT-BenchDomain-specific benchmarks GPQAMedQAPubMedQAMath benchmarks GSM8KMATHMathEvalSecurity-related benchmarks PyRITPurple Llama CyberSecEval2. 国内外…...

【Tools】Windows下Git 2.48安装教程详解

00. 目录 文章目录 00. 目录01. Git简介02. Git参考资料03. Git安装04. Git测试05. 附录 01. Git简介 Git(读音为/gɪt/。)是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。 [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核…...

【linux网络编程】套接字编程API详细介绍

在C语言中&#xff0c;套接字&#xff08;Socket&#xff09;编程主要用于网络通信&#xff0c;尤其是在基于TCP/IP协议的应用程序开发中。常用的套接字编程API主要基于Berkeley Sockets&#xff08;伯克利套接字&#xff09;接口&#xff0c;这些函数通常在<sys/socket.h&g…...

护网中shiro常问的问题

1. 漏洞原理 Apache Shiro 是一个强大的 Java 安全框架&#xff0c;提供身份验证、授权、加密及会话管理功能。Shiro 使用 rememberMe 机制来存储用户会话信息&#xff0c;该机制依赖于加密后的 Cookie。当攻击者能够控制 Cookie 并且服务器使用了不安全的反序列化机制时&…...

fastapi房产销售系统

说明&#xff1a; 我希望用fastapi写几个接口&#xff0c;查询房产交易系统的几条数据&#xff0c;然后在postman里面测试 查询客户所有预约记录&#xff08;含房源信息&#xff09;需要对应销售经理查询客户所有订单&#xff08;含房源信息&#xff09;统计销售经理名下所有房…...

swift -(5) 汇编分析结构体、类的内存布局

一、结构体 在 Swift 标准库中&#xff0c;绝大多数的公开类型都是结构体&#xff0c;而枚举和类只占很小一部分 比如Bool、 Int、 Double、 String、 Array、 Dictionary等常见类型都是结构体 ① struct Date { ② var year: Int ③ var month: Int ④ …...

软件工程笔记下

从程序到软件☆ 章节 知识点 概论☆ 软件的定义&#xff0c;特点&#xff0c;生存周期。软件工程的概论。软件危机。 1.☆软件&#xff1a;软件程序数据文档 &#xff08;1&#xff09;软件&#xff1a;是指在计算机系统的支持下&#xff0c;能够完成特定功能与性能的包括…...

ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框

1、启用选择任意一级选项 在 el-cascader 标签上加上配置项&#xff1a; :props"{ checkStrictly: true }"例如&#xff1a; <el-cascaderref"selectedArrRef"v-model"selectedArr":options"optionsList":props"{ checkStri…...

【项目日记(九)】细节优化与对比测试

前言 上面我们对申请和释放的过程都已写完&#xff0c;并进行了单线程的联调。本期我们来对一些细节进行优化以及与malloc 进行对比测试。 目录 前言 一、大于256KB的内存申请问题 • 申请过程 • 释放过程 • 简单测试 二、使用定长内存池脱离使用new 三、优化释放对…...

PyTorch系列教程:编写高效模型训练流程

当使用PyTorch开发机器学习模型时&#xff0c;建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件&#xff0c;并演示如何构建一个精细的训练循环流程&#xff0c;有效地处理数据处理&#xff0c;向前和向后…...

10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 第一篇&#xff1a;Avatar 组件基础概念与设计1. 组件概述2. 接口设计2.1 形状类型定义2.2 尺寸类型定义2.3 组件属性接口 3. 设计原则4. 使用…...

C++编程指南24 - 避免线程频繁的创建和销毁

一&#xff1a;概述 线程的创建和销毁是昂贵的操作&#xff0c;尤其在多线程程序中频繁创建和销毁线程时&#xff0c;可能会导致性能问题。 二&#xff1a;示例 这段代码中&#xff0c;dispatcher 每收到一个 Message 就创建一个新的线程来处理这个消息。这种方式虽然简单&…...

C语言——【全局变量和局部变量】

&#x1f680;个人主页&#xff1a;fasdfdaslsfadasdadf &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 1.&#x1f680; 全局变量2.&#x1f680; 局部变量3.&#x1f680; 局部和全局变量&#xff0c;名字相同呢? 1.&#x1f680; 全局变量 全局变量&…...

浅谈 DeepSeek 对 DBA 的影响

引言&#xff1a; 在人工智能技术飞速发展的背景下&#xff0c;DeepSeek 作为一款基于混合专家模型&#xff08;MoE&#xff09;和强化学习技术的大语言模型&#xff0c;正在重塑传统数据库管理&#xff08;DBA&#xff09;的工作模式。通过结合其强大的自然语言处理能力、推理…...

Web服务器配置

配置虚拟主机&#xff1a;启动XAMPP的Apache&#xff0c;在htdocs目录中创建www.php.test目录 创建index.html&#xff0c;内容为“Welcome www.php.test”&#xff0c;访问两个虚拟主机 访问权限控制 在Apache的主配置文件httpd.conf中&#xff0c;默认已经添加了一些目录的…...