Redis入门指南:从安装到实战应用

供了多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。

Redis的核心特点

  • 内存存储:数据主要存储在内存中,读写速度极快
  • 数据结构丰富:支持多种数据结构,不仅限于简单的key-value
  • 持久化:支持RDB和AOF两种持久化方式
  • 高可用:支持主从复制、哨兵模式和集群模式
  • 原子操作:所有操作都是原子性的
  • 发布订阅:支持消息通信模式

安装Redis

macOS安装

1
2
3
4
5
6
7
8
9
# 使用Homebrew安装
brew install redis

# 启动Redis服务
brew services start redis

# 检查Redis是否运行
redis-cli ping
# 返回PONG表示运行正常

Linux安装

1
2
3
4
5
6
7
8
9
10
# Ubuntu/Debian
sudo apt update
sudo apt install redis-server

# CentOS/RHEL
sudo yum install redis

# 启动Redis
sudo systemctl start redis
sudo systemctl enable redis

Docker安装

1
2
3
4
5
6
7
8
# 拉取Redis镜像
docker pull redis:latest

# 运行Redis容器
docker run -d --name redis -p 6379:6379 redis

# 连接到Redis
docker exec -it redis redis-cli

Redis数据类型详解

1. 字符串(String)

最基础的数据类型,可以存储字符串、整数或浮点数。

1
2
3
4
5
6
7
8
9
10
11
12
# 设置值
SET name "Redis"
SET counter 100

# 获取值
GET name
GET counter

# 数值操作
INCR counter # 自增1
DECR counter # 自减1
INCRBY counter 10 # 增加指定值

2. 哈希(Hash)

适合存储对象,每个hash可以存储多个键值对。

1
2
3
4
5
6
7
8
9
10
11
12
# 存储用户信息
HSET user:1000 name "张三" age 25 city "北京"
HSET user:1000 email "zhangsan@example.com"

# 获取用户信息
HGETALL user:1000
HGET user:1000 name
HGET user:1000 age

# 获取所有字段
HKEYS user:1000
HVALS user:1000

3. 列表(List)

基于链表实现的列表,支持从两端插入和删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 从左侧插入
LPUSH mylist "a" "b" "c"

# 从右侧插入
RPUSH mylist "d" "e"

# 查看列表
LRANGE mylist 0 -1 # 查看所有元素
LRANGE mylist 0 2 # 查看前3个元素

# 弹出元素
LPOP mylist # 从左侧弹出
RPOP mylist # 从右侧弹出

4. 集合(Set)

无序的唯一元素集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加元素
SADD tags "redis" "database" "cache"
SADD tags "redis" # 重复元素不会被添加

# 查看集合
SMEMBERS tags

# 判断元素是否存在
SISMEMBER tags "redis"

# 集合操作
SUNION set1 set2 # 并集
SINTER set1 set2 # 交集
SDIFF set1 set2 # 差集

5. 有序集合(Sorted Set)

每个成员都关联一个分数(score),按分数排序。

1
2
3
4
5
6
7
8
9
10
11
# 添加成员
ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie"

# 查看排行榜
ZREVRANGE leaderboard 0 -1 WITHSCORES

# 获取排名
ZREVRANK leaderboard "Bob"

# 获取分数范围内的成员
ZRANGEBYSCORE leaderboard 100 200

Redis高级特性

过期时间(TTL)

1
2
3
4
5
6
7
8
9
10
# 设置过期时间
SETEX session_token 3600 "abc123" # 1小时后过期
EXPIRE name 60 # 60秒后过期

# 查看剩余时间
TTL name
PTTL name # 毫秒级

# 移除过期时间
PERSIST name

事务

Redis支持简单的事务功能:

1
2
3
4
5
6
7
8
9
# 开启事务
MULTI
SET key1 "value1"
INCR counter
SET key2 "value2"
EXEC # 执行事务

# 取消事务
DISCARD

发布订阅

1
2
3
4
5
6
7
8
# 订阅频道
SUBSCRIBE news

# 发布消息
PUBLISH news "Hello Redis subscribers!"

# 使用模式匹配订阅
PSUBSCRIBE news.*

Redis性能优化

内存优化

  1. 使用合适的数据结构:根据场景选择最优的数据类型
  2. 设置合理的过期时间:避免无用数据长期占用内存
  3. 使用内存压缩:启用压缩节省内存

连接优化

1
2
3
4
5
# 查看连接数
INFO clients

# 设置最大连接数
CONFIG SET maxclients 10000

持久化配置

RDB配置

1
2
3
4
# redis.conf
save 900 1 # 900秒内有1个key变化就保存
save 300 10 # 300秒内有10个key变化就保存
save 60 10000 # 60秒内有10000个key变化就保存

AOF配置

1
2
3
# redis.conf
appendonly yes
appendfsync everysec # 每秒同步一次

实际应用场景

1. 缓存系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import redis
import json

# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)

def get_user_profile(user_id):
cache_key = f"user:{user_id}"
cached = r.get(cache_key)

if cached:
return json.loads(cached)

# 从数据库获取
user_data = fetch_from_database(user_id)

# 缓存1小时
r.setex(cache_key, 3600, json.dumps(user_data))
return user_data

2. 计数器

1
2
3
4
5
# 文章阅读量统计
r.incr("article:1000:views")

# 获取阅读量
views = r.get("article:1000:views")

3. 会话存储

1
2
3
4
5
6
7
8
9
# 存储用户会话
session_id = "sess_abc123"
session_data = {
"user_id": 1000,
"username": "alice",
"login_time": "2024-12-19 14:30:00"
}

r.setex(session_id, 1800, json.dumps(session_data)) # 30分钟过期

4. 排行榜

1
2
3
4
5
# 游戏排行榜
r.zadd("game_leaderboard", {"Alice": 1500, "Bob": 1200, "Charlie": 1800})

# 获取前10名
top_players = r.zrevrange("game_leaderboard", 0, 9, withscores=True)

Redis监控和维护

常用监控命令

1
2
3
4
5
6
7
8
9
10
11
# 查看Redis信息
INFO
INFO memory
INFO stats
INFO replication

# 查看慢查询
SLOWLOG GET 10

# 查看客户端连接
CLIENT LIST

性能测试

1
2
3
4
5
# 使用redis-benchmark测试性能
redis-benchmark -q -n 100000

# 测试指定命令
redis-benchmark -t set,get -n 100000

最佳实践总结

  1. 键名设计:使用冒号分隔的命名空间,如 user:1000:profile
  2. 数据大小:避免存储过大的值(建议<1MB)
  3. 连接管理:使用连接池,避免频繁创建连接
  4. 错误处理:做好异常处理,防止缓存雪崩
  5. 监控告警:设置合理的监控指标和告警阈值

结语

Redis作为一个高性能的内存数据库,在现代应用架构中扮演着重要角色。通过本文的学习,你应该已经掌握了Redis的基本概念、数据类型、常用命令以及实际应用场景。记住,合理使用缓存能够显著提升系统性能,但也要注意缓存一致性、过期策略等问题。

继续深入学习Redis的集群部署、哨兵模式、Lua脚本等高级特性,将帮助你构建更加健壮和高效的系统。


参考资料