Redis 会话管理
Redis存储Session实现分布式会话,解决多服务器Session共享问题,支持Token管理和多端登录控制。
Session存储方案
传统Session问题
Bash
单服务器:Session存内存,服务重启丢失
多服务器:Session不共享,用户需重复登录
负载均衡:请求可能打到不同服务器
Redis Session优势
Bash
- 集中存储,多服务器共享
- 支持过期,自动清理
- 高性能读写
- 支持分布式部署
Session存储实现
存储用户Session
Bash
# 存储Session数据(String类型)
SET session:token123 '{"userId":1000,"name":"Alice","role":"admin"}' EX 1800
# 获取Session
GET session:token123
# 检查Session是否存在
EXISTS session:token123
# 删除Session(登出)
DEL session:token123
# 刷新过期时间
EXPIRE session:token123 1800
Hash存储Session
Bash
# Hash存储Session字段
HSET session:token123 userId 1000 name "Alice" role "admin" ip "192.168.1.100"
# 获取单个字段
HGET session:token123 userId
# 获取全部字段
HGETALL session:token123
# 更新字段
HSET session:token123 lastAccess 1700000000
# 删除Session
DEL session:token123
Hash存储部分更新效率更高,String适合整体读写。
Token管理
Token生成与存储
Bash
# 生成Token(UUID或随机字符串)
token = uuid()
# 存储Token关联用户ID
SET token:abc123 "user:1000" EX 7200
# 验证Token
GET token:abc123
# 返回: "user:1000"
# Token过期(2小时)
EXPIRE token:abc123 7200
用户Token映射
Bash
# 用户ID关联Token(单设备)
SET user:1000:token "abc123"
# 用户多Token(多设备)
SADD user:1000:tokens "abc123" "def456" "ghi789"
# 查询用户所有Token
SMEMBERS user:1000:tokens
# 删除特定Token
SREM user:1000:tokens "abc123"
多端登录控制
单设备登录
Bash
# 用户登录时检查旧Token
old_token = GET user:1000:token
# 删除旧Session
if old_token:
DEL session:{old_token}
# 设置新Token
SET user:1000:token "new_token" EX 7200
SET session:new_token '{"userId":1000}' EX 7200
多设备登录
Bash
# 用户Token集合
SADD user:1000:tokens "device1_token" "device2_token"
# 设备信息
HSET device:device1_token type "mobile" lastLogin 1700000000
# 设备数量限制
tokens = SMEMBERS user:1000:tokens
if len(tokens) > 3:
# 删除最旧的Token
oldest = ...
SREM user:1000:tokens oldest
DEL session:{oldest}
设备踢出
Bash
# 踢出特定设备
SREM user:1000:tokens "device_token"
DEL session:device_token
# 踢出所有设备(强制登出)
tokens = SMEMBERS user:1000:tokens
for token in tokens:
DEL session:{token}
DEL user:1000:tokens
Session过期策略
固定过期
Python
# 设置固定过期时间(30分钟)
SET session:token123 data EX 1800
滑动过期
Bash
# 每次访问刷新过期时间
GET session:token123
if exists:
EXPIRE session:token123 1800
代码实现
Bash
def get_session(token):
session = redis.get(f"session:{token}")
if session:
# 滑动刷新过期时间
redis.expire(f"session:{token}", 1800)
return session
return None
登录状态检查
快速验证
Bash
# 检查Token是否存在
EXISTS session:token123
# 返回: 1存在,0不存在
# TTL检查(-2表示已过期)
TTL session:token123
权限验证
Bash
# 存储用户权限
HSET session:token123 role "admin" permissions "read,write,delete"
# 检查权限
HGET session:token123 role
安全措施
Token安全
Bash
# Token随机性
token = uuid() + random_string()
# Token绑定IP
HSET session:token123 ip "192.168.1.100" userAgent "Chrome"
# IP变化检测
current_ip = HGET session:token123 ip
if request_ip != current_ip:
# 异常,可能被盗用
DEL session:token123
Session加密
Bash
- Session数据加密存储
- Token使用HTTPS传输
- Token不暴露在URL中
- 设置合理的过期时间
性能优化
批量操作
text
# 批量检查Session
MGET session:token1 session:token2 session:token3
# Pipeline批量刷新
PIPELINE
EXPIRE session:token1 1800
EXPIRE session:token2 1800
EXEC
内存优化
text
# Session数据精简
# 只存必要信息,大对象存数据库
# 合理过期时间
# 过短频繁登录,过长内存压力大
# 清理策略
maxmemory-policy volatile-ttl
集群Session
集群存储
text
# 使用哈希标签保证同槽位
session:{user:1000}:token
session:{user:1000}:data
# 同用户Session在同一节点
Session共享
text
- 集群模式下Session自动共享
- 使用统一Token格式
- 配置正确的过期策略
要点总结
- Redis存储Session实现分布式共享,解决多服务器问题
- String适合整体读写,Hash适合部分更新
- EXPIRE设置过期,EXISTS快速验证Session
- 滑动过期:每次访问刷新过期时间
- 单设备登录:删除旧Token再创建新Token
- 多设备登录:Set存储多个Token,限制设备数量
- Token绑定IP增强安全性,IP变化检测异常
- Session数据精简,合理设置过期时间
- 集群使用哈希标签保证同用户数据同节点
📝 发现内容有误?点击此处直接编辑