面试题答案
一键面试授权码缓存策略
- 选择策略:
- 短期缓存:授权码通常具有较短的有效期(如几分钟),适合采用短期缓存策略。可以使用内存缓存,如Redis的短效键值对存储。例如,在Java中可以使用Jedis客户端与Redis交互,设置授权码的缓存时间为其有效期,如:
Jedis jedis = new Jedis("localhost"); jedis.setex(authorizationCode, 300, clientId + ":" + userId); // 假设有效期5分钟
- 高并发场景影响:
- 性能:在高并发场景下,内存缓存能快速响应读请求,极大提升授权码验证的性能。因为内存访问速度快,减少了数据库等慢速存储的I/O操作,从而加快了整个授权流程。
- 一致性:由于授权码有效期短,且通常只在授权过程中使用一次,所以对一致性要求相对不高。即使缓存数据在短时间内出现不一致(如缓存未及时更新而数据库已更新),影响也较小,因为授权码的使用具有一次性和时效性特点。
访问令牌缓存策略
- 选择策略:
- 长期缓存结合定期刷新:访问令牌有效期相对较长(可能几小时到几天),可以采用长期缓存。同样可以利用Redis等缓存工具,但为了保证数据一致性,需要定期刷新缓存。例如,设置访问令牌的缓存时间为接近其有效期,然后在缓存过期前主动从数据库重新加载数据更新缓存。在Python中使用Redis - Py库可以这样实现:
import redis r = redis.Redis(host='localhost', port = 6379, db = 0) accessToken = "..." tokenInfo = getAccessTokenInfoFromDB(accessToken) # 从数据库获取令牌信息的函数 r.setex(accessToken, 3600 * 23, str(tokenInfo)) # 假设有效期24小时,缓存23小时
- 读写分离缓存:对于读多写少的情况,可以采用读写分离的缓存架构。主缓存用于写操作,从缓存用于读操作,通过异步复制机制保持主从缓存数据的一致性。
- 高并发场景影响:
- 性能:长期缓存减少了频繁从数据库读取访问令牌信息的开销,在高并发读场景下能显著提升性能。例如,大量API请求需要验证访问令牌时,从缓存中快速获取令牌信息能大幅提高响应速度。
- 一致性:定期刷新缓存能在一定程度上保证数据的一致性,但在刷新间隔期间可能存在缓存与数据库不一致的情况。读写分离缓存架构下,由于主从复制存在一定延迟,在高并发写操作后,读操作可能读取到旧数据,需要通过合理设置复制策略和缓存过期时间来平衡一致性和性能。