gpt4 book ai didi

redis性能——最多删除100条记录?

转载 作者:IT王子 更新时间:2023-10-29 06:01:18 25 4
gpt4 key购买 nike

我是Redis新手,看了 这本书,2.1节(“登录和cookie缓存”)有一个 clean_sessions函数:

QUIT = False
LIMIT = 10000000

def clean_session:
while not QUIT:
size = conn.zcard('recent:')
if size <= LIMIT:
time.sleep(1)
continue

# find out the range in `recent:` ZSET
end_index = min(size-LIMIT, 100)
tokens = conn.zrange('recent:', 0, end_index-1)

# delete corresponding data
session_keys = []
for token in tokens:
session_keys.append('viewed:' + token)

conn.delete(*session_keys)
conn.hdel('login:', *tokens)
conn.zrem('recent:', *tokens)

如果超过1000万条记录,它会删除登录 token 和相应的数据,问题是:

  • 为什么每次最多删除100条记录?

  • 为什么不一次性删除 size - LIMIT 条记录?

  • 是否有一些性能方面的考虑?

谢谢,感谢所有回复:)

最佳答案

我想这个选择有多种原因。

Redis 是一个单线程事件循环。这意味着一个大命令(例如一个大的 zrange,或一个大的 del、hdel 或 zrem)将比几个小命令处理得更快,但会影响其他 session 的延迟。如果一个大命令需要一秒来执行,那么所有访问 Redis 的客户端也会被阻塞一秒。

因此,第一个原因是尽量减少这些清理操作对其他客户端进程的影响。通过将事件分割成几个小命令,其他客户端也有机会执行他们的命令。

第二个原因是 Redis 服务器中通信缓冲区的大小。大命令(或大回复)可能会占用大量内存。如果要清除数百万项,lrange 命令的回复或 del、hdel、zrem 命令的输入可能代表数兆字节的数据。超过一定限度,Redis 将关闭连接以保护自身。因此最好避免处理非常大的命令或非常大的回复。

第三个原因是 Python 客户端的内存。如果必须清除数百万个项目,Python 将不得不维护非常大的列表对象( token 和 session key )。它们可能适合也可能不适合内存。

建议的解决方案是渐进的:无论要删除多少项,它都会避免在客户端和 Redis 端消耗大量内存。它还将避免达到通信缓冲区限制(导致连接关闭),并将限制对访问 Redis 的其他进程的性能影响。

请注意,100 值是任意的。较小的值将以较低的 session 清理吞吐量为代价允许更好的延迟。较大的值将以更高的延迟为代价增加清理算法的吞吐量。

这实际上是清理算法的吞吐量与其他操作的延迟之间的经典权衡。

关于redis性能——最多删除100条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24015330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com