Pau*_*aul 12 hash filter facet redis
我正在使用redis存储哈希,每个哈希有大约100k条记录.我想在给定的哈希中实现过滤(分面)记录.请注意,哈希条目可以属于n个过滤器.
首先,上述方法在高水平上是否正确?
假设方法没问题,我缺少的是检索HASH条目最有效的实现方法是什么?我是否正确地思考一旦我有HASH键,我应该使用PIPELINE来排队通过每个HASH键的多个HGETALL命令?有更好的方法吗?
我对使用PIPELINE的担心是我相信它会在服务命令时阻止所有其他客户端.我将分页过滤结果,每页500个结果.有多个基于浏览器的客户端执行过滤,更不用说填充SET和HASH的后端进程,如果PIPELINE阻塞,则听起来有很多争用的可能性.任何人都可以提供这方面的观点吗?
如果它有助于我使用2.2.4 redis,则为后端的Web客户端和服务堆栈提供预测.
谢谢,保罗
个别操作会阻止,但无关紧要,因为它们不应该长时间运行.听起来你正在检索比你真正需要的更多信息 - 当你只需要500时,HGETALL将返回100,000件物品.
发送500个HGET操作可能会起作用(假设集合存储散列和密钥),尽管使用散列可能是过早优化的情况 - 您可能最好使用常规密钥和MGET.
Redis 是无锁非阻塞异步服务器,因此在使用流水线时不会增加争用。Redis 一收到每个操作就会愉快地处理它们,因此在实践中可以处理多个流水线操作。本质上,redis-server 并不关心操作是否是流水线操作,它只是在接收到每个操作时处理它们。
流水线的好处是减少客户端延迟,而不是在发送下一个操作之前等待来自 redis-server 的每个操作的响应,客户端可以在一次写入中一次泵送所有操作,然后在一个单读。
一个例子是在我的Redis mini StackOverflow 克隆中,每次点击都会调用一次ToQuestionResults(),因为操作是管道化的,在 1 个 Socket 写入调用上发送所有操作,并在 1 个 Socket 阻塞读取中读取结果,这比阻塞更有效每次调用读取:
我对使用 PIPELINE 的担忧是我相信它会在为命令提供服务时阻止所有其他客户端。
这不是一个有效的问题,我不会过度考虑 Redis 在这里的工作方式,假设它在流水线不阻止其他客户端命令的处理的情况下最有效地执行此操作。从概念上讲,您可以认为 redis-server 以 FIFO 顺序处理每个命令(流水线或非流水线)(即不会浪费时间等待/读取整个流水线)。
您正在描述更接近 MULTI/EXEC(即 Redis 事务)的东西,其中一旦 Redis 服务器读取 EXEC(即 EOF 事务),所有操作都会立即完成。这也不是问题,redis-server 仍然不会浪费任何时间等待接收您的整个事务,它只是将部分命令集排在临时队列中,直到它收到最终的 EXEC,然后立即处理。
这就是 redis 如何通过在收到命令后立即处理每个命令来实现原子性的方式。由于没有其他线程,因此没有线程上下文切换、没有锁和多线程问题。它基本上通过快速处理每个命令来实现并发。
所以在这种情况下,我会使用流水线,因为它总是一个胜利,所以你流水线的命令越多(因为你减少了阻塞读取计数)。
| 归档时间: |
|
| 查看次数: |
8665 次 |
| 最近记录: |