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

【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案

概述

    由于最近客户需要解决redis版本升级问题,故而全网寻找安全版本,redis7.4.x版本求而为果,只能自己编译了。

截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2

Security fixes

  • (CVE-2024-46981) Lua script commands may lead to remote code execution
  • (CVE-2024-51741) Denial-of-service due to malformed ACL selectors

Bug fixes

  • #13627 Crash on module memory defragmentation
  • #13338 Streams: XINFO lag field is wrong when tombstone is after the last_id of the consume group
  • #13473 Streams: XTRIM does not update the maximal tombstone, leading to an incorrect lag
  • #13470 INFO after HDEL show wrong number of hash keys with expiration
  • #13476 Fix a race condition in the cache_memory of functionsLibCtx
  • #13626 Memory leak on failed RDB loading
  • #13539 Hash: fix key ref for a hash that no longer has fields with expiration on RENAME/MOVE/SWAPDB/RESTORE
  • #13443 Cluster: crash when loading cluster config
  • #13422 Cluster: CLUSTER SHARDS returns empty array
  • #13465 Cluster: incompatibility with older node versions
  • #13608 Cluster: SORT ... GET #: incorrect error message

版本选择

指导修复方案参考,这有助于选择正确的版本。

云数据库 Redis® 升级实例版本-操作指南-文档中心-腾讯云 

实操步骤

1. 准备宿主环境

寻找一个干净的编译环境,博主这里选择虚拟机(vmware 16.2.5 build-20904516)

安装Centos7(CentOS-7-x86_64-Minimal-1804)

其他版本也可,最好根据你需要的系统选择。

2. 准备打包环境


sudo yum update -y
sudo yum groupinstall "Development Tools" -y 
sudo yum install wget gcc make tcl rpm-build redhat-rpm-config -y

3. 获取最新稳定版的源代码

(如果github直连存在问题,请自行魔法上网)


wget https://github.com/redis/redis/archive/refs/tags/redis-7.4.2.tar.gz
tar -xzf redis-7.4.2.tar.gz
cd redis-7.4.2 

3. 编译

make

(可选/推荐) 测试

make test

 

4. 安装到临时目录

mkdir -p /tmp/redis-install

make PREFIX=/tmp/redis-install install

5. 创建RPM约束文件

(1) 创建 RPM 构建目录结构

RPM 构建需要特定的目录结构:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

 

6. 增加配置文件

 mkdir /tmp/redis-install/etc

cp redis-7.4.2/redis.conf /tmp/redis-install/etc/  

这里的redis.conf文件,可以根据你的需要,先把它修改下,基本上就是如下的内容。

requirepass xxxx 是单机加密码的部分,这里我给和谐掉了。

bind 0.0.0.0 ::1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir /var/lib/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
requirepass 你的密码
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled noslowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
 7.  准备规范文件 (SPEC)
创建一个规范文件(例如 redis.spec)
vim ~/rpmbuild/SPECS/redis.spec

(如果想添加编译者的名字和联系方式,可以在配置中给出)

内容如下: 

Name:           redis
Version:        7.4.2
Release:        1%{?dist}
Summary:        An advanced key-value store

License:        BSD
URL:            https://redis.io/
Source0:        redis-%{version}.tar.gz

BuildRequires:  gcc make tcl
Requires:       tcl

%description
Redis is an open-source, in-memory data structure store, used as a database, cache, and message broker.

%prep
%setup -q

%build
make

%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/usr/local/bin
mkdir -p %{buildroot}/etc
mkdir -p %{buildroot}/var/lib/redis
mkdir -p %{buildroot}/lib/systemd/system

# 安装二进制文件
install -m 755 src/redis-server %{buildroot}/usr/local/bin/
install -m 755 src/redis-cli %{buildroot}/usr/local/bin/
install -m 755 src/redis-benchmark %{buildroot}/usr/local/bin/
install -m 755 src/redis-check-aof %{buildroot}/usr/local/bin/
install -m 755 src/redis-check-rdb %{buildroot}/usr/local/bin/

# 安装配置文件
install -m 644 redis.conf %{buildroot}/etc/redis.conf

# 安装 systemd 服务文件
install -m 644 redis.service %{buildroot}/lib/systemd/system/redis.service

%pre
# 检查并备份旧版本的配置文件和数据目录
if [ -f /etc/redis.conf ]; then
    # 备份配置文件
    cp /etc/redis.conf /etc/redis.conf.backup.%{version}
    echo "Old redis.conf backed up to /etc/redis.conf.backup.%{version}"
fi

if [ -d /var/lib/redis ]; then
    # 备份数据目录
    tar -czf /var/lib/redis_backup_%{version}.tar.gz -C /var/lib redis
    echo "Old Redis data directory backed up to /var/lib/redis_backup_%{version}.tar.gz"
fi

# 删除旧版本的服务文件(如果存在)
if [ -f /lib/systemd/system/redis.service ]; then
    rm -f /lib/systemd/system/redis.service
    systemctl daemon-reload
    echo "Old redis.service removed"
fi

%post
# 创建 Redis 用户和组(如果不存在)
groupadd -f -r redis || :  # 创建组,如果已存在则忽略错误
useradd -r -g redis -s /bin/false -M redis || :  # 创建用户,指定组,禁用登录

# 确保数据目录存在并设置权限
mkdir -p /var/lib/redis
chown -R redis:redis /var/lib/redis
chmod 700 /var/lib/redis

# 增加一些补充动作
chown redis:redis /etc/redis.conf
 
chown -R redis:redis  /var/lib/redis/
  
mkdir -p /var/log/redis/
  
touch /var/log/redis/redis.log
  
chown -R redis:redis /var/log/redis/


touch /var/run/redis_6379.pid

chown redis:redis  /var/run/redis_6379.pid

# 重新加载 systemd 配置并启用 Redis 服务
systemctl daemon-reload
systemctl enable redis || :  # 启用服务,忽略可能的错误
systemctl start redis || :  # 尝试启动服务

%preun
if [ $1 -eq 0 ]; then
    # 卸载时停止并禁用 Redis 服务
    systemctl stop redis || :  # 停止服务,忽略可能的错误
    systemctl disable redis || :  # 禁用服务,忽略可能的错误

    # 删除 Redis 服务文件
    rm -f /lib/systemd/system/redis.service
    systemctl daemon-reload || :  # 重新加载 systemd 配置

    # 删除 Redis 用户和组(可选)
    userdel -r redis || :  # 删除用户及其主目录,忽略可能的错误
    groupdel redis || :  # 删除组,忽略可能的错误
fi

%files
/usr/local/bin/redis-server
/usr/local/bin/redis-cli
/usr/local/bin/redis-benchmark
/usr/local/bin/redis-check-aof
/usr/local/bin/redis-check-rdb
/etc/redis.conf
/lib/systemd/system/redis.service
/var/lib/redis/

%changelog
* Tue Feb 11 2025 你的名字 <你的邮箱> - 7.4.2-1
- Initial package for Redis 7.4.2 with configuration file, Tcl dependency, and systemd integration.
- Added backup functionality in %pre script.
 

在你的编译好的文件中,添加 redis.serice, 内容如下:

[Unit]
Description=Redis In-Memory Data Store
After=network.target[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always[Install]
WantedBy=multi-user.target
 8. 打包源码成压缩包

将 Redis 源码打包为 .tar.gz 文件,并将其移动到 SOURCES 目录:

tar -czf ~/rpmbuild/SOURCES/redis-7.4.2.tar.gz redis-7.4.2/

9. 构建RPM包

使用 rpmbuild 命令构建 RPM 包:

rpmbuild -ba ~/rpmbuild/SPECS/redis.spec

 

 基本上到这里就结束了,如果环境一致,操作顺畅的话,你将会在 /root/rpmbuild/RPMS/x86_64 下得到你想要的。

图没截,回头想起来再补吧。

相关文章:

【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案

概述 由于最近客户需要解决redis版本升级问题&#xff0c;故而全网寻找安全版本&#xff0c;redis7.4.x版本求而为果&#xff0c;只能自己编译了。 截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2 Security fixes (CVE-2024-46981) Lua script commands may lead t…...

【网络安全】常见网络协议

1. 网络协议概述 网络协议是网络上两个或多个设备使用的一组规则&#xff0c;用于描述传输顺序和数据结构。网络协议充当数据包中信息附带的指令。这些指令告诉接收设备如何处理数据。协议就像一种通用语言&#xff0c;让世界各地的设备能够相互通信和理解。 尽管网络协议在网…...

电路笔记(元器件):AD 5263数字电位计(暂记)

AD5263 是四通道、15 V、256位数字电位计&#xff0c;可通过SPI/I2C配置具体电平值。 配置模式&#xff1a; W引脚作为电位器的抽头&#xff0c;可在A-B之间调整任意位置的电阻值。也可将W与A(或B)引脚短接&#xff0c;A-W间的电阻总是0欧姆&#xff0c;通过数字接口调整电位器…...

MongoDB 的使用场景

一、内容管理系统 1. 博客平台 文章内容、作者信息、标签、评论等数据结构多样&#xff0c;MongoDB 的无模式特性可轻松应对。比如 WordPress 等博客系统&#xff0c;使用 MongoDB 能灵活存储不同格式和长度的文章内容&#xff0c;以及与文章相关的各种元数据。 2. 新闻网站…...

MongoDB 是什么

MongoDB 是一款文档型数据库&#xff0c;属于 NoSQL 数据库范畴。 一、基本概念 MongoDB 以文档的形式存储数据&#xff0c;文档类似于 JSON 对象&#xff0c;由键值对组成&#xff0c;它以 BSON&#xff08;Binary JSON&#xff09;格式存储在磁盘上&#xff0c;这种格式支持…...

Python3操作MongoDB批量upsert

个人博客地址&#xff1a;Python3操作MongoDB批量upsert | 一张假钞的真实世界 代码如下&#xff1a; mongoClient MongoClient(mongodb://172.16.72.213:27017/) opsDb mongoClient.ops azScheduled opsDb.azScheduledFlowbulkOpers [] for flow in scheduledFlows.valu…...

相机模数转换

模拟图像是什么&#xff1f; 模拟图像是指连续变化的图像&#xff0c;它通常来源于现实世界的物理场景&#xff0c;并通过光学系统&#xff08;如相机镜头&#xff09;投射到感光介质上。模拟图像是连续的&#xff0c;这意味着它在空间和颜色值上都有无穷的细节。例如&#xf…...

C++20 新特性解析

1. 概念(Concepts) 概念是 C++20 引入的一项重要特性,它允许程序员定义类型约束,从而在编译时检查模板参数是否符合某些要求。概念提供了模板参数的限制,使得模板代码更加可读和易于维护。 示例代码: #include <iostream> #include <concepts>// 定义一个…...

C# ManualResetEvent 类 使用详解

总目录 前言 ManualResetEvent 是 C# 中用于线程同步的核心类之一&#xff0c;位于 System.Threading 命名空间下。它的核心功能是通过信号机制控制线程的执行顺序&#xff0c;允许一个或多个线程等待某个信号后再继续运行。与 AutoResetEvent 不同&#xff0c;ManualResetEve…...

动态规划——路径问题②

文章目录 931. 下降路径最小和算法原理代码实现 64. 最小路径和算法原理代码实现 174. 地下城游戏算法原理代码实现 931. 下降路径最小和 题目链接&#xff1a;931. 下降路径最小和 算法原理 状态表示&#xff1a; 经验题目要求&#xff1a;dp[i][j]表示到达[i,j]位置时&…...

ChatGPT macOS 桌面应用让你的编程体验更上一层楼

高效开发必备&#xff1a;ChatGPT macOS 桌面应用亮点盘点 ©作者|Ninja Geek 来源|神州问学 通过 macOS 版 ChatGPT 应用&#xff0c;已经能够更好的和你的生产力工具无缝配合工作。 大概在三四周之前&#xff0c;Anthropic 在 Claude 上推出了一项名为 Computer Use 的功…...

Java持久化之--Spring Data JPA

1、简介 Java持久化技术是Java开发中比较重要的部分&#xff0c;主要用于将对象数据持久化到数据库&#xff0c;或者从数据库中查询数据&#xff0c;简化数据库的CRUD操作。 2、JPA简介 JPA&#xff08;Java Persistence API&#xff09;是Java实现ORM&#xff08;Object Re…...

excel里的函数技巧(持续更新中)

行转列 在 Excel 中&#xff0c;行转列&#xff08;将一行数据转换为一列&#xff0c;或者将一列数据转换为一行&#xff09;是一项常见的操作。你可以使用 转置 功能轻松实现这一操作。 TRANSPOSE(数组)...

基于python sanic框架,使用Nacos进行微服务管理

微服务软件系统构建方式,已经很普及了,通过开源的sanic进行微服务管理,便捷,技术也比较成熟,而在项目实际应用过程中,微服务类型不仅有java的,还有nodejs、python等,尤其是结合算法模型构建的python接口,需要在Nacos进行注册管理。本文内容耗时2天踏坑,亲测一切ok。 …...

Day84:数据可视化

数据可视化是数据分析的重要组成部分,它能直观地展现数据规律,使复杂数据变得易懂。Python 提供了多个数据可视化库,其中最常用的是 Matplotlib 和 Seaborn。今天,我们将学习如何使用这些工具绘制折线图、柱状图、散点图等。 1. 安装和导入库 如果你的 Python 没有安装 Ma…...

fetch() 与 XMLHttpRequest 的差异

fetch() 与 XMLHttpRequest 的差异 fetch() 的功能与 XMLHttpRequest 基本相同&#xff0c;都是向服务器发出 HTTP 请求&#xff0c;但有三个主要的差异。 &#xff08;1&#xff09;fetch()使用 Promise&#xff0c;不使用回调函数&#xff0c;因此大大简化了写法&#xff0…...

TDengine 产品由哪些组件构成

目 录 背景产品生态taosdtaosctaosAdaptertaosKeepertaosExplorertaosXtaosX Agent应用程序或第三方工具 背景 了解一个产品&#xff0c;最好从了解产品包括哪些内容开始&#xff0c;我这里整理了一份儿 TDegnine 产品包括有哪些组件&#xff0c;每个组件作用是什么的说明&a…...

.NET Web-静态文件访问目录浏览

一、Web根目录访问 创建wwwroot文件夹app.UseStaticFiles(); // 启⽤静态⽂件中间件url/路径 进行访问 二、Web根目录之外的文件 app.UseStaticFiles(new StaticFileOptions {FileProvider new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath,&qu…...

SQL数据清理:去除字段值中的多余符号(Demo例子)

目录 前言1. 基础2. 进阶 前言 Excel中有大量不合法的符号&#xff0c;导入到系统之后&#xff0c;数据库有很多脏数据&#xff0c;对此下述展开sql的清洗教程 在数据库的文本字段中&#xff0c;可能会存在多余的逗号或符号&#xff0c;如,销售,, 或 二手车,销售,,这种情况 希…...

.NET版Word处理控件Aspose.Words教程:使用 C# 删除 Word 中的空白页

Word 文档中的空白页会使其看起来不专业并扰乱流程。用户会遇到需要删除 Word 中的空白页的情况&#xff0c;但手动删除它们需要时间和精力。在这篇博文中&#xff0c;我们将探讨如何使用 C# 删除 Word 中的空白页。 本文涵盖以下主题&#xff1a; C# 库用于删除 Word 中的空…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

python数据结构和算法(1)

数据结构和算法简介 数据结构&#xff1a;存储和组织数据的方式&#xff0c;决定了数据的存储方式和访问方式。 算法&#xff1a;解决问题的思维、步骤和方法。 程序 数据结构 算法 算法 算法的独立性 算法是独立存在的一种解决问题的方法和思想&#xff0c;对于算法而言&a…...