我是使用 Redis DB 的新手。在阅读了一些文档并查看了 Internet 上的一些示例并扫描了 stackoverflow.com 之后,我可以看到 Redis 非常快,可扩展性很好,但这要付出代价,我们必须考虑我们的数据将如何在设计时访问以及他们必须进行哪些操作。我可以理解这一点,但我对使用普通的旧 SQL 在数据中搜索如此简单但缓慢的内容感到有些困惑。我可以使用 KEY 命令以一种方式执行此操作,但它是 O(N) 操作而不是 O(log(N))。所以我会失去Redis的优势之一。
更有经验的同事在这里说什么?
让我们举个例子:我们需要存储个人数据大约。100.000 人,这些数据需要按姓名、电话号码进行搜索。
为此,我将使用以下结构:
1. SET for storing all persons' ids {id1, id2, ...}
2. HASH for each person to store personal data and name it
like map:<id> e.g. map:id1{name:<name>, phone:<number>, etc...}
解决方案1:
1. HASH for storing all persons' ids but the key should be the phone number
2. Then with the command KEY 123* all ids could be retrieved who have a phone number
sarting with 123. On basis of the ids also the other personal data could be retrieved.
3. So forth for each data to be searched for a separate HASH should be created.
但是这个解决方案的一个主要缺点是属性值也必须是唯一的,这样电话号码和 HASH 中的 id 的分配就不会产生歧义。另一方面,O(N)运行时间并不理想。
此外,这会使用比必要更多的空间,并且KEY 命令会降低访问性能。( http://redis.io/commands/keys )
应该如何以正确的方式完成?我也可以想象 ids 会进入 ZSET 并且需要搜索的数据可能是分数,但这使得只能使用范围而不是 seraches。
也提前谢谢你,问候, Tamas
答案摘要: 实际上,两个响应都表明 Redis 并非旨在搜索键的值。如果此用例是必要的,则需要按照我的原始解决方案或以下解决方案中所示实施变通方法。
Eli的以下解决方案比我原来的解决方案具有更好的性能,因为对密钥的访问可以被认为是恒定的,只需要迭代 id 列表,因为访问这将提供O(const)运行时间。该数据模型还允许一个人可能与其他人拥有相同的电话号码,等等也可以用于姓名等......所以1-n关系也是可能的(我会说旧的ERD术语)。
该解决方案的缺点是,它比我的占用更多空间,并且无法搜索仅知道起始数字的电话号码。
感谢您的回复。