当前位置: 首页 > 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 中的空…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...