Redis 核心应用场景
- 高性能缓存
Redis 作为内存数据库,读写性能可达10万+ QPS,适合缓存热点数据(如商品详情、用户会话),显著降低数据库压力。通过设置过期时间(TTL)自动清理非热点数据,推荐结合allkeys-lru或volatile-lfu淘汰策略优化内存使用。适合电商秒杀、新闻首页等高并发场景。
经典实现:
python
data = redis.get(“product:123”)
if not data:
data = db.query(“SELECT * FROM products WHERE id=123”)
redis.setex(“product:123”, 3600, data) # 缓存1小时
- 实时排行榜与计数器
利用有序集合(ZSET)可快速实现点击榜、销量榜等动态排序场景,通过ZINCRBY更新分数,ZREVRANGE获取TOP N数据。计数器场景(如文章阅读量)则使用INCR保证原子性操作,避免并发冲突。
示例:
redis
ZADD leaderboard 1000 “user1” # 用户得分更新
ZREVRANGE leaderboard 0 9 WITHSCORES # 获取TOP10
- 分布式锁与限流
通过SETNX+过期时间实现跨进程互斥锁,解决分布式系统资源竞争问题。结合EXPIRE防死锁,Lua脚本保证原子性。限流场景(如API防刷)使用INCR+EXPIRE统计单位时间请求量。
锁实现:
redis
SET lock:order 1 NX EX 30 # 获取锁,30秒自动释放
- 消息队列与发布订阅
List结构实现简单队列(LPUSH/RPOP),适合异步任务(如邮件发送)。Pub/Sub模式支持实时消息广播(如聊天室、订单状态通知),但需注意消息无持久化。
队列示例:
redis
LPUSH task_queue “send_email:user@example.com”
BRPOP task_queue 30 # 阻塞式消费
- 社交关系与去重
集合(SET)存储用户关注列表、好友关系,通过SINTER/SDIFF计算共同好友或推荐列表。HyperLogLog实现低成本UV统计(误差<1%),Bitmap标记用户签到等二值状态。
UV统计:
redis
PFADD page:uv “user1” “user2” # 添加用户
PFCOUNT page:uv # 估算UV
- 会话共享与分布式Session
将用户Session集中存储于Redis,解决集群环境会话一致性问题。相比Memcached,Redis支持持久化和高可用,适合微服务架构。
Session存储:
java
// Spring Session配置
@EnableRedisHttpSession
public class Config {
@Bean
public RedisConnectionFactory factory() {
return new LettuceConnectionFactory();
}
}
选型建议
缓存/会话:优先String/Hash
排行榜:必选ZSET
并发控制:SETNX+Lua
实时消息:List/PubSub(需ACK选专业MQ)
大数据处理:HyperLogLog/Bitmap
避免场景:复杂事务、多表关联查询、大Key(>1MB)。