当前位置:首页 > 实用技巧 >

用户名已被占用意味着什么(用户名被占用解决办法)

来源:原点资讯(www.yd166.com)时间:2023-12-24 01:54:54作者:YD166手机阅读>>

前言

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

数据库方案

用户名已被占用意味着什么,用户名被占用解决办法(1)

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

java

复制代码

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。
  1. 可扩展性差。数据库对并发连接和资源有限制。如果注册率继续增长,数据库服务器可能难以处理数量增加的传入请求。垂直扩展数据库(向单个服务器添加更多资源)可能成本高昂并且可能有限制。
缓存方案

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

用户名已被占用意味着什么,用户名被占用解决办法(2)

java

复制代码

public class UsernameCache { private static final String REDIS_HOST = "localhost"; private static final int REDIS_PORT = 6379; private static final int CACHE_EXPIRATION_SECONDS = 3600; private static JedisPool jedisPool; // Initialize the Redis connection pool static { JedisPoolConfig poolConfig = new JedisPoolConfig(); jedisPool = new JedisPool(poolConfig, REDIS_HOST, REDIS_PORT); } // Method to check if a username is unique using the Redis cache public static boolean isUsernameUnique(String username) { try (Jedis jedis = jedisPool.getResource()) { // Check if the username Exists in the Redis cache if (jedis.sismember("usernames", username)) { return false; // Username is not unique } } catch (Exception e) { e.printStackTrace(); // Handle exceptions or fallback to database query if Redis is unavailable } return true; // Username is unique (not found in cache) } // Method to add a username to the Redis cache public static void addToCache(String username) { try (Jedis jedis = jedisPool.getResource()) { jedis.sadd("usernames", username); // Add the username to the cache set jedis.expire("usernames", CACHE_EXPIRATION_SECONDS); // Set expiration time for the cache } catch (Exception e) { e.printStackTrace(); // Handle exceptions if Redis cache update fails } } // Cleanup and close the Redis connection pool public static void close() { jedisPool.close(); } }

这个方案最大的问题就是内存占用过大,假如每个用户名需要大约 20 字节的内存。你想要存储10亿个用户名的话,就需要20G的内存。

总内存 = 每条记录的内存使用量 * 记录数 = 20 字节/记录 * 1,000,000,000 条记录 = 20,000,000,000 字节 = 20,000,000 KB = 20,000 MB = 20 GB

布隆过滤器方案

直接缓存判断内存占用过大,有没有什么更好的办法呢?布隆过滤器就是很好的一个选择。

那究竟什么布隆过滤器呢?

布隆过滤器(Bloom Filter)是一种数据结构,用于快速检查一个元素是否存在于一个大型数据集中,通常用于在某些情况下快速过滤掉不可能存在的元素,以减少后续更昂贵的查询操作。布隆过滤器的主要优点是它可以提供快速的查找和插入操作,并且在内存占用方面非常高效。

具体的实现原理和数据结构如下图所示:

用户名已被占用意味着什么,用户名被占用解决办法(3)

布隆过滤器的核心思想是使用一个位数组(Bit array)和一组哈希函数。

  • 位数组(Bit Array) :布隆过滤器使用一个包含大量位的数组,通常初始化为全0。每个位可以存储两个值,通常是0或1。这些位被用来表示元素的存在或可能的存在。
  • 哈希函数(Hash Functions) :布隆过滤器使用多个哈希函数,每个哈希函数可以将输入元素映射到位数组的一个或多个位置。这些哈希函数必须是独立且具有均匀分布特性。

那么具体是怎么做的呢?

  • 添加元素:如上图所示,当将字符串“xuyang”,“alvin”插入布隆过滤器时,通过多个哈希函数将元素映射到位数组的多个位置,然后将这些位置的位设置为1。
  • 查询元素:当要检查一个元素是否存在于布隆过滤器中时,通过相同的哈希函数将元素映射到位数组的相应位置,然后检查这些位置的位是否都为1。如果有任何一个位为0,那么可以确定元素不存在于数据集中。但如果所有位都是1,元素可能存在于数据集中,但也可能是误判。

本身redis支持布隆过滤器的数据结构,我们用代码简单实现了解一下:

java

复制代码

import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class BloomFilterExample { public static void main(String[] args) { JedisPoolConfig poolConfig = new JedisPoolConfig(); JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379); try (Jedis jedis = jedisPool.getResource()) { // 创建一个名为 "usernameFilter" 的布隆过滤器,需要指定预计的元素数量和期望的误差率 jedis.bfCreate("usernameFilter", 10000000, 0.01); // 将用户名添加到布隆过滤器 jedis.bfAdd("usernameFilter", "alvin"); // 检查用户名是否已经存在 boolean exists = jedis.bfExists("usernameFilter", "alvin"); System.out.println("Username exists: " exists); } } }

在上述示例中,我们首先创建一个名为 "usernameFilter" 的布隆过滤器,然后使用 bfAdd 将用户名添加到布隆过滤器中。最后,使用 bfExists 检查用户名是否已经存在。

优点:

  • 节约内存空间,相比使用哈希表等数据结构,布隆过滤器通常需要更少的内存空间,因为它不存储实际元素,而只存储元素的哈希值。如果以 0.001 误差概率存储 10 亿条记录,只需要 1.67 GB 内存,对比原来的20G,大大的减少了。
  • 高效的查找, 布隆过滤器可以在常数时间内(O(1))快速查找一个元素是否存在于集合中,无需遍历整个集合。

缺点:

  • 误判率存在:布隆过滤器在判断元素是否存在时,有一定的误判率。这意味着在某些情况下,它可能会错误地报告元素存在,但不会错误地报告元素不存在。
  • 不能删除元素:布隆过滤器通常不支持从集合中删除元素,因为删除一个元素会影响其他元素的哈希值,增加了误判率。
总结

Redis 布隆过滤器的方案为大数据量下唯一性验证提供了一种基于内存的高效解决方案,它需要在内存消耗和错误率之间取得一个平衡点。当然布隆过滤器还有更多应用场景,比如防止缓存穿透、防止恶意访问等。

栏目热文

怎么用户名总是被占用(用户名被占用解决办法)

怎么用户名总是被占用(用户名被占用解决办法)

大家好,欢迎来到孟婆小叔开讲的《吃鸡小课堂》。随着时装和载具外观的出现,这个游戏诞生了许多的“商人”,他们利用玩家的心思...

2023-12-24 01:44:00查看全文 >>

该用户名已经被占用怎么办(注册用户名已被占用怎么办)

该用户名已经被占用怎么办(注册用户名已被占用怎么办)

在头条,每个人有且只有一个用户名,且一月只能修改一次。而我的用户名“80后朝阳群众的生活”在5月份经历了一出跌宕起伏的封...

2023-12-24 02:03:42查看全文 >>

注册用户名被占用怎么办(怎么用户名老是被占用啊)

注册用户名被占用怎么办(怎么用户名老是被占用啊)

在头条做自媒体,需要注意哪些事情?如何能让我的创作的内容有更多推荐给更多人看到?如何在账号运营初期就能够迅速涨粉?其实想...

2023-12-24 01:22:54查看全文 >>

用户名被别人占用了怎么办(默认用户名也被别人占用了)

用户名被别人占用了怎么办(默认用户名也被别人占用了)

头条号是今日头条旗下的自媒体平台,对比以前,现在玩头条号的人少了很多,据我这几天观察,很多老号都已经断更。不少新手还打算...

2023-12-24 01:24:11查看全文 >>

班级优化大师家长进去老师知道吗(班级优化大师家长怎么可以看到)

班级优化大师家长进去老师知道吗(班级优化大师家长怎么可以看到)

21世纪经济报道 王琦 广州报道近日,据新华社报道,在全国中小学广泛使用的教育类APP“班级优化大师”,记录了学生在校的...

2023-12-24 02:01:08查看全文 >>

用户名被占用代表什么(用户名居然被占用)

用户名被占用代表什么(用户名居然被占用)

生活中,总会遇到些大大小小的烦心事,让我们感到焦虑。比如在使用洋钱罐APP时,有一部分用户在注册时可能会遇到“手机号被占...

2023-12-24 01:35:24查看全文 >>

修真聊天群的叶思结局(叶思修真聊天群后来怎么样了)

修真聊天群的叶思结局(叶思修真聊天群后来怎么样了)

《修真聊天群》可以说是近来最火爆的网络小说之一了,书友们表示这是唯一一部上千章才升六品境界,却让人丝毫不感觉进度缓慢的作...

2023-12-24 02:05:32查看全文 >>

修真聊天群男主的老婆叶思(修真聊天群叶思不见了)

修真聊天群男主的老婆叶思(修真聊天群叶思不见了)

很多网友都喜欢看网络小说,但是网文看多了,经常会觉得不够看,感叹书荒又来了。今天龙师叔又来给大家发粮草了,今天和大家分享...

2023-12-24 01:30:24查看全文 >>

修真聊天群宋木头(修真聊天群里宋木头到底是谁)

修真聊天群宋木头(修真聊天群里宋木头到底是谁)

hello,大家好,我是十五年老书虫,小编,今天今天又是照常给大家推荐一本好看的小说,今天小编给大家推荐的是一本轻松搞笑...

2023-12-24 02:07:22查看全文 >>

文档排行