探索GitHub顶级项目:Redis在Red Hat Enterprise Linux 9平台的实战应用

云信安装大师
90
AI 质量分
10 5 月, 2025
5 分钟阅读
0 阅读

探索GitHub顶级项目:Redis在Red Hat Enterprise Linux 9平台的实战应用

引言

Redis作为GitHub上最受欢迎的键值存储数据库之一,以其高性能和丰富的数据结构而闻名。本文将带你在Red Hat Enterprise Linux 9(RHEL 9)上完整部署Redis服务,并通过实际示例展示其核心功能。

准备工作

环境要求

  • Red Hat Enterprise Linux 9操作系统
  • 具有sudo权限的用户账户
  • 稳定的网络连接

前置知识

  • 基本的Linux命令行操作
  • 了解数据库基本概念

安装Redis

步骤1:添加EPEL仓库

RHEL默认仓库不包含Redis,我们需要先添加EPEL(Extra Packages for Enterprise Linux)仓库:

代码片段
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y

原理说明:EPEL是由Fedora社区维护的额外软件包仓库,为RHEL/CentOS提供高质量附加软件包。

步骤2:安装Redis服务器

代码片段
sudo dnf install redis -y

安装完成后验证版本:

代码片段
redis-server --version

步骤3:配置SELinux(如启用)

如果系统启用了SELinux,需要调整策略以允许Redis运行:

代码片段
sudo setsebool -P redis_can_network on

实践经验:在生产环境中,建议根据实际需求精细配置SELinux策略,而非简单关闭。

Redis基础配置

步骤4:修改主配置文件

编辑Redis配置文件:

代码片段
sudo vi /etc/redis/redis.conf

建议修改以下关键参数:

代码片段
bind 0.0.0.0            # 允许远程连接(生产环境应限制IP)
protected-mode no       # 关闭保护模式(仅测试环境)
maxmemory 2gb           # 根据服务器内存调整
maxmemory-policy allkeys-lru   # 内存满时的淘汰策略

保存后重启服务使配置生效:

代码片段
sudo systemctl restart redis

步骤5:设置开机自启

代码片段
sudo systemctl enable --now redis

验证服务状态:

代码片段
sudo systemctl status redis

Redis基础操作实战

示例1:使用redis-cli进行基本操作

连接到本地Redis服务器:

代码片段
redis-cli

在交互式命令行中尝试以下操作:

代码片段
# 设置键值对
127.0.0.1:6379> SET mykey "Hello Redis"

# 获取值
127.0.0.1:6379> GET mykey

# 设置带过期时间的键(10秒)
127.0.0.1:6379> SETEX tempkey 10 "Temporary Value"

# Hash操作示例(适合存储对象)
127.0.0.1:6379> HSET user:1000 username antirez birthyear 1977 verified 1

# List操作示例(实现队列)
127.0.0.1:6379> LPUSH mylist "first"
127.0.0.1:6379> LPUSH mylist "second"
127.0.0.1:6379> RPOP mylist

# Set操作示例(去重集合)
127.0.0.1:6379> SADD myset "hello"
127.0.0.1:6379> SADD myset "world"
127.0.0.1:6379> SMEMBERS myset

# Sorted Set操作示例(带分数排序)
127.0.0.1:6379> ZADD leaderboard 100 "player1"
127.0.0.1:6379> ZADD leaderboard 200 "player2"
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES

# Pub/Sub示例(发布订阅模式)
# Terminal A:
127.0.0.1:6379> SUBSCRIBE notifications

# Terminal B:
127.0.0。1:6379> PUBLISH notifications "Hello subscribers!"

注意事项
– Redis命令区分大小写,但键名和值不区分大小写
– SET命令会覆盖已有键的值,使用SETNX可实现”不存在才设置”

Python客户端示例代码

安装Python Redis客户端库:

代码片段
pip install redis==4.x.x   # Python3环境下推荐4.x版本以上

创建redis_demo.py文件:

代码片段
import redis

# Connect to Redis server (默认连接本地6379端口)
r = redis.Redis(host='localhost', port=6379, db=0)

def basic_operations():
    """基本键值操作"""
    # String类型操作示例

    r.set('foo', 'bar')
    value = r.get('foo')
    print(f"获取到的值: {value.decode('utf-8')}")  
    # Redis返回的是bytes类型,需要解码

    # Hash类型操作示例(适合存储对象)
    r.hset('user:100', mapping={
        'name': 'Alice',
        'age': '30',
        'email': 'alice@example.com'
    })

    user_data = r.hgetall('user:100')
    print("用户数据:", {k.decode('utf-8'): v.decode('utf-8') 
                       for k, v in user_data.items()})

def transaction_example():
    """事务处理示例"""

    with r.pipeline() as pipe:
        while True:
            try:
                # Watch监视一个键防止被其他客户端修改 
                pipe.watch('counter')

                current_value = int(r.get('counter') or b'5')
                next_value = current_value +  2 

                # MULTI开始事务块 
                pipe.multi()
                pipe.set('counter', next_value)

                # EXEC执行事务块中的命令 
                pipe.execute()

                break  
            except redis.WatchError:
                print("计数器被其他客户端修改,重试...")
                continue  

if __name__ == '__main__':
    basic_operations()
    transaction_example()

运行Python脚本:

代码片段
python3 redis_demo.py 

代码说明
basic_operations()展示了字符串和哈希两种常用数据结构的操作方式
transaction_example()演示了乐观锁实现的事务处理模式
decode('utf-8')是因为Redis返回的是bytes类型而非字符串

Redis持久化配置优化

Redis提供两种持久化方式:

RDB快照方式

/etc/redis/redis.conf中配置:

代码片段
save  900  10      #  15分钟内至少10个键被修改则触发保存  
save  300  100     #  5分钟内至少100个键被修改则触发保存  
save  60  10000     #  60秒内至少10000个键被修改则触发保存  

dbfilename dump.rbd      # RDB文件名  
dir /var/lib/redis       # RDB文件存储路径  
stop-writes-on-bgsave-error yes     # RDB失败时停止写入  
rdbcompression yes       # RDB文件压缩  
rdbchecksum yes          # RDB文件校验  

AOF日志方式(更安全但性能略低)

代码片段
appendonly yes                   #启用AOF持久化  
appendfilename "appendonly.aof"   #AOF文件名  

# AOF同步策略(根据数据安全性要求选择)  
appendfsync everysec             #折中方案(推荐)  
auto-aof-rewrite-percentage  50   
auto-aof-rewrite-min-size    64mb   
aof-load-truncated yes           #AOF文件损坏时仍加载可用部分   
aof-use-rdb-preamble yes         #混合持久化方式(RDB+AOF)   

重启服务使配置生效:

代码片段
sudo systemctl restart redis   

验证持久化文件生成情况:

代码片段
ls -lh /var/lib/redis/   

Redis安全加固建议

生产环境中必须考虑的安全措施:

1.密码认证 -在redis.conf中设置:

代码片段
requirepass YourStrongPassword123!   
masterauth YourStrongPassword123!     //主从复制时使用相同密码   
rename-command FLUSHALL ""           //禁用危险命令   
rename-command CONFIG ""             //限制CONFIG命令访问权限   

2.网络隔离 -仅允许可信IP访问Redis端口(默认6379):

代码片段
bind <内部IP地址>         //替代原来的bind指令    
protected-mode yes       //生产环境应保持开启    
port <自定义端口号>       //避免使用默认端口    
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<允许的IP>" port protocol="tcp" port="<Redis端口>" accept'    
firewall-cmd --reload    

3.定期备份策略

代码片段
#!/bin/bash    
BACKUP_DIR="/backup/redis"     
DATE=$(date +%Y%m%d)     
mkdir -p $BACKUP_DIR/$DATE     
cp /var/lib/redis/dump.rbd $BACKUP_DIR/$DATE/     
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/$DATE/     
find $BACKUP_DIR -type d -mtime +30 | xargs rm -rf      //保留30天备份    

将脚本加入cron定时任务:

代码片段
crontab -e     
//添加以下内容每天凌晨执行备份    
00 * * * * /path/to/backup_script.sh > /dev/null      

Redis性能监控工具

内置info命令获取详细运行时信息:

代码片段
redis-cli info                   //查看全部信息    
redis-cli info memory            //查看内存使用情况    
redis-cli info stats             //查看统计信息    
redis-cli info clients           //查看客户端连接情况    

第三方监控工具推荐组合方案(Grafana+Prometheus+Redis_exporter):

安装Prometheus的Redis导出器收集指标数据(GitHub项目地址):https://github.com/oliver006/redis_exporter

部署步骤简要说明如下所示:

首先下载并解压最新版本的二进制文件:

代码片段
wget https://github.com/oliver006/redis_exporter/releases/download/vx.x.x/redis_exporter-vx.x.x.linux-amd64.tar.gz      
tar xvfz redis_exporter*.tar.gz      
cd redis_exporter*/      
./redis_exporter &      //后台运行导出器进程      
//或者作为systemd服务运行更规范       
//详细部署参考项目文档中的Systemd单元文件样例       

然后通过Grafana仪表板可视化监控指标数据:

:上述图片仅为示意图,实际使用时需要导入官方提供的仪表板模板ID.

常见问题排查指南

Q:启动失败报错”Can’t open the log file”

A:

检查日志目录权限是否正确:

代码片段
sudo chown redis:redis /var/log/redis.log      
sudo chmod u+rw /var/log/redis.log       
systemctl restart redis       
journalctl -xe      //查看详细错误日志        

Q:客户端无法连接远程服务器

A:

检查防火墙规则是否放行相应端口:

代码片段
firewall-cmd --list-all | grep <端口号>        
//如未显示则需添加规则        
firewall-cmd --permanent --add-port=<端口号>/tcp        
firewall-cmd --reload        
netstat -tulnp | grep <端口号>      //确认监听状态        
telnet <IP地址><端口号>            //测试连通性       
tcpdump port <端口号>-nni any      //抓包分析网络流量       
ss -antp | grep <进程名或PID>       //现代Linux替代netstat的工具         

Q:内存占用过高导致性能下降

A:

分析内存使用情况并优化数据结构:

“`
//找出占用最多内存的前N个Key
MEMORY USAGE some_key

//采样分析大Key分布情况
./src/redis-cli –bigkeys

//定期执行碎片整理
CONFIG SET activedefrag yes
MEMORY PURGE

//调整淘汰策略为volatile-lru
CONFIG SET maxmemory-policy volatile-lru
CONFIG REWRITE
INFO memory | grep usedmemoryhuman
MONITOR | head -n100 > commands.txt && vim commands.txt
SLOWLOG GET10 //查询慢查询日志前十条记录
SHUTDOWN NOSAVE //紧急情况下强制停止服务
DEBUG OBJECT keyname
CLIENT LIST //列出所有连接的客户端详细信息
CLIENT KILL addr:: //断开特定客户端的连接
CLIENT PAUSE timeout
inms //暂停所有客户端请求以进行维护
MIGRATE host port key db timeout [COPY] [REPLACE]
SCAN cursor [MATCH pattern] [COUNT count] //渐进式遍历大量Key而不阻塞服务
FLUSHALL ASYNC //异步清空所有数据库
CONFIG RESETSTAT 重置统计计数器
ROLE 显示实例的角色信息(master/slave)
TIME 获取服务器当前时间戳
LASTSAVE 获取最后一次成功保存到磁盘的时间戳
MODULE LIST 列出已加载的模块
CLUSTER INFO 集群信息摘要(如果启用集群模式)
DBSIZE 当前数据库的Key数量
OBJECT ENCODING key
name 查看特定Key的内部编码方式(zipmap,ziplist等)
WAIT numreplicas timeout 等待指定数量的副本同步完成
MEMORY DOCTOR 诊断内存问题
MEMORY MALLOC-STATS 显示jemalloc分配器统计信息
ACL LIST 列出访问控制列表规则
ACL WHOAMI 显示当前认证用户的权限
ACL GETUSER username 获取指定用户的ACL规则
ACL SETUSER username … 设置用户权限规则
ACL DELUSER username 删除用户
ACL SAVE 保存ACL规则到配置文件
ACL LOAD 从配置文件重新加载ACL规则
XINFO STREAM mystream 获取Stream类型详细信息
XREAD COUNT10 STREAMS mystream $ 读取Stream最新消息
XGROUP CREATE mystream mygroup $ MKSTREAM 创建消费者组
XACK mystream mygroup id 确认消息已处理
XPENDING mystream mygroup 显示待处理消息统计信息
XCLAIM mystream mygroup consumer min-idle-time id… 认领待处理消息
XTRIM mystream MAXLEN ~10000 修剪Stream保留约10000条消息
XDEL mystream id… 删除特定消息ID
XLEN mystream 获取Stream长度
ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 计算有序集合的并集
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 计算有序集合的交集
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 按分数范围查询有序集合元素
ZREMRANGEBYSCORE key min max 移除指定分数范围内的元素
ZREMRANGEBYRANK key start stop 移除指定排名范围内的元素
ZPOPMAX key [count] 弹出分数最高的元素
ZPOPMIN key [count] 弹出分数最低的元素
BZPOPMAX key [key …] timeout 阻塞式弹出最高分元素(BLOCKING版)
BZPOPMIN key [key …] timeout 阻塞式弹出最低分元素(BLOCKING版)
GEOADD Sicily13。36138938。115556″Palermo”15。08726937。502669″Catania” 添加地理位置坐标
GEODIST Sicily Palermo Catania km 计算两个位置之间的距离
GEORADIUS Sicily15°37′E37°N200km WITHDIST WITHCOORD ASC COUNT5 查找半径200公里内的位置点
GEOSEARCH Sicily FROMLONLAT15°37′E37°N BYRADIUS200km ASC COUNT5 WITHDIST WITHCOORD 新版地理搜索命令(GEOADD Sicily13。36138938。115556″Palermo”15。08726937。502669″Catania”)
BITFIELD mykey INCRBY i510 GET u40 OVERFLOW SAT i512 位域操作命令族范例
BITOP AND destkey srckey srckey2 srckey3 位运算AND操作范例
PFADD hll a b c d e f g HyperLogLog基数统计范例
PFCOUNT hll 估算基数大小范例
PFMERGE hll3 hll hll2 合并多个HLL结构范例
TS.CREATE temperature RETENTION600000 LABELS sensorid2 areaid32 roomid10 时间序列模块创建范例
TS.CREATERULE temp
raw temp_avg AGGREGATION avg500000 时间序列降采样规则范例
JSON.SET doc$.{\”name\”:\”John\”,\”age\”:30,\”city\”:\”New York\”} JSON模块设置文档范例
JSON.GET doc$.name JSON模块查询字段范例
JSON.DEL doc$.age JSON模块删除字段范例
JSON.NUMINCRBY doc$.age5 JSON字段数值递增范例

原创 高质量