用 Redis 存登录会话的简单接法
发布时间:2026-02-27 18:16       
更新时间:2026-02-27 20:44
把登录会话从应用服务器的本机文件挪进 Redis,多台机器就能共用一份登录态,负载均衡后面加减节点,用户也不会被踢下线。以 PHP 和 Python 为例走一遍接法。
先备齐三样
一台装好 Redis 的云服务器(4.x 以上),redis.conf 里设 requirepass 强密码、bind 内网地址,不要暴露公网;应用服务器与 Redis 内网互通,防火墙只放行应用网段访问 6379;应用侧装好 redis 客户端库(phpredis 或 redis-py)。Redis 和应用同机时,bind 127.0.0.1 就够;跨机走内网时,bind 填内网网卡地址。实例跑在云服务器上,安全组同样只对应用网段放行 6379。
写入会话
PHP:
$redis = new Redis();
$redis->connect('10.0.0.8', 6379);
$redis->auth('强密码');
$redis->setex('sess:'.$sid, 1800, serialize($userData));
Python 的 redis-py 同理:r.setex('sess:'+sid, 1800, json.dumps(data))。关键在 setex:写入的同时定好过期时间,避免只 set 不设过期,会话垃圾越堆越多。
过期与续期
过期时间一般取 30 分钟到 2 小时,用户每次活跃时重新执行 expire 刷新,就是"活跃续期"。别把时间设得过长,会话越长,被盗用后的风险窗口越大。续期动作一般挂在鉴权中间件里做:每次请求带着会话来验签,验过了顺手执行一次 expire,成本极低,也不侵入业务代码。
序列化的坑
存进去的对象要统一序列化方式:serialize、JSON、MessagePack 选一种并全团队统一,读出来用同样的方式还原。带资源句柄的东西(数据库连接这类)序列化不了,只存纯数据。多台应用服务器版本不一致,就会出现 A 机写的会话 B 机读不懂。升级应用时动了序列化方式,要安排灰度:新旧两种格式并行读取一个版本周期,等旧会话自然过期,再下掉旧解析代码。
验证与排错
redis-cli -h 10.0.0.8 -a 密码 登录后,用 scan 遍历 sess:* 能看到会话键,TTL sess:xxx 显示剩余秒数。两台应用服务器各登录一次都能读到同一会话,即为打通。偶发掉线多数是没续期或序列化不一致;连不上先查 bind、防火墙、requirepass 三处。把这套参数固化成配置模板,新环境接入时照抄,能省掉大部分排查时间。