面试官问:如何在十亿级别用户中检查用户名是否存在

前言

不知道大家有没有注意到,大部分的APP在注册的时候,会提示用户名、邮件或手机号已经被占用,需要更换一个。

在这里插入图片描述

现在我们来逐一看一下各个实现方案的优缺点。

数据库方案

在这里插入图片描述

这种方法带来以下的问题:

  1. 存在延迟比较大的性能问题。如果数据量很大,查询速度会变慢,而且数据库查询涉及应用服务器与数据库服务器之间的网络通信,建立连接、发送查询、接收响应所需的时间会导致延迟。
  2. 数据库负载过大。频繁执行 SELECT 查询来检查用户名的唯一性,每个查询都会消耗数据库资源,包括 CPU 和系统 I/O 资源。
  3. 可扩展性差。数据库对并发连接和资源有限制。如果注册率持续上升,数据库服务器可能难以处理不断增加的传入请求。数据库的垂直扩展(向单个服务器添加更多资源)可能成本高昂,并且可能存在局限性。

缓存解决方案

为了解决检查用户名唯一性的数据库调用的性能问题,我们引入了高效的 Redis 缓存。

在这里插入图片描述

使用的代码如下:


import org.redisson.Redisson;  
import org.redisson.api.RedissonClient;  
import org.redisson.config.Config;  
import org.redisson.api.RMap;  

public class UserExistenceChecker {
   
     

    // Redis hash map name to store user information  
    private static final String USER_HASH_NAME = "users";  

    public static void main(String[] args) {
   
     
        // Create a Redisson client  
        RedissonClient redisson = createRedissonClient();  

        // Retrieve the hash map to store user information  
        RMap users = redisson