裝修行業(yè)門戶網(wǎng)站模板交換友情鏈接
概述
? ? 由于最近客戶需要解決redis版本升級(jí)問題,故而全網(wǎng)尋找安全版本,redis7.4.x版本求而為果,只能自己編譯了。
截止發(fā)文時(shí)間2025-02-12 最新穩(wěn)定版的redis版本號(hào)為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
版本選擇
指導(dǎo)修復(fù)方案參考,這有助于選擇正確的版本。
云數(shù)據(jù)庫 Redis? 升級(jí)實(shí)例版本-操作指南-文檔中心-騰訊云?
實(shí)操步驟
1. 準(zhǔn)備宿主環(huán)境
尋找一個(gè)干凈的編譯環(huán)境,博主這里選擇虛擬機(jī)(vmware?16.2.5 build-20904516)
安裝Centos7(CentOS-7-x86_64-Minimal-1804)
其他版本也可,最好根據(jù)你需要的系統(tǒng)選擇。
2. 準(zhǔn)備打包環(huán)境
sudo yum update -y
sudo yum groupinstall "Development Tools" -y?
sudo yum install wget gcc make tcl rpm-build redhat-rpm-config -y
3. 獲取最新穩(wěn)定版的源代碼
(如果github直連存在問題,請(qǐng)自行魔法上網(wǎng))
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
(可選/推薦) 測(cè)試
make test
?
4. 安裝到臨時(shí)目錄
mkdir -p /tmp/redis-install
make PREFIX=/tmp/redis-install install
5. 創(chuàng)建RPM約束文件
(1) 創(chuàng)建 RPM 構(gòu)建目錄結(jié)構(gòu)
RPM 構(gòu)建需要特定的目錄結(jié)構(gòu):
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文件,可以根據(jù)你的需要,先把它修改下,基本上就是如下的內(nèi)容。
requirepass xxxx 是單機(jī)加密碼的部分,這里我給和諧掉了。
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.? 準(zhǔn)備規(guī)范文件 (SPEC)
創(chuàng)建一個(gè)規(guī)范文件(例如 redis.spec)
vim ~/rpmbuild/SPECS/redis.spec
(如果想添加編譯者的名字和聯(lián)系方式,可以在配置中給出)
內(nèi)容如下:?
Name: ? ? ? ? ? redis
Version: ? ? ? ?7.4.2
Release: ? ? ? ?1%{?dist}
Summary: ? ? ? ?An advanced key-value storeLicense: ? ? ? ?BSD
URL: ? ? ? ? ? ?https://redis.io/
Source0: ? ? ? ?redis-%{version}.tar.gzBuildRequires: ?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# 安裝二進(jìn)制文件
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 服務(wù)文件
install -m 644 redis.service %{buildroot}/lib/systemd/system/redis.service%pre
# 檢查并備份舊版本的配置文件和數(shù)據(jù)目錄
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}"
fiif [ -d /var/lib/redis ]; then
? ? # 備份數(shù)據(jù)目錄
? ? 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# 刪除舊版本的服務(wù)文件(如果存在)
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
# 創(chuàng)建 Redis 用戶和組(如果不存在)
groupadd -f -r redis || : ?# 創(chuàng)建組,如果已存在則忽略錯(cuò)誤
useradd -r -g redis -s /bin/false -M redis || : ?# 創(chuàng)建用戶,指定組,禁用登錄# 確保數(shù)據(jù)目錄存在并設(shè)置權(quán)限
mkdir -p /var/lib/redis
chown -R redis:redis /var/lib/redis
chmod 700 /var/lib/redis# 增加一些補(bǔ)充動(dòng)作
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.pidchown redis:redis ?/var/run/redis_6379.pid
# 重新加載 systemd 配置并啟用 Redis 服務(wù)
systemctl daemon-reload
systemctl enable redis || : ?# 啟用服務(wù),忽略可能的錯(cuò)誤
systemctl start redis || : ?# 嘗試啟動(dòng)服務(wù)%preun
if [ $1 -eq 0 ]; then
? ? # 卸載時(shí)停止并禁用 Redis 服務(wù)
? ? systemctl stop redis || : ?# 停止服務(wù),忽略可能的錯(cuò)誤
? ? systemctl disable redis || : ?# 禁用服務(wù),忽略可能的錯(cuò)誤? ? # 刪除 Redis 服務(wù)文件
? ? rm -f /lib/systemd/system/redis.service
? ? systemctl daemon-reload || : ?# 重新加載 systemd 配置? ? # 刪除 Redis 用戶和組(可選)
? ? userdel -r redis || : ?# 刪除用戶及其主目錄,忽略可能的錯(cuò)誤
? ? groupdel redis || : ?# 刪除組,忽略可能的錯(cuò)誤
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, 內(nèi)容如下:
[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 文件,并將其移動(dòng)到 SOURCES 目錄:
tar -czf ~/rpmbuild/SOURCES/redis-7.4.2.tar.gz redis-7.4.2/
9. 構(gòu)建RPM包
使用 rpmbuild 命令構(gòu)建 RPM 包:
rpmbuild -ba ~/rpmbuild/SPECS/redis.spec
?
?基本上到這里就結(jié)束了,如果環(huán)境一致,操作順暢的話,你將會(huì)在?/root/rpmbuild/RPMS/x86_64 下得到你想要的。
圖沒截,回頭想起來再補(bǔ)吧。