Redis入门指南:从安装到实战应用
供了多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
Redis的核心特点
- 内存存储:数据主要存储在内存中,读写速度极快
- 数据结构丰富:支持多种数据结构,不仅限于简单的key-value
- 持久化:支持RDB和AOF两种持久化方式
- 高可用:支持主从复制、哨兵模式和集群模式
- 原子操作:所有操作都是原子性的
- 发布订阅:支持消息通信模式
安装Redis
macOS安装
1 2 3 4 5 6 7 8 9
| brew install redis
brew services start redis
redis-cli ping
|
Linux安装
1 2 3 4 5 6 7 8 9 10
| sudo apt update sudo apt install redis-server
sudo yum install redis
sudo systemctl start redis sudo systemctl enable redis
|
Docker安装
1 2 3 4 5 6 7 8
| docker pull redis:latest
docker run -d --name redis -p 6379:6379 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 DECR counter 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
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" EXPIRE name 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 4 5
| INFO clients
CONFIG SET maxclients 10000
|
持久化配置
RDB配置
1 2 3 4
| save 900 1 save 300 10 save 60 10000
|
AOF配置
1 2 3
| 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
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) 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))
|
4. 排行榜
1 2 3 4 5
| r.zadd("game_leaderboard", {"Alice": 1500, "Bob": 1200, "Charlie": 1800})
top_players = r.zrevrange("game_leaderboard", 0, 9, withscores=True)
|
Redis监控和维护
常用监控命令
1 2 3 4 5 6 7 8 9 10 11
| INFO INFO memory INFO stats INFO replication
SLOWLOG GET 10
CLIENT LIST
|
性能测试
1 2 3 4 5
| redis-benchmark -q -n 100000
redis-benchmark -t set,get -n 100000
|
最佳实践总结
- 键名设计:使用冒号分隔的命名空间,如
user:1000:profile
- 数据大小:避免存储过大的值(建议<1MB)
- 连接管理:使用连接池,避免频繁创建连接
- 错误处理:做好异常处理,防止缓存雪崩
- 监控告警:设置合理的监控指标和告警阈值
结语
Redis作为一个高性能的内存数据库,在现代应用架构中扮演着重要角色。通过本文的学习,你应该已经掌握了Redis的基本概念、数据类型、常用命令以及实际应用场景。记住,合理使用缓存能够显著提升系统性能,但也要注意缓存一致性、过期策略等问题。
继续深入学习Redis的集群部署、哨兵模式、Lua脚本等高级特性,将帮助你构建更加健壮和高效的系统。
参考资料