Redis是基于内存的键值存储,支持多种数据结构,采用单线程非阻塞I/O实现高性能,提供RDB/AOF持久化,适用于缓存、消息队列及实时数据处理。
一、Redis 基础概念
-
数据结构 Redis 支持以下核心数据结构:
- String:字符串(文本、二进制数据、整数/浮点数)
- Hash:键值对集合(适合存储对象)
- List:有序元素集合(可重复)
- Set:无序唯一元素集合
- Sorted Set:有序唯一元素集合(按分值排序)
- Stream:日志型数据结构(用于消息队列)
- Bitmaps:基于字符串的位操作,节省内存(如用户签到统计)
- HyperLogLog:基数统计(近似去重,误差率约 0.81%)
- Geospatial (GEO) :地理位置坐标(存储、计算距离)
- JSON(需 Redis Stack):支持 JSON 格式数据
-
单线程模型 Redis 使用单线程处理命令,通过非阻塞 I/O 实现高并发。
-
持久化
- RDB:快照持久化(默认)。
- AOF:追加日志文件持久化(更安全)。
二、安装与连接
1. 安装 Redis
# Linux (Ubuntu)
sudo apt-get install redis-server
# MacOS
brew install redis
# 启动 Redis 服务
redis-server
2. 连接 Redis
# 命令行客户端(Redis Shell)
redis-cli
# 测试连接
PING # 返回 "PONG"
# Redis Shell 高级功能
redis-cli --scan --pattern "user:*" # 模式匹配键
redis-cli --latency # 查看延迟
redis-cli --bigkeys # 分析大 Key
三、核心 API 详解
1. 通用命令
-
键管理:
KEYS * # 匹配所有键(生产环境慎用) DEL key # 删除键 EXISTS key # 判断键是否存在 EXPIRE key 10 # 设置键过期时间(秒) TTL key # 查看剩余过期时间 TYPE key # 查看键的数据类型 -
慢查询分析:
SLOWLOG GET 5 # 获取最近 5 条慢查询 CONFIG SET slowlog-log-slower-than 1000 # 设置阈值(微秒)
2. String(字符串)
-
基本操作:
SET key value # 设置键值 GET key # 获取值 INCR key # 自增整数(原子操作) DECR key INCRBY key 5 # 按步长增减 APPEND key "world" # 追加字符串 -
Bitmaps(位操作) :
SETBIT user:sign:2023 100 1 # 用户ID 100 在2023年签到 GETBIT user:sign:2023 100 # 检查是否签到 BITCOUNT user:sign:2023 # 统计总签到次数
使用场景:缓存、计数器、分布式锁、用户签到。
3. Hash(哈希表)
-
操作对象字段:
HSET user:1 name "Alice" age 30 # 设置字段 HGET user:1 name # 获取字段值 HGETALL user:1 # 获取所有字段 HDEL user:1 age # 删除字段 HINCRBY user:1 age 1 # 字段自增
使用场景:存储对象(如用户信息)。
4. List(列表)
-
队列操作:
LPUSH list1 "a" # 左侧插入元素 RPUSH list1 "b" # 右侧插入元素 LPOP list1 # 左侧弹出元素 LRANGE list1 0 -1 # 获取所有元素 -
阻塞操作:
BLPOP list1 10 # 阻塞式左弹出(超时10秒)
使用场景:消息队列、最新消息列表。
5. Set(集合)
-
唯一性操作:
SADD tags "redis" "db" # 添加元素 SMEMBERS tags # 获取所有元素 SISMEMBER tags "redis" # 判断元素是否存在 SINTER tags1 tags2 # 求交集 SUNION tags1 tags2 # 求并集
使用场景:标签系统、好友关系。
6. Sorted Set(有序集合)
-
按分值排序:
ZADD rank 100 "Alice" 90 "Bob" # 添加元素(分值) ZRANGE rank 0 -1 WITHSCORES # 按升序获取元素 ZREVRANGE rank 0 -1 # 按降序获取元素 ZRANK rank "Alice" # 获取排名
使用场景:排行榜、延时队列。
7. Stream(流)
-
消息队列操作:
XADD mystream * field1 value1 # 添加消息(自动生成ID) XREAD COUNT 2 STREAMS mystream 0 # 读取消息 XGROUP CREATE mystream mygroup 0 # 创建消费者组
使用场景:消息队列(类似 Kafka)。
8. HyperLogLog
-
基数统计:
PFADD visits:2023 "user1" "user2" # 添加元素 PFCOUNT visits:2023 # 统计独立用户数 PFMERGE visits:all visits:2022 visits:2023 # 合并统计
特点:12KB 内存可统计约 2^64 个元素,误差率 0.81%。
9. Geospatial (GEO)
-
地理位置操作:
GEOADD cities 116.40 39.90 "Beijing" # 添加坐标 GEODIST cities "Beijing" "Shanghai" km # 计算距离 GEORADIUS cities 116 39 100 km # 查询半径内城市
使用场景:附近地点搜索、配送范围计算。
四、高级功能
1. Pipeline(管道)
-
批量执行命令,减少网络往返:
# 命令行示例 (echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379 # Python 示例 pipe = r.pipeline() pipe.set("a", 1).get("a").incr("counter") result = pipe.execute() # 结果按顺序返回 [True, b'1', 1]性能提升:非事务模式管道可提升 5-10 倍吞吐量。
2. 事务与 Lua 脚本
-
事务(原子操作) :
MULTI SET key1 10 INCR key1 EXEC -
Lua 脚本(原子 + 复杂逻辑) :
EVAL "return redis.call('GET', KEYS[1])" 1 key1 # 预加载脚本 SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])" EVALSHA <sha1_hash> 1 key1 value1
优势:避免竞态条件,自定义原子命令。
3. 发布订阅
-
消息广播机制:
SUBSCRIBE news # 订阅频道 PUBLISH news "hello" # 发布消息 PSUBSCRIBE news.* # 模式订阅
局限:消息不持久化,消费者离线会丢失消息(推荐用 Stream 替代)。
五、性能优化与监控
1. 慢查询分析
-
配置与查看:
# 设置慢查询阈值(单位:微秒,默认 10000) CONFIG SET slowlog-log-slower-than 1000 # 查看最近 10 条慢查询 SLOWLOG GET 10
2. 内存优化
- 避免大 Key:单 Key 数据不超过 1MB。
- 使用高效数据结构:如 HyperLogLog 替代 Set 统计 UV。
3. 连接池(Python 示例)
from redis import ConnectionPool
pool = ConnectionPool(host='localhost', port=6379, max_connections=10)
r = redis.Redis(connection_pool=pool)
六、客户端示例(Python)
使用 redis-py 库:
import redis
# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# Bitmaps 操作
r.setbit("user:sign:2023", 100, 1) # 用户 100 签到
print(r.getbit("user:sign:2023", 100)) # 输出 1
# GEO 操作
r.geoadd("cities", (116.40, 39.90, "Beijing"))
print(r.geodist("cities", "Beijing", "Shanghai", "km"))
# HyperLogLog 操作
r.pfadd("visits:2023", "user1", "user2")
print(r.pfcount("visits:2023")) # 输出 2
七、最佳实践
-
Pipeline 批量操作:减少网络延迟对性能的影响。
-
Lua 脚本替代事务:处理复杂原子逻辑更灵活。
-
合理选择数据结构:
- 统计独立用户数 → HyperLogLog
- 地理位置计算 → GEO
- 标记用户行为 → Bitmaps
-
监控工具:
redis-cli --bigkeys分析大 KeyINFO命令查看服务器状态- RedisInsight(可视化监控)
通过结合 Redis 丰富的数据结构、原子操作和高级功能(如 Lua、Pipeline),开发者可以高效解决高并发场景下的缓存、实时统计、消息队列等问题。同时,合理使用慢查询分析和性能优化策略,能进一步提升系统稳定性。