08-27-周三_17-09-29
This commit is contained in:
519
数据库/Redis_2025/02_Redis环境搭建.md
Normal file
519
数据库/Redis_2025/02_Redis环境搭建.md
Normal file
@@ -0,0 +1,519 @@
|
||||
# Redis 环境搭建
|
||||
|
||||
## Redis 安装
|
||||
|
||||
Redis 在 Rocky Linux release 9.4 (Blue Onyx) 通过 YUM 安装 redis-6.2.19-1.el9_6.x86_64
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# cat /etc/redhat-release
|
||||
Rocky Linux release 9.4 (Blue Onyx)
|
||||
[root@localhost ~]# yum provides redis
|
||||
Last metadata expiration check: 0:06:10 ago on Sat Aug 2 12:50:25 2025.
|
||||
redis-6.2.19-1.el9_6.x86_64 : A persistent key-value database
|
||||
Repo : appstream
|
||||
Matched from:
|
||||
Provide : redis = 6.2.19-1.el9_6
|
||||
[root@localhost ~]# yum install redis-6.2.19-1.el9_6 -y
|
||||
|
||||
```
|
||||
|
||||
## Redis 启动和连接
|
||||
|
||||
### Redis 服务启动
|
||||
|
||||
**使用 systemd 管理**
|
||||
|
||||
```shell
|
||||
# 服务文件
|
||||
[root@localhost ~]# ls -l /usr/lib/systemd/system/redis.service
|
||||
# 重新加载 systemd
|
||||
systemctl daemon-reload
|
||||
# 启动 Redis 服务
|
||||
systemctl start redis
|
||||
# 设置开机自启
|
||||
systemctl enable redis
|
||||
# 查看服务状态
|
||||
systemctl status redis
|
||||
```
|
||||
|
||||
**手动启动**
|
||||
|
||||
```shell
|
||||
# 前台启动(用于调试)
|
||||
redis-server /etc/redis/redis.conf
|
||||
# 后台启动
|
||||
redis-server /etc/redis/redis.conf --daemonize yes
|
||||
# 指定端口启动
|
||||
redis-server --port 6380
|
||||
# 指定配置参数启动
|
||||
redis-server --maxmemory 1gb --maxmemory-policy allkeys-lru
|
||||
```
|
||||
|
||||
### Redis 客户端连接
|
||||
|
||||
**本地连接**
|
||||
|
||||
```shell
|
||||
# 默认连接
|
||||
redis-cli
|
||||
# 指定主机和端口
|
||||
redis-cli -h 127.0.0.1 -p 6379
|
||||
# 使用密码连接
|
||||
redis-cli -h 127.0.0.1 -p 6379 -a your_password
|
||||
# 连接后认证
|
||||
redis-cli
|
||||
127.0.0.1:6379> AUTH your_password
|
||||
OK
|
||||
# 选择数据库
|
||||
127.0.0.1:6379> SELECT 1
|
||||
OK
|
||||
127.0.0.1:6379[1]>
|
||||
```
|
||||
|
||||
**远程连接配置**
|
||||
|
||||
```shell
|
||||
# 服务器端配置
|
||||
# 修改配置文件
|
||||
vim /etc/redis/redis.conf
|
||||
# 修改绑定地址
|
||||
bind 0.0.0.0
|
||||
# 设置密码
|
||||
requirepass your_strong_password
|
||||
# 重启服务
|
||||
systemctl restart redis
|
||||
|
||||
# 客户端连接
|
||||
# 远程连接
|
||||
redis-cli -h 192.168.1.100 -p 6379 -a your_password
|
||||
|
||||
```
|
||||
|
||||
## Redis 配置
|
||||
|
||||
### 配置文件详解
|
||||
|
||||
Redis 的主配置文件通常位于 `/etc/redis/redis.conf`,包含了所有的配置选项。
|
||||
|
||||
**配置文件结构:**
|
||||
|
||||
```shell
|
||||
# Redis 配置文件主要部分
|
||||
1. 网络配置 (NETWORK)
|
||||
2. 通用配置 (GENERAL)
|
||||
3. 快照配置 (SNAPSHOTTING)
|
||||
4. 复制配置 (REPLICATION)
|
||||
5. 安全配置 (SECURITY)
|
||||
6. 客户端配置 (CLIENTS)
|
||||
7. 内存管理 (MEMORY MANAGEMENT)
|
||||
8. 惰性释放 (LAZY FREEING)
|
||||
9. 线程 I/O (THREADED I/O)
|
||||
10. 内核透明大页 (KERNEL TRANSPARENT HUGEPAGE)
|
||||
11. 追加模式 (APPEND ONLY MODE)
|
||||
12. LUA 脚本 (LUA SCRIPTING)
|
||||
13. Redis 集群 (REDIS CLUSTER)
|
||||
14. 慢日志 (SLOW LOG)
|
||||
15. 延迟监控 (LATENCY MONITOR)
|
||||
16. 事件通知 (EVENT NOTIFICATION)
|
||||
17. 高级配置 (ADVANCED CONFIG)
|
||||
```
|
||||
|
||||
### 常用配置参数
|
||||
|
||||
#### 网络配置
|
||||
|
||||
```shell
|
||||
# 绑定地址
|
||||
bind 127.0.0.1 ::1
|
||||
# 允许所有地址访问(生产环境需谨慎)
|
||||
# bind 0.0.0.0
|
||||
|
||||
# 端口号
|
||||
port 6379
|
||||
|
||||
# TCP 监听队列长度
|
||||
tcp-backlog 511
|
||||
|
||||
# 客户端空闲超时时间(秒)
|
||||
timeout 0
|
||||
|
||||
# TCP keepalive
|
||||
tcp-keepalive 300
|
||||
```
|
||||
|
||||
#### 通用配置
|
||||
|
||||
```shell
|
||||
# 以守护进程方式运行
|
||||
daemonize yes
|
||||
|
||||
# 进程文件
|
||||
pidfile /var/run/redis_6379.pid
|
||||
|
||||
# 日志级别:debug, verbose, notice, warning
|
||||
loglevel notice
|
||||
|
||||
# 日志文件
|
||||
logfile /var/log/redis/redis-server.log
|
||||
|
||||
# 数据库数量
|
||||
databases 16
|
||||
|
||||
# 显示 Redis logo
|
||||
always-show-logo no
|
||||
```
|
||||
|
||||
#### 内存管理
|
||||
|
||||
```shell
|
||||
# 最大内存限制
|
||||
maxmemory 2gb
|
||||
|
||||
# 内存淘汰策略
|
||||
# noeviction: 不淘汰,内存满时报错
|
||||
# allkeys-lru: 所有键 LRU 淘汰
|
||||
# volatile-lru: 有过期时间的键 LRU 淘汰
|
||||
# allkeys-random: 所有键随机淘汰
|
||||
# volatile-random: 有过期时间的键随机淘汰
|
||||
# volatile-ttl: 有过期时间的键按 TTL 淘汰
|
||||
# allkeys-lfu: 所有键 LFU 淘汰
|
||||
# volatile-lfu: 有过期时间的键 LFU 淘汰
|
||||
maxmemory-policy allkeys-lru
|
||||
|
||||
# LRU 和 LFU 算法样本数量
|
||||
maxmemory-samples 5
|
||||
```
|
||||
|
||||
### 安全配置
|
||||
|
||||
#### 密码认证
|
||||
|
||||
```shell
|
||||
# 设置密码
|
||||
requirepass your_strong_password_here
|
||||
|
||||
# 重命名危险命令
|
||||
rename-command FLUSHDB ""
|
||||
rename-command FLUSHALL ""
|
||||
rename-command KEYS ""
|
||||
rename-command CONFIG "CONFIG_9a8b7c6d5e4f"
|
||||
```
|
||||
|
||||
#### ACL 用户管理
|
||||
|
||||
```shell
|
||||
# 启用 ACL 日志
|
||||
acllog-max-len 128
|
||||
|
||||
# ACL 配置文件
|
||||
# aclfile /etc/redis/users.acl
|
||||
|
||||
# 示例 ACL 配置
|
||||
# user default on nopass ~* &* -@all +@read +@write
|
||||
# user app_user on >app_password ~app:* +@read +@write -@dangerous
|
||||
# user readonly_user on >readonly_password ~* +@read -@write -@dangerous
|
||||
```
|
||||
|
||||
#### 网络安全
|
||||
|
||||
```shell
|
||||
# 保护模式(默认开启)
|
||||
protected-mode yes
|
||||
|
||||
# 绑定到特定接口
|
||||
bind 127.0.0.1 192.168.1.100
|
||||
|
||||
# 禁用某些命令
|
||||
rename-command DEBUG ""
|
||||
rename-command EVAL ""
|
||||
rename-command SCRIPT ""
|
||||
```
|
||||
|
||||
### 性能调优配置
|
||||
|
||||
#### 持久化优化
|
||||
|
||||
```shell
|
||||
# RDB 配置
|
||||
save 900 1 # 900秒内至少1个键变化
|
||||
save 300 10 # 300秒内至少10个键变化
|
||||
save 60 10000 # 60秒内至少10000个键变化
|
||||
|
||||
# RDB 文件压缩
|
||||
rdbcompression yes
|
||||
|
||||
# RDB 文件校验
|
||||
rdbchecksum yes
|
||||
|
||||
# RDB 文件名
|
||||
dbfilename dump.rdb
|
||||
|
||||
# 工作目录
|
||||
dir /var/lib/redis
|
||||
|
||||
# AOF 配置
|
||||
appendonly yes
|
||||
appendfilename "appendonly.aof"
|
||||
|
||||
# AOF 同步策略
|
||||
# always: 每个写操作都同步
|
||||
# everysec: 每秒同步一次
|
||||
# no: 由操作系统决定
|
||||
appendfsync everysec
|
||||
|
||||
# AOF 重写配置
|
||||
auto-aof-rewrite-percentage 100
|
||||
auto-aof-rewrite-min-size 64mb
|
||||
```
|
||||
|
||||
#### 客户端连接优化
|
||||
|
||||
```shell
|
||||
# 最大客户端连接数
|
||||
maxclients 10000
|
||||
|
||||
# 客户端输出缓冲区限制
|
||||
# client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
|
||||
client-output-buffer-limit normal 0 0 0
|
||||
client-output-buffer-limit replica 256mb 64mb 60
|
||||
client-output-buffer-limit pubsub 32mb 8mb 60
|
||||
|
||||
# 客户端查询缓冲区限制
|
||||
client-query-buffer-limit 1gb
|
||||
```
|
||||
|
||||
#### 慢查询配置
|
||||
|
||||
```shell
|
||||
# 慢查询阈值(微秒)
|
||||
slowlog-log-slower-than 10000
|
||||
|
||||
# 慢查询日志长度
|
||||
slowlog-max-len 128
|
||||
```
|
||||
|
||||
|
||||
## 实践操作
|
||||
|
||||
### 需求描述
|
||||
|
||||
在生产环境中,我们经常需要在同一台服务器上运行多个Redis实例,用于不同的业务场景或实现数据隔离。本实践将演示如何通过自定义配置文件部署多个Redis实例,包括主实例、缓存实例和会话实例。
|
||||
|
||||
### 实践细节和结果验证
|
||||
|
||||
```shell
|
||||
# 1. 创建多实例目录结构
|
||||
mkdir -p /etc/redis/instances/{main,cache,session}
|
||||
mkdir -p /var/lib/redis/{main,cache,session}
|
||||
mkdir -p /var/log/redis
|
||||
|
||||
# 2. 创建主实例配置文件 (端口6380)
|
||||
tee /etc/redis/instances/main/redis.conf > /dev/null << 'EOF'
|
||||
# Redis 主实例配置 - 用于核心业务数据
|
||||
port 6380
|
||||
bind 127.0.0.1
|
||||
daemonize yes
|
||||
pidfile /var/run/redis/redis-main.pid
|
||||
logfile /var/log/redis/redis-main.log
|
||||
dir /var/lib/redis/main
|
||||
dbfilename dump-main.rdb
|
||||
|
||||
# 内存配置
|
||||
maxmemory 1gb
|
||||
maxmemory-policy allkeys-lru
|
||||
|
||||
# 持久化配置
|
||||
save 900 1
|
||||
save 300 10
|
||||
save 60 10000
|
||||
appendonly yes
|
||||
appendfilename "appendonly-main.aof"
|
||||
|
||||
# 安全配置
|
||||
requirepass main_redis_2025
|
||||
rename-command FLUSHDB ""
|
||||
rename-command FLUSHALL ""
|
||||
|
||||
# 客户端配置
|
||||
maxclients 1000
|
||||
timeout 300
|
||||
EOF
|
||||
|
||||
# 3. 创建缓存实例配置文件 (端口6381)
|
||||
sudo tee /etc/redis/instances/cache/redis.conf > /dev/null << 'EOF'
|
||||
# Redis 缓存实例配置 - 用于应用缓存
|
||||
port 6381
|
||||
bind 127.0.0.1
|
||||
daemonize yes
|
||||
pidfile /var/run/redis/redis-cache.pid
|
||||
logfile /var/log/redis/redis-cache.log
|
||||
dir /var/lib/redis/cache
|
||||
dbfilename dump-cache.rdb
|
||||
|
||||
# 内存配置 - 缓存实例分配更多内存
|
||||
maxmemory 2gb
|
||||
maxmemory-policy allkeys-lru
|
||||
maxmemory-samples 10
|
||||
|
||||
# 持久化配置 - 缓存数据可以不持久化
|
||||
save ""
|
||||
appendonly no
|
||||
|
||||
# 安全配置
|
||||
requirepass cache_redis_2025
|
||||
|
||||
# 客户端配置
|
||||
maxclients 2000
|
||||
timeout 0
|
||||
|
||||
# 过期键删除配置
|
||||
hz 10
|
||||
EOF
|
||||
|
||||
# 4. 创建会话实例配置文件 (端口6382)
|
||||
sudo tee /etc/redis/instances/session/redis.conf > /dev/null << 'EOF'
|
||||
# Redis 会话实例配置 - 用于用户会话存储
|
||||
port 6382
|
||||
bind 127.0.0.1
|
||||
daemonize yes
|
||||
pidfile /var/run/redis/redis-session.pid
|
||||
logfile /var/log/redis/redis-session.log
|
||||
dir /var/lib/redis/session
|
||||
dbfilename dump-session.rdb
|
||||
|
||||
# 内存配置
|
||||
maxmemory 512mb
|
||||
maxmemory-policy volatile-lru
|
||||
|
||||
# 持久化配置 - 会话数据需要持久化但频率可以低一些
|
||||
save 1800 1
|
||||
save 300 100
|
||||
appendonly yes
|
||||
appendfilename "appendonly-session.aof"
|
||||
auto-aof-rewrite-percentage 100
|
||||
auto-aof-rewrite-min-size 64mb
|
||||
|
||||
# 安全配置
|
||||
requirepass session_redis_2025
|
||||
|
||||
# 客户端配置
|
||||
maxclients 500
|
||||
timeout 1800
|
||||
|
||||
# 键空间通知 - 用于会话过期监控
|
||||
notify-keyspace-events Ex
|
||||
EOF
|
||||
|
||||
# 5. 创建运行时目录
|
||||
mkdir -p /var/run/redis
|
||||
chown redis:redis /var/run/redis
|
||||
chown -R redis:redis /var/lib/redis
|
||||
chown -R redis:redis /var/log/redis
|
||||
chown -R redis:redis /etc/redis/instances
|
||||
|
||||
# 6. 创建systemd服务文件
|
||||
# 主实例服务
|
||||
tee /etc/systemd/system/redis-main.service > /dev/null << 'EOF'
|
||||
[Unit]
|
||||
Description=Redis Main Instance
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
ExecStart=/usr/bin/redis-server /etc/redis/instances/main/redis.conf --supervised systemd
|
||||
ExecStop=/usr/bin/redis-cli -p 6380 -a main_redis_2025 shutdown
|
||||
TimeoutStopSec=0
|
||||
Restart=always
|
||||
User=redis
|
||||
Group=redis
|
||||
RuntimeDirectory=redis
|
||||
RuntimeDirectoryMode=0755
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# 缓存实例服务
|
||||
sudo tee /etc/systemd/system/redis-cache.service > /dev/null << 'EOF'
|
||||
[Unit]
|
||||
Description=Redis Cache Instance
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
ExecStart=/usr/bin/redis-server /etc/redis/instances/cache/redis.conf --supervised systemd
|
||||
ExecStop=/usr/bin/redis-cli -p 6381 -a cache_redis_2025 shutdown
|
||||
TimeoutStopSec=0
|
||||
Restart=always
|
||||
User=redis
|
||||
Group=redis
|
||||
RuntimeDirectory=redis
|
||||
RuntimeDirectoryMode=0755
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# 会话实例服务
|
||||
sudo tee /etc/systemd/system/redis-session.service > /dev/null << 'EOF'
|
||||
[Unit]
|
||||
Description=Redis Session Instance
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
ExecStart=/usr/bin/redis-server /etc/redis/instances/session/redis.conf --supervised systemd
|
||||
ExecStop=/usr/bin/redis-cli -p 6382 -a session_redis_2025 shutdown
|
||||
TimeoutStopSec=0
|
||||
Restart=always
|
||||
User=redis
|
||||
Group=redis
|
||||
RuntimeDirectory=redis
|
||||
RuntimeDirectoryMode=0755
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# 7. 重新加载systemd并启动服务
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable redis-main redis-cache redis-session
|
||||
sudo systemctl start redis-main redis-cache redis-session
|
||||
|
||||
# 检查服务状态
|
||||
sudo systemctl status redis-main redis-cache redis-session --no-pager
|
||||
|
||||
# 检查端口监听
|
||||
sudo netstat -tlnp | grep redis-server
|
||||
|
||||
# 检查进程
|
||||
ps aux | grep redis-server | grep -v grep
|
||||
|
||||
# 测试主实例
|
||||
redis-cli -p 6380 -a main_redis_2025 ping
|
||||
redis-cli -p 6380 -a main_redis_2025 set main:test "Main Instance Data"
|
||||
redis-cli -p 6380 -a main_redis_2025 get main:test
|
||||
|
||||
# 测试缓存实例
|
||||
redis-cli -p 6381 -a cache_redis_2025 ping
|
||||
redis-cli -p 6381 -a cache_redis_2025 set cache:user:1001 "User Cache Data" EX 3600
|
||||
redis-cli -p 6381 -a cache_redis_2025 get cache:user:1001
|
||||
redis-cli -p 6381 -a cache_redis_2025 ttl cache:user:1001
|
||||
|
||||
# 测试会话实例
|
||||
redis-cli -p 6382 -a session_redis_2025 ping
|
||||
redis-cli -p 6382 -a session_redis_2025 set session:user:1001 "User Session Data" EX 1800
|
||||
redis-cli -p 6382 -a session_redis_2025 get session:user:1001
|
||||
redis-cli -p 6382 -a session_redis_2025 ttl session:user:1001
|
||||
|
||||
# 检查内存使用情况 - used_memory_human
|
||||
redis-cli -p 6380 -a main_redis_2025 info memory | grep used_memory_human
|
||||
redis-cli -p 6381 -a cache_redis_2025 info memory | grep used_memory_human
|
||||
redis-cli -p 6382 -a session_redis_2025 info memory | grep used_memory_human
|
||||
|
||||
# 检查配置信息 - maxmemory
|
||||
redis-cli -p 6380 -a main_redis_2025 config get maxmemory
|
||||
redis-cli -p 6381 -a cache_redis_2025 config get maxmemory
|
||||
redis-cli -p 6382 -a session_redis_2025 config get maxmemory
|
||||
|
||||
```
|
Reference in New Issue
Block a user