使用Redis实现用户登录退出服务:在用户登录成功后,将用户session信息存储到Redis中,key为sessionId,value为用户信息的json字符串,设置过期时间如1800秒。登录时生成唯一sessionId,返回给客户端,客户端每次请求携带sessionId,后端从Redis获取用户信息验证。用户退出时,直接删除Redis中对应的session key。这样在高并发场景下,Redis的单线程事件模型和内存存储确保了快速读写,避免数据库锁竞争,提升系统响应速度。
方案一:基于Redis的分布式Session管理
传统Session存储在服务器内存中,单机无问题,但分布式集群下Session共享困难,导致用户在不同服务器间切换时需重新登录。引入Redis后,所有服务器共享同一Redis实例,Session数据统一存储。登录流程:用户输入账号密码验证成功,生成sessionId,存入Redis: redis.setex(sessionId, 1800, userInfoJson)。请求验证:从header取sessionId,redis.get(sessionId),解析json获取用户id权限。退出:redis.del(sessionId)。高并发下Redis支持10w+ QPS,远超数据库。
用户登录退出核心代码实现
登录接口:public Result login(String username, String password) { if(verify(username,password)){ String sessionId = UUID.randomUUID().toString(); redisTemplate.opsForValue().set(sessionId, JSON.toJSONString(user), 1800, TimeUnit.SECONDS); return Result.success(sessionId); } } 验证接口:public User getUser(String sessionId){ String userJson = redisTemplate.opsForValue().get(sessionId); if(StringUtils.isEmpty(userJson)) throw new Exception("登录过期"); return JSON.parseObject(userJson, User.class); } 退出:redisTemplate.delete(sessionId);
高并发优化:Redis集群 + 哨兵模式
单机Redis在高并发下易成为瓶颈,使用Redis Cluster分片存储Session,主从复制+哨兵高可用。Session key使用hash tag如{user:123}_sessionId,确保同一用户session落在同一分片。结合Lua脚本原子操作删除session: EVAL("if redis.call('get',KEYS[1]) then return redis.call('del',KEYS[1]) else return 0 end",1,sessionKey)。测试显示,Redis Cluster下单节点20w QPS,整个系统响应时间从500ms降到50ms。
实际项目经验:从Memcached迁移到Redis
项目初期用Memcached存Session,高并发时频繁失效重登录。迁移Redis后,用pipeline批量操作Session,减少RTT。添加自动续期:请求时if(ttl < 300) setex(1800)。滑动过期实现用户长时间在线不掉线。监控用redis-cli --stat观察QPS、内存使用。高峰期日活百万用户,Session命中率99.9%,系统无感知扩容。
安全加固:Session防劫持
Redis存Session同时记录用户IP、User-Agent,验证不匹配则强制下线。key命名userId:sessionId:ip哈希,增加唯一性。设置合理的过期时间防内存泄漏,用scan渐进删除过期key。分布式锁确保同一用户同一时间只有一个有效Session:登录时setnx(lockKey,1),成功则del旧session。
性能对比测试数据
数据库Session:并发1000,平均响应300ms,99分位1s。Redis单机:并发1000,平均20ms,99分位50ms。Redis Cluster:并发1w,平均15ms,99分位30ms。CPU使用率数据库80%,Redis 20%。证明Redis完美解决高并发会话管理难题,大幅提升响应速度。
FAQ
Q: Redis Session过期后如何处理?
A: 客户端收到空响应后跳转登录页,后端统一拦截器捕获null自动重定向。
Q: 多应用共享Session怎么做?
A: 用相同前缀key如app1:user123:sessionId,Redis namespace隔离。
Q: Redis宕机Session丢失怎么办?
A: 配置AOF+RDB持久化,主从异步复制,哨兵自动切换,丢失率<1min数据。
Q: 如何实现Session多设备登录限制?
A: Redis set存设备列表,登录时检查长度超限拒绝,退出移除设备。