gpt4 book ai didi

ruby - 在 Redis 中为 Ruby 重新创建 zdiffstore

转载 作者:可可西里 更新时间:2023-11-01 11:43:12 25 4
gpt4 key购买 nike

我正在尝试为排序集创建类似于 Redis sdiffstore 的事务。我有一个 Redis“主”(temp:'..u_id) 排序集和第二个“删除”集。在删除“删除”集中的任何匹配成员后,我想返回带有分数的“主要”排序集。

我的结构有大约 200 个“主”键,每个键有大约 200 个得分成员。 “删除”集的每个主键都有约 50 个成员。对于每个请求,我都需要遍历所有约 200 个用户,这被证明是一个代价高昂的过程。下面是我现有的服务器端脚本的一部分:

#Generate list of user ids 
local usercard = redis.call('smembers', 'temp:user')

--#Loop through all available users
--#Get array of users
for i=1,table.getn(usercard)-1,1 do
local u_id = usercard[i]

--#Create a copy of the user and store into temp:user_id
redis.call('zunionstore', 'temp:..u_id,1,'user:'..u_id)

--#remove unwanted
redis.call('zrem','temp:'..u_id, unpack(redis.call('smembers','remove:'..u_id)))
end

zunionstore 和 zrem 组合是一个非常昂贵的命令,循环被证明是阻止扩展能力的限制因素。我知道我没有充分利用 Redis 线程,因为我无法在一切陷入困境之前扩展到超过 ~50 个并发连接。

因为我对 Redis 比较陌生:

1) Redis 是挑战的最佳数据库选择吗?

2)是否有更高效的 key 结构?

3) 是否有更有效的方法来构建服务器端脚本,或者我最好做一对调用(“主”排序集的 zrange 和“删除”集的 smembers)来进行处理给定 big(O) 的 Ruby 会保持相当大吗?

最佳答案

我不确定我是否完全理解您的问题。你真的需要写数据还是只是为了在应用程序端获取过滤列表?您是始终需要为所有 200 名用户提供服务,还是只需要为一个用户提供服务?

此外,您不应该在循环中减去一个,您可能会错过最后一个用户。

如果你需要所有的用户并且不需要将结果保存在Redis中,你可以考虑这样的事情(未经测试):

local r = {}
local t, l, s, w
for _,u_id in ipairs(redis.call('smembers', 'temp:user')) do
t = redis.call('zrange', 'user:' .. u_id, 0, -1, "withscores")
l = redis.call('smembers', 'remove:' .. u_id)
s = {}
for _,x in ipairs(l) do s[x] = true end
w = {}
for i=1,#t,2 do
if not s[t[i]] then w[t[i]] = w[t[i+1]] end
end
r[u_id] = w
end

return r

关于ruby - 在 Redis 中为 Ruby 重新创建 zdiffstore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20020229/

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