作者:Aditi Mishra
翻译:wwl
校对:zrx
本文约3000字,建议阅读7分钟 在这篇文章中,我们将探讨三种方法:传统的数据库查询、使用Redis的缓存策略以及使用布隆过滤器的优化方法。
package main
import (
"fmt"
"github.com/go-redis/redis/v8"
"context"
)
const (
USERNAME_HASH_MAP = "username_records"https:// Redis hash map name to store user information
)
funcmain() {
ctx := context.Background()
// Create a Redis client
client := initializeRedisClient()
// Add a username to the hash map
err := client.HSet(ctx, USERNAME_HASH_MAP, "john_doe", "userInfo").Err() // "userInfo" could be a JSON string, UUID, etc.
if err != nil {
fmt.Println("Error adding username:", err)
return
}
// Check if a username exists
isPresent, err := client.HExists(ctx, USERNAME_HASH_MAP, "john_doe").Result()
if err != nil {
fmt.Println("Error checking username existence:", err)
return
}
fmt.Printf("Username 'john_doe' exists? %v\n", isPresent)
// Check for a non-existent username
isPresent, err = client.HExists(ctx, USERNAME_HASH_MAP, "jane_doe").Result()
if err != nil {
fmt.Println("Error checking username existence:", err)
return
}
fmt.Printf("Username 'jane_doe' exists? %v\n", isPresent)
// Close the Redis client connection
err = client.Close()
if err != nil {
fmt.Println("Error closing Redis client:", err)
}
}
// Helper function to create a Redis client
funcinitializeRedisClient() *redis.Client {
return redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379", // Adjust to your Redis address
Password: "yourpassword", // Provide your Redis password if any
DB: 0, // use default DB
})
}
-
布隆过滤器使用了bit 数组和几个hash函数 -
当你添加一个元素(比如用户名)时,过滤器会使用哈希函数将数组中的某些位翻转成1 -
要检查一个元素是否存在,它会将元素通过同样的哈希函数处理。如果所有对应的位都是1,那么元素可能在该集合中。如果任何一位是0,那么元素肯定不在该集合中。
-
效率:节省内存,能快速检查元素是否在集合中。 -
实用:可以减少不必要的数据库查询,防止网络服务器重复检查。
package main
import (
"fmt"
// https://pkg.go.dev/github.com/bits-and-blooms/bloom/v3#section-readme
"github.com/bits-and-blooms/bloom/v3"
)
funcmain() {
// Initialize a Bloom Filter
filter := bloom.New(20*1000*1000, 5) // Capacity: 20 million, 5 hash functions
// Add a username to the Bloom Filter
filter.AddString("john_doe")
// Check if a username exists
exists := filter.TestString("john_doe")
fmt.Printf("Username 'john_doe' exists? %v\n", exists)
// Check for a non-existent username
exists = filter.TestString("jane_doe")
fmt.Printf("Username 'jane_doe' exists? %v\n", exists)
}
Username'john_doe' exists? true
Username 'jane_doe' exists? False
-
序列“ACCGTAG”,检查这个序列是否在我们的集合中存在 -
k-mers:序列被切分成更小的部分,称为“k-mers”,类似分块或者分片。例如“ACCG”,“CCGT”,“CGTA“,“GTAG” -
Hash k-mers,每个k-mers通过一些hash函数,这些hash 函数,接收k-mers,映射到bit array中的特定位置 -
Setting bits:对于每个k-mer,bit数组中的对应bit被设置为1。Bit 数组初始每个元素都是0,当我们添加了k-mers,对应的bit设置为1.
-
查询“CGTAT”:现在,在集合中检查是否存在序列“CGTAT” -
K-mers:像前边一样,序列被切分为k-mers,如“CGTA”,“GTAT“ -
检索bits:这些k-mers经过hash function,我们检查bit array中的对应bit -
如果对应的bit都是1,就像“CGTA“,则证明这个序列可能在集合中 -
如果有一个bit是0,如“GTAT“,则说明,这个序列一定不在集合中
-
布隆过滤器的优点:这种方法在内存使用上高效,并且快速检查某物是否可能存在于一个集合中。 -
假阳性(False Positives):有时,它可能错误地指示一个元素存在于集合中,而实际上并不存在(这就是“假阳性”)。 -
确定阴性(Definite Negatives):如果检查表明一个元素不在集合中,那么这绝对是正确的。
原文标题:
How to Efficiently Check If a Username Exists Among Billions of Users
原文链接:
https://medium.com/@aditimishra_541/how-to-efficiently-check-if-a-username-exists-among-billions-of-users-7ed1e5c60489
翻译组招募信息
工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。
你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。
其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。
点击文末“阅读原文”加入数据派团队~
转载须知
如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。
发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。
关于我们
数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。
新浪微博:@数据派THU
微信视频号:数据派THU
今日头条:数据派THU
点击“阅读原文”拥抱组织
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/77598.html