Redis 缓存数据库完全指南
Redis 是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。本文将全面介绍 Redis 的核心概念、数据结构、常用命令和实战应用。
一、Redis 简介
1.1 什么是 Redis?
Redis 是一个基于内存的键值对存储系统,支持多种数据结构,提供高性能的数据读写操作。它通常用于缓存、会话存储、排行榜等场景。
1.2 Redis 的特点
- 高性能:数据存储在内存中,读写速度极快
- 丰富的数据结构:支持字符串、列表、集合、有序集合等
- 持久化:支持 RDB 和 AOF 两种持久化方式
- 高可用:支持主从复制和集群模式
- 原子操作:支持多种原子操作命令
1.3 Redis 的应用场景
- 缓存:加速数据访问
- 会话存储:管理用户会话
- 排行榜:实时排行榜功能
- 消息队列:基于 Pub/Sub 和 List 的消息队列
- 计数器:计数功能
- 限流:防止恶意请求
二、安装和配置
2.1 安装 Redis
Linux 安装
sudo apt update sudo apt install redis-server
sudo yum install redis
sudo systemctl start redis sudo systemctl enable redis
redis-cli ping
|
Docker 安装
docker pull redis:latest
docker run -d \ --name redis \ -p 6379:6379 \ redis:latest
docker exec -it redis redis-cli
|
2.2 基础配置
修改 redis.conf 文件:
bind 127.0.0.1
port 6379
requirepass yourpassword
databases 16
save 900 1 save 300 10 save 60 10000
|
三、数据结构
3.1 String(字符串)
基础操作
SET name "张三" SET age "25"
GET name GET age
SETEX session:1 3600 "value" SET user:1:token abc123 EX 3600
INCR counter DECR counter INCRBY counter 10 DECRBY counter 5
GETSET counter 0
MSET key1 value1 key2 value2 MGET key1 key2 key3
APPEND message " world" GET message
GETRANGE key 0 4 SETRANGE key 0 "X"
|
应用场景
3.2 Hash(哈希)
基础操作
HSET user:1 name "张三" HSET user:1 age "25" HSET user:1 email "zhangsan@example.com"
HMSET user:2 name "李四" age "30" email "lisi@example.com"
HGET user:1 name HGETALL user:1 HGETALL user:2
HKEYS user:1
HVALS user:1
HLEN user:1
HSET user:1 name "王五"
HDEL user:1 age
HEXISTS user:1 email
HINCRBY user:1 age 1
HTYPE user:1
|
应用场景
3.3 List(列表)
基础操作
LPUSH tasks "任务1" LPUSH tasks "任务2" LPUSH tasks "任务3"
RPUSH messages "消息1" RPUSH messages "消息2"
LRANGE tasks 0 -1
LRANGE tasks 0 1 LRANGE tasks 1 -1
LLEN tasks
LINDEX tasks 0
RPOP tasks
LPOP tasks
RPOP tasks
LTRIM tasks 0 1
LSET tasks 0 "新任务"
LPUSHX tasks "新任务1" RPUSHX tasks "新任务2"
RPOPLPUSH tasks tasks_backup
|
应用场景
3.4 Set(集合)
基础操作
SADD tags "编程" "JavaScript" "Python" "Go"
SMEMBERS tags
SISMEMBER tags "Python"
SCARD tags
SREM tags "JavaScript" SMEMBERS tags
SRANDMEMBER tags SRANDMEMBER tags 2
SPOP tags
DEL tags
|
集合操作
SADD users:1 "张三" SADD users:2 "李四" SADD users:3 "王五" SUNION users:1 users:2 users:3
SINTER users:1 users:2
SDIFF users:1 users:2
SDIFF users:1 users:2
SDIFF users:2 users:1
SDIFFSTORE diff users:1 users:2
|
应用场景
3.5 Sorted Set(有序集合)
基础操作
ZADD leaderboard 100 "player1" ZADD leaderboard 200 "player2" ZADD leaderboard 150 "player3"
ZRANGE leaderboard 0 -1 WITHSCORES
ZRANGE leaderboard 0 1 ZRANGE leaderboard 1 2
ZREVRANGE leaderboard 0 1
ZRANGEBYSCORE leaderboard 0 200 ZRANGEBYSCORE leaderboard 0 100 WITHSCORES
ZRANGEBYSCORE leaderboard 100 200 WITHSCORES
ZRANK leaderboard "player1" ZREVRANK leaderboard "player1"
ZINCRBY leaderboard 50 "player1"
ZRANGE leaderboard 0 0 ZREVRANGE leaderboard 0 0
ZSCORE leaderboard "player1"
ZREM leaderboard "player1"
|
应用场景
四、高级功能
4.1 发布订阅
PUBLISH topic:news "这是新闻" PUBLISH topic:news "这是最新的新闻"
SUBSCRIBE topic:news
SUBSCRIBE topic:news topic:sports topic:tech
SUBSCRIBE
UNSUBSCRIBE topic:news
PUBSUB NUMSUB topic:news topic:sports
|
4.2 事务
MULTI
SET key1 "value1" SET key2 "value2" INCR counter
EXEC
MULTI SET key1 "value1" SET key2 "value2" DISCARD
|
4.3 过期时间
SETEX session:1 3600 "value"
EXPIRE key 300
PEXPIRE key 300000
TTL key
PTTL key
TTL key
PERSIST key
TTL key
PTTL key
PERSIST key
|
4.4 Lua 脚本
local key = KEYS[1] local value = ARGV[1] redis.call('SET', key, value) return redis.call('GET', key)
redis-cli --eval redis_script.lua, key, value
redis-cli EVAL "$(cat redis_script.lua)" 1 key value
|
4.5 服务器信息
INFO
INFO server INFO clients INFO memory INFO stats INFO replication
CLIENT LIST
CLIENT KILL ip:port
CLIENT SETNAME my_app
DBSIZE DBSIZE
FLUSHDB
FLUSHALL
|
五、持久化
5.1 RDB 持久化
RDB(Redis Database)是 Redis 默认的持久化方式。
配置
save 900 1 save 300 10 save 60 10000
save ""
BGSAVE
dir /var/lib/redis dbfilename dump.rdb
|
工作原理
- 根据配置的规则定期保存
- RDBSAVE 命令手动保存
- RDBAFTER 命令 fork 子进程保存
5.2 AOF 持久化
AOF(Append Only File)记录所有写操作。
配置
appendonly yes
appendfsync everysec appendfsync always appendfsync no
appendfilename "appendonly.aof"
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
|
工作原理
- 记录所有写操作到 AOF 文件
- 定期重写 AOF 文件(压缩)
命令
CONFIG SET appendonly yes
CONFIG SET appendonly no
BGREWRITEAOF
INFO persistence
|
六、性能优化
6.1 内存优化
INFO memory
SET user:1:name "张三" SET user:1:age "25" SET user:1:email "zhang@example.com"
HSET user:1 name "张三" age "25" email "zhang@example.com"
CONFIG SET maxmemory 2gb
|
6.2 网络优化
PIPELINE MSET key1 value1 key2 value2 MGET key1 key2
redis-cli --pipe < commands.txt
|
6.3 连接优化
CONFIG SET maxclients 10000
CONFIG SET timeout 300
|
七、实战应用
7.1 缓存实现
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.setex('user:1:info', 3600, '{"name":"张三","age":25}')
data = r.get('user:1:info') print(data)
if r.exists('user:1:info'): data = r.get('user:1:info') else: data = get_user_from_db(1) r.setex('user:1:info', 3600, data)
|
7.2 排行榜
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.zincrby('scoreboard', 10, 'player1')
scores = r.zrevrange('scoreboard', 0, 9, withscores=True) for rank, (player, score) in enumerate(scores, 1): print(f"{rank}. {player}: {score}")
|
7.3 限流
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
def check_rate_limit(key, limit, window): """检查是否超过限流""" current = r.incr(key) if current == 1: r.expire(key, window)
return current <= limit
if check_rate_limit('rate_limit:api', 100, 60): pass else: print("请求过于频繁,请稍后再试")
|
八、最佳实践
8.1 命名规范
user:1:profile user:2:profile cache:user:1
api-endpoint request-id
|
8.2 错误处理
try: r.set('key', 'value') except redis.RedisError as e: print(f"Redis 错误: {e}")
|
8.3 安全建议
- 启用密码认证
- 限制访问 IP
- 使用 SSL 连接
- 定期备份数据
- 监控 Redis 状态
九、总结
Redis 的核心优势:
- 高性能:内存存储,读写速度快
- 丰富的数据结构:支持多种数据结构
- 持久化:支持 RDB 和 AOF 两种持久化
- 高可用:支持主从复制和集群
常用命令:
SET key value GET key DEL key
INCR key DECR key SETEX key seconds value
HSET key field value HGET key field HGETALL key
LPUSH key value RPOP key LRANGE key start stop
SADD key member SMEMBERS key SISMEMBER key member
ZADD key score member ZRANGE key start stop ZINCRBY key increment member
|
掌握 Redis,可以构建高性能的应用程序!