续上一条
Redis刷新token保证用户无感:
1. 使用access_token和refresh_token
2. 在access_token即将过期前自动刷新
3. 用户活跃时延长token有效期
4. 客户端在后台异步刷新token
5. token过期后短时间内仍可使用,同时刷新
点赞排行实现及数据持久化:
1. 使用ZSET存储,score为点赞数
2. 定期将热门数据持久化到MySQL
3. 热数据保存在Redis,冷数据存入MySQL
4. 设置定时任务每天/周从MySQL加载基础数据到Redis
5. 只更新有变化的数据,而非全量刷新
乐观锁实现:
1. 表中增加version字段,更新时检查版本
2. 条件更新 UPDATE table SET data=?, version=version+1 WHERE id=? AND version=?
SQL优化问题
多表连接优化:
1. 减少连接表数量
2. 索引优化
3. 小表驱动大表
4. 尽量使用内连接而非外连接
5. 将过滤条件尽量下推到基表
6. 避免笛卡尔积
多表连接分页查询优化:
1. 先获取分页ID,再关联查询详细数据
2. 先对主表分页,再与其他表连接
3. 尽量使用索引覆盖避免回表
4. 将WHERE条件提前执行
5. 使用临时表存储中间结果
多表连接索引创建及联合索引作用:
1. 在所有JOIN条件字段上创建索引
2. WHERE条件字段创建索引
3. ORDER BY字段创建索引
4. 联合索引作用最左前缀匹配 索引覆盖 减少回表次数 提高连接效率
SQL执行顺序: FROM > JOIN > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
MySQL提高扫描效率的方法:
1. B+树索引减少磁盘IO次数
2. 根据成本选择最优执行计划
3. InnoDB buffer pool缓存热数据
4. 提前读取可能需要的数据页