当前位置:首页 > 问答 > 正文

用Redis做登录验证,缓存啥数据咋快速校验用户身份那些事儿

说到用Redis做登录验证这事儿,咱们就聊得直白点,核心思想就一句话:把关键的登录信息从慢吞吞的数据库里挪到速度飞快的Redis内存里,让每次验证身份像闪电一样快。

那具体缓存啥数据,又怎么快速校验呢?咱们一步步拆开看。

最核心的问题是:我们把什么东西存进Redis?

你不能把用户的密码明文存进去,那太危险了,根据网上很多程序员分享的经验(来源:CSDN技术社区、博客园等开发者常用论坛),主流做法是缓存一个叫 “令牌” 的东西,最常见的就是Token(令牌)。

这个Token是怎么来的呢?简单说就是用户第一次登录时,输入用户名和密码,你的服务器程序会去数据库核对,如果密码对了,就相当于验明了正身,这时候,服务器会当场生成一个独一无二的、非常长的随机字符串,这个就是Token,这个Token就是接下来一段时间内,代表这个用户身份的“临时身份证”。

这个“临时身份证”Token,连带一些必要信息,就被存进了Redis。 通常会存成一个键值对(Key-Value):

  • Key(键):这个Key的设计有讲究,不能太简单,不然容易重复或被盗用,常见的做法是用一个固定的前缀加上Token本身,session:token值 或者 user_token:token值,这样在Redis里查找起来非常清晰。
  • Value(值):Value里存什么呢?不是存全部用户信息,那样占地方,主要存最核心、校验时最需要的信息,一般包括:
    1. 用户ID:这是最重要的,userId: 12345,有了它,一旦需要更详细的用户信息,可以快速去数据库里查。
    2. 登录状态和有效期:Token不能永久有效,不然丢了就麻烦了,所以一定会设置一个过期时间,比如7200秒(2小时),这个过期时间可以直接利用Redis的过期特性来设置,Value里可能还会存一个状态标记,isValid: true

一个完整的缓存数据看起来大概是这样的:

Key: "user_token:abc123def456ghi789"
Value: {"userId": 12345, "username": "张三"}

你给这个Key设置一个7200秒的过期时间。

存好了之后,接下来就是“快速校验”的环节了,这才是体现Redis价值的地方。

当用户进行下一个操作,比如要访问“我的订单”页面时,他的浏览器(或App)会自动在HTTP请求的Header(头信息)里,带上之前发给他的那个Token。

你的服务器收到请求后,验证流程变得异常简单高效:

  1. 截取Token:从请求Header里把Token值拿出来。
  2. 组装Key:用同样的规则,比如加上 user_token: 前缀,组装成完整的Redis Key。
  3. 访问Redis查询:直接用这个组装好的Key去问Redis:“存在不?值是多少?”
  4. 判断结果
    • 如果Redis返回“找不到”:说明这个Token是假的、已经过期了、或者用户已经主动注销了(主动注销就是程序删除了Redis里这个Key),那不好意思,直接返回“请重新登录”。
    • 如果Redis找到了这个Key,并返回了对应的用户ID等信息:恭喜,验明正身!用户是合法的,程序就可以放心地执行“查询订单”的操作了。

你发现这个过程的妙处了吗?整个校验过程,只有一步操作:访问一次Redis。 完全绕过了查询用户表、比对密码等复杂的数据库操作,Redis是基于内存的,速度极快,通常能在1毫秒内完成响应,这对于高并发的网站(比如双十一抢购)是至关重要的性能提升。

还有一些细节可以优化:

  • 续期问题:用户如果一直在操作,快到期了怎么办?可以在每次校验Token有效后,顺手把这个Key的过期时间再延长2小时,这叫“滑动过期”,用户体验更好。
  • 踢人下线:如果想强制某个用户下线(比如修改密码后),直接在Redis里删除那个Token对应的Key就行了,立刻生效。
  • 缓存更多信息:如果有些用户信息访问特别频繁,比如用户名、头像链接,也可以一并缓存在Token的Value里,这样某些场景下连数据库都不用查了,直接就用缓存的数据展示,更快。

用Redis做登录验证,核心就是 “Token缓存”,缓存的是用户登录后生成的临时身份凭证和核心用户ID,校验时,通过一次极快的Redis查询,判断Token是否有效,从而决定是否放行,这种方法速度快、实现相对简单、易于管理,是现代Web应用中最常见的身份验证方案之一。

用Redis做登录验证,缓存啥数据咋快速校验用户身份那些事儿