1. Redis基础概念与环境准备
Redis(Remote Dictionary Server)是一个开源的键值存储系统,它通常被称为数据结构服务器,因为它的值不仅限于简单的字符串,还可以是更复杂的数据结构,如哈希、列表、集合等。在Linux环境下使用Redis,首先需要完成环境准备。
1.1 Redis安装与启动
在CentOS 7系统上安装Redis的步骤如下:
bash复制# 安装EPEL仓库(如果尚未安装)
sudo yum install epel-release
# 安装Redis
sudo yum install redis
# 启动Redis服务
sudo systemctl start redis
# 设置开机自启
sudo systemctl enable redis
# 检查服务状态
sudo systemctl status redis
安装完成后,Redis默认监听6379端口。如果需要修改配置,可以编辑/etc/redis.conf文件:
bash复制sudo vi /etc/redis.conf
常见需要修改的配置项包括:
- bind 127.0.0.1 → 改为0.0.0.0允许远程连接(生产环境请配合防火墙使用)
- requirepass yourpassword → 设置访问密码
- maxmemory 100mb → 设置最大内存使用量
提示:修改配置后需要重启Redis服务使更改生效:sudo systemctl restart redis
1.2 Redis命令行工具redis-cli
redis-cli是Redis自带的命令行界面工具,是与Redis服务器交互的主要方式。基本用法:
bash复制# 连接本地Redis
redis-cli
# 连接远程Redis
redis-cli -h hostname -p port -a password
# 执行单条命令后退出
redis-cli set foo bar
在redis-cli交互模式下,可以使用TAB键补全命令,输入help @group可以查看特定命令组的帮助,例如help @string查看字符串相关命令。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Redis基础数据类型与操作
Redis支持多种数据类型,每种类型都有特定的命令集。理解这些数据类型是有效使用Redis的关键。
2.1 字符串(String)
字符串是Redis最基本的数据类型,可以存储文本、数字或二进制数据(最大512MB)。
bash复制# 设置键值
SET username "john_doe"
# 获取值
GET username
# 设置带过期时间的键(秒)
SETEX session:1234 3600 "user_data"
# 递增数字
INCR page_views
INCRBY page_views 5
# 批量操作
MSET key1 "value1" key2 "value2"
MGET key1 key2
字符串类型常用于缓存、计数器、会话存储等场景。INCR命令是原子操作,非常适合实现计数器功能。
2.2 哈希(Hash)
哈希是字段和值的映射表,适合存储对象。
bash复制# 设置哈希字段
HSET user:1000 username "jdoe" age 28 email "jdoe@example.com"
# 获取单个字段
HGET user:1000 username
# 获取所有字段和值
HGETALL user:1000
# 只获取字段名
HKEYS user:1000
# 只获取字段值
HVALS user:1000
# 删除字段
HDEL user:1000 email
哈希类型适合存储对象,如用户信息、产品详情等。与将对象序列化为JSON字符串相比,哈希可以单独访问和修改对象的某个字段,更加高效。
2.3 列表(List)
列表是简单的字符串列表,按照插入顺序排序,可以在头部或尾部添加元素。
bash复制# 从左侧插入
LPUSH tasks "send_email"
# 从右侧插入
RPUSH tasks "process_data"
# 获取列表范围
LRANGE tasks 0 -1 # 获取所有元素
# 弹出元素
LPOP tasks
RPOP tasks
# 获取列表长度
LLEN tasks
列表类型常用于实现消息队列、最新消息列表等。LPUSH+RPOP或RPUSH+LPOP组合可以实现队列,LPUSH+LPOP可以实现栈。
2.4 集合(Set)
集合是字符串的无序集合,不允许重复成员。
bash复制# 添加成员
SADD tags "redis" "database" "nosql"
# 获取所有成员
SMEMBERS tags
# 检查成员是否存在
SISMEMBER tags "redis"
# 集合运算
SADD tags1 "a" "b" "c"
SADD tags2 "b" "c" "d"
SINTER tags1 tags2 # 交集
SUNION tags1 tags2 # 并集
SDIFF tags1 tags2 # 差集(tags1有而tags2没有的)
集合类型适合存储不重复的数据,如标签、好友关系等。集合运算功能强大,可以高效实现共同好友、共同兴趣等需求。
2.5 有序集合(Sorted Set)
有序集合类似于集合,但每个成员都关联一个分数(score),用于排序。
bash复制# 添加成员
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"
# 按分数升序获取
ZRANGE leaderboard 0 -1 WITHSCORES
# 按分数降序获取
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 获取分数
ZSCORE leaderboard "player1"
# 获取排名
ZRANK leaderboard "player1" # 升序排名
ZREVRANK leaderboard "player1" # 降序排名
有序集合非常适合排行榜、优先级队列等场景。分数可以是整数或浮点数,允许重复分数(此时按字典序排序)。
3. Redis高级功能与配置
3.1 事务处理
Redis支持事务,通过MULTI、EXEC、DISCARD和WATCH命令实现。
bash复制# 开始事务
MULTI
# 命令入队
SET key1 "value1"
INCR counter
SET key2 "value2"
# 执行事务
EXEC
# 监视键,如果在事务执行前被修改,则事务不执行
WATCH key1
MULTI
SET key1 "new_value"
EXEC # 如果在执行前key1被其他客户端修改,则事务失败
Redis事务不是传统意义上的ACID事务,它更像是批处理。事务中的命令会按顺序执行,不会被其他命令打断,但不支持回滚(即使某个命令失败,后面的命令仍会执行)。
3.2 发布/订阅
Redis提供发布/订阅消息模式,可以实现简单的消息系统。
bash复制# 订阅频道(在一个客户端)
SUBSCRIBE news
# 发布消息(在另一个客户端)
PUBLISH news "Redis 6.0 released!"
发布/订阅是即时的,如果客户端在消息发布时没有订阅,它将不会收到该消息。Redis还支持模式订阅:
bash复制PSUBSCRIBE news.*
3.3 持久化配置
Redis提供两种持久化方式:
- RDB(快照):在指定时间间隔内将内存数据快照写入磁盘
- AOF(追加文件):记录每个写操作,重启时重新执行这些操作
配置示例(redis.conf):
bash复制# RDB配置
save 900 1 # 900秒内至少1个key变化则保存
save 300 10 # 300秒内至少10个key变化则保存
save 60 10000 # 60秒内至少10000个key变化则保存
# AOF配置
appendonly yes
appendfsync everysec # 每秒同步一次,平衡性能和数据安全
注意:生产环境通常同时启用RDB和AOF。RDB适合备份和快速恢复,AOF提供更好的持久性保证。
3.4 性能优化与监控
Redis提供多种监控和性能分析工具:
bash复制# 查看Redis信息
INFO
# 查看特定部分信息
INFO memory
INFO stats
INFO replication
# 监控实时命令
MONITOR # 生产环境慎用,会影响性能
# 慢查询日志
CONFIG SET slowlog-log-slower-than 10000 # 设置慢查询阈值(微秒)
SLOWLOG GET # 获取慢查询记录
性能优化建议:
- 合理设置maxmemory和淘汰策略(volatile-lru, allkeys-lru等)
- 使用pipelining减少网络往返时间
- 对大集合考虑分片
- 避免使用KEYS命令(使用SCAN代替)
4. Redis安全与维护
4.1 安全配置
生产环境中Redis安全至关重要:
bash复制# 设置密码(redis.conf)
requirepass your_strong_password
# 重命名危险命令(redis.conf)
rename-command FLUSHDB ""
rename-command CONFIG ""
# 绑定特定IP(redis.conf)
bind 127.0.0.1
# 限制客户端数量(redis.conf)
maxclients 10000
重要:Redis默认没有密码且监听所有接口,在生产环境必须配置密码和防火墙规则。
4.2 备份与恢复
Redis数据备份策略:
bash复制# 手动触发RDB备份
SAVE # 阻塞式备份
BGSAVE # 后台备份
# AOF备份只需复制aof文件
cp /var/lib/redis/appendonly.aof /backup/
# 恢复RDB
# 1. 关闭Redis
# 2. 复制备份的dump.rdb到Redis工作目录
# 3. 启动Redis
# 恢复AOF
# 1. 关闭Redis
# 2. 复制备份的appendonly.aof到Redis工作目录
# 3. 启动Redis(会自动重放AOF)
4.3 常见问题排查
-
内存不足错误:
- 检查maxmemory设置
- 查看内存使用情况:INFO memory
- 调整淘汰策略
-
连接数过多:
- 检查maxclients设置
- 查看连接信息:CLIENT LIST
- 关闭空闲连接:CLIENT KILL
-
性能下降:
- 检查慢查询:SLOWLOG GET
- 监控内存碎片率:INFO memory(mem_fragmentation_ratio)
- 检查持久化配置是否影响性能
4.4 Redis与Linux系统优化
为了获得最佳性能,可以进行系统级优化:
bash复制# 调整Linux内核参数
echo vm.overcommit_memory=1 >> /etc/sysctl.conf
echo net.core.somaxconn=65535 >> /etc/sysctl.conf
sysctl -p
# 禁用透明大页(THP)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 设置Redis进程的OOM killer调整
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl -p
这些优化可以减少内存交换、提高网络吞吐量,并防止Redis被OOM killer意外终止。
