创建一个Gravatar头像服务思路

创建思路:头像获取与赋予服务完整方案

1. 数据库设计

表结构

以下是优化后的数据库表设计,用于存储用户邮箱与头像路径及类型的关系。
字段名数据类型描述约束
INT主键自增,主键
VARCHAR(255)用户邮箱唯一,非空
VARCHAR(255)头像存储路径非空
INT当前使用的头像类型编号非空,默认1
INT下次应使用的头像类型编号非空,默认2
TIMESTAMP创建时间默认当前时间戳
TIMESTAMP更新时间默认当前时间戳,自动更新

 

 索引优化

  • 唯一索引:为 email 字段添加唯一索引,确保邮箱的唯一性并加快查询速度。
  • 普通索引:为 avatar_typenext_type 字段添加普通索引,便于快速更新和查询。

2. 逻辑流程

步骤 1:接收请求

用户通过API接口请求头像,例如:https://vatar.com/123@163.com。系统从URL中解析出邮箱地址。

步骤 2:检查数据库记录

查询数据库,检查是否已为该邮箱生成过头像。

SQL 查询

SELECT avatar_path, avatar_type, next_type FROM user_avatars WHERE email = '123@163.com';

步骤 3:处理查询结果

  • 如果已生成头像
    • 直接返回数据库中记录的头像路径。
    • 更新 avatar_typenext_type,为下一次请求做准备。

 SQL 更新

UPDATE user_avatars SET avatar_type = next_type, next_type = next_type + 1 WHERE email = '123@163.com';

如果 next_type 超过最大类型编号(例如18),则循环回到第1种类型:

UPDATE user_avatars SET avatar_type = next_type, next_type = 1 WHERE email = '123@163.com' AND next_type > 18;

步骤 4:检查Gravatar

使用邮箱地址查询Gravatar,判断是否有对应的头像。

  • Gravatar URLhttps://www.gravatar.com/avatar/<md5(email)>?d=404
  • 如果Gravatar返回有效头像,直接返回Gravatar的URL。
步骤 5:调用第三方头像生成工具

如果Gravatar中没有对应的头像,

则通过邮箱获取对于的qq邮箱

若没有则调用第三方头像生成工具生成头像。

  • 根据数据库记录,选择合适的头像类型生成头像。
  • 如果是首次生成,使用第1种类型。
  • 将生成的头像存储到服务器,并将头像路径和相关信息记录到数据库中。

INSERT INTO user_avatars (email, avatar_path, avatar_type, next_type) VALUES ('123@163.com', 'path/to/avatar', 1, 2);

步骤 6:返回头像URL

返回头像的完整URL,供前端使用。


优化建议

1. 缓存机制

为了进一步提高响应速度,可以引入缓存机制:

  • 内存缓存:使用 Redis 或 Memcached 缓存频繁访问的头像路径。
  • 页面缓存:对一些静态页面(如用户头像展示页面)进行整体缓存。

2. 数据库索引优化

  • email 字段添加唯一索引,加快查询速度。
  • avatar_typenext_type 字段添加普通索引,便于快速更新。

3. 异步处理

  • 如果头像生成过程较慢,可以考虑使用异步任务队列(如 RabbitMQ 或 Celery)来处理头像生成和存储操作,避免阻塞主线程。

以下为参考资料。

通过QQ邮箱显示获取头像,不暴露QQ号

https://blog.zwying.com/archives/71.html

Valine – 为qq邮箱添加qq头像

https://blog.2broear.com/notes/09-04-2020_valine-avatar-addon

Jeffer.Z.Gustav

This is my note-taking platform. Welcome to visit. I will put some recorded notes here in daily life. You can see some fragments of my thinking and notes.