我的Redis学习笔记:从命令行到性能调优
Redis
Redis(Remote Dictionary Server)本质上是一个基于内存的键值存储系统.
安装配置Redis的过程非常简单:
# Ubuntu/Debian安装Redis
sudo apt-get update
sudo apt-get install redis-server
# 启动Redis服务
sudo systemctl start redis
# 检查Redis状态
redis-cli ping
# 输出应为: PONG
Redis的核心数据结构与命令
初学Redis最重要的是理解其核心数据结构。与其他数据库不同,Redis提供了多种数据类型,每种类型都有其特定用途和相应的命令集。
1. 字符串(Strings)
字符串是Redis最基本的数据类型,可以存储文本、序列化的对象或二进制数据。
# 设置键值对
SET user:1001 "{"name":"张三","email":"zhangsan@example.com"}"
# 获取值
GET user:1001
# 设置带过期时间的键值对(3600秒后过期)
SETEX session:token123 3600 "user_session_data"
# 原子递增操作
SET counter 0
INCR counter # 返回1
INCRBY counter 10 # 返回11
2. 哈希表(Hashes)
哈希表适合存储对象,比字符串更节省内存,且允许单独操作对象的字段。
# 存储用户信息
HMSET user:1001 name "张三" email "zhangsan@example.com" age 28 active 1
# 获取特定字段
HGET user:1001 name # 返回 "张三"
# 获取所有字段
HGETALL user:1001
# 增加数值字段的值
HINCRBY user:1001 age 1 # 年龄+1
3. 列表(Lists)
列表是简单的字符串链表,适合实现队列或栈结构。
# 左侧推入元素(栈)
LPUSH tasks "task1"
LPUSH tasks "task2"
# 右侧推入元素(队列)
RPUSH messages "message1"
RPUSH messages "message2"
# 左侧弹出元素
LPOP tasks # 返回 "task2"
# 获取列表范围元素
LRANGE messages 0 -1 # 获取所有元素
4. 集合(Sets)
集合是无序的字符串集合,支持复杂的集合操作。
# 添加集合成员
SADD tags:article:1 "redis" "database" "nosql"
# 获取所有成员
SMEMBERS tags:article:1
# 判断成员是否存在
SISMEMBER tags:article:1 "redis" # 返回1表示存在
# 集合间操作
SADD user:1:follows 1001 1002 1003
SADD user:2:follows 1001 1003 1004
SINTER user:1:follows user:2:follows # 交集,返回共同关注
5. 有序集合(Sorted Sets)
有序集合是集合的增强版,每个成员关联一个分数用于排序。
# 添加带分数的成员
ZADD leaderboard 100 "player1"
ZADD leaderboard 200 "player2"
ZADD leaderboard 150 "player3"
# 获取排名(从高到低)
ZREVRANGE leaderboard 0 2 WITHSCORES # 前三名及分数
# 增加成员分数
ZINCRBY leaderboard 50 "player1" # player1分数+50
# 获取成员排名
ZREVRANK leaderboard "player2" # 返回player2的排名(从0开始)
高级特性实践
1. 事务操作
Redis的事务可以确保命令序列的原子性执行。
MULTI # 开始事务
SET balance:user1 500
DECRBY balance:user1 200
INCRBY balance:user2 200
EXEC # 执行事务
2. 键过期与淘汰策略
在内存有限的生产环境中,合理设置键过期时间和选择适当的内存淘汰策略至关重要。
# 设置过期时间
EXPIRE user:session:123 1800 # 30分钟过期
# 查看剩余过期时间
TTL user:session:123
# 修改Redis配置使用LRU淘汰策略
# 在redis.conf中设置
# maxmemory 2gb
# maxmemory-policy allkeys-lru
3. 发布/订阅模式
Redis的发布/订阅功能可用于构建简单的消息系统。
# 终端1:订阅频道
SUBSCRIBE notifications
# 终端2:发布消息
PUBLISH notifications "系统将于今晚10点进行维护"
Redis集群实践
当单个Redis实例无法满足需求时,我开始研究Redis集群方案。以下是我搭建主从复制和哨兵模式的简要步骤:
1. 主从复制(Master-Slave Replication)
# 在从节点配置(slave)
slaveof 192.168.1.10 6379
2. 哨兵模式(Sentinel)
创建sentinel.conf
文件:
sentinel monitor mymaster 192.168.1.10 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
启动哨兵:
redis-sentinel sentinel.conf
3. Redis Cluster
Redis Cluster需要更复杂的配置,但提供了更好的水平扩展能力:
# 在每个节点的配置中添加
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
# 创建集群
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
踩坑记录
学习过程中难免会遇到一些问题,以下是我的一些踩坑经历:
-
内存碎片化问题:长时间运行后,Redis可能出现内存碎片。可以通过执行
INFO memory
命令查看碎片率,必要时执行MEMORY PURGE
或重启实例。 -
大键问题:一次发现系统响应变慢,排查后发现是一个包含数百万元素的hash键造成的。解决方案是拆分大键并使用
SCAN
命令进行分批处理。 -
网络超时:在AWS上部署Redis时,经常遇到网络超时问题。增加
tcp-keepalive
参数和调整客户端超时设置后解决。
2025.4.20记录我与Redis共同成长的几天