凡有意愿,有一种方法... :)
通过存储在一个有序集合的登录开始。假设用户ID 123已经在时间456与用户名“foo”的登录,您可以表示为:
ZADD logins 456 123:foo
注:您还必须删除旧的元素从有序集合所以它不不会失去控制。
接下来,您要搜索最近10分钟内的用户,因此您需要使用ZRANGEBYSCORE
。而不是将整个东西发回客户端,使用Lua来处理它并检查是否有冲突。
下面的脚本示例包装在一起的所有上述的:
-- Keys: 1) The logins Sorted Set
-- Args: 1) The epoch value of 'now'
-- 2) The logged in user id
-- 3) The logged in user name
-- Get logins from the last 10 minutes
local l = redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1]-600, '+inf')
-- "Evict" old logins
redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', '(' .. ARGV[1]-600)
-- Store the new login
redis.call('ZADD', KEYS[1], ARGV[1], ARGV[2] .. ':' .. ARGV[3])
local c = {} -- detected name collision
for _, v in pairs(l) do
local p = v:find(':') -- no string.split in Lua
local i = v:sub(1,p-1) -- id
local n = v:sub(p+1) -- name
if n == ARGV[3] then
c[#c+1] = i
end
end
return c
酷!这看起来不错,最终会让我写我的第一个适当的Lua脚本。我想我会在本地存储'usernames.lua',然后在python中调用它。我应该使用https://labix.org/lunatic-python,还是只能像典型的py文件那样将lua文件导入为模块? –
这是另一个问题哈桑:)按照这个例子 - https://pypi.python.org/pypi/redis#lua-scripting –
嘿!一如既往,感谢您展示道路。 –