专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  Spring Boot 中使用 JSON ... ·  昨天  
芋道源码  ·  高性能、无侵入的 Java 性能监控神器 ·  昨天  
Java编程精选  ·  公司Rust团队全员被裁,只因把服务写得「太 ... ·  2 天前  
芋道源码  ·  别乱分层,PO、VO、DAO、BO、DTO、 ... ·  2 天前  
芋道源码  ·  if 判断泛滥?试一试规则执行器,太香了! ·  2 天前  
51好读  ›  专栏  ›  芋道源码

美团二面:如何在10亿级别用户中检查用户名是否存在?

芋道源码  · 公众号  · Java  · 2025-05-13 09:30

正文

请到「今天看啥」查看全文


  • 布隆过滤器方案
  • 总结

  • 不知道大家有没有留意过,在使用一些app注册的时候,提示你用户名已经被占用了,需要更换一个,这是如何实现的呢?你可能想这不是很简单吗,去数据库里查一下有没有不就行了吗,那么假如用户数量很多,达到数亿级别呢,这又该如何是好?

    数据库方案

    第一种方案就是查数据库的方案,大家都能够想到,代码如下:

    public class UsernameUniquenessChecker {
        private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database";
        private static final String DB_USER = "your_username";
        private static final String DB_PASSWORD = "your_password";

        public static boolean isUsernameUnique(String username) {
            try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
                String sql = "SELECT COUNT(*) FROM users WHERE username = ?";
                try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                    stmt.setString(1, username);
                    try (ResultSet rs = stmt.executeQuery()) {
                        if (rs.next()) {
                            int count = rs.getInt(1);
                            return count == 0// If count is 0, username is unique
                        }
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false// In case of an error, consider the username as non-unique
        }

        public static void main(String[] args) {
            String desiredUsername = "new_user";
            boolean isUnique = isUsernameUnique(desiredUsername);
            if (isUnique) {
                System.out.println("Username '" + desiredUsername + "' is unique. Proceed with registration.");
            } else {
                System.out.println("Username '" + desiredUsername + "' is already in use. Choose a different one.");
            }
        }
    }

    这种方法会带来如下问题:

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

    基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能







    请到「今天看啥」查看全文