全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-12 6 分钟 ✍️ juanwangdev

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数据精简,合理设置过期时间
  • 集群使用哈希标签保证同用户数据同节点

📝 发现内容有误?点击此处直接编辑

← 上一篇 混合持久化
下一篇 → Redis 位图与布隆过滤器
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库