Redis:扇出列表或排序集中的新闻提要吗?

Redis:扇出列表或排序集中的新闻提要吗?,第1张

Redis:扇出列表或排序集中的新闻提要吗?

是的,排序集非常快速且强大。与

SORT
*** 作相比,它们似乎更符合您的要求。时间的复杂性常常被误解。O(log(N))非常快,并且可以缩放。我们将其用于一组排序的数千万成员。检索和插入时间不到一毫秒。

使用

ZRANGEBYSCORE key min max WITHSCORES [LIMIT offsetcount]
让您的结果。

根据将时间戳存储为“分数”的方式,ZREVRANGEBYSCORE可能更好。

关于时间戳的简短说明:

SCORES
不需要小数部分的排序集应使用15位或更少的数字。因此,
SCORE
必须将其保持在-999999999999999到999999999999999的范围内。注:存在这些限制是因为Redis服务器实际上将分数(浮点数)存储为内部的Redis字符串表示形式。

因此,我建议将此格式转换为Zulu
Time
:-20140313122802以获取第二精度。您可以为100ms精度添加1位数字,但是
如果
您不希望损失精度,则可以再增加一位。顺便说一句,它仍然是float64,因此在某些情况下精度损失可能会很好,但是您的情况适合在“完美精度”范围内,因此,我建议这样做。

如果您的数据在10年内过期,您也可以跳过前三个数字(CCYY为CCYY),以达到.0001秒的精度。

我在这里建议负分,这样你就可以使用更简单的

ZRANGEBYSCORE
,而不是
REV
一个。您可以将其
-inf

用作开始得分(减去无穷大)并
LIMIT 0 100
获得前100名的结果。

两个排序集

members
_(或者
'keys'
因为排序集本身也是一个键而很模棱两可)_可能共享a
score
,这没问题,相同的结果
score
按字母顺序排列。

希望这会有所帮助,TW

聊天后编辑

OP想要

ZSET
从不同的键(
GET
/
SET
HGET
/
HSET
键)收集数据(使用)。
JOIN
可以为您做到,
ZRANGEBYSCORE
不能。首选的方法是简单的Lua脚本。Lua脚本在服务器上执行。在下面的例子中我使用
eval
了简单,在生产阶段你会使用
scriptEXISTS
script LOAD
evalSHA
。大多数客户端库都内置了一些簿记逻辑,因此您不必每次都上载脚本。

这是一个

example.lua

local r={}local zkey=KEYS[1]local a=redis.call('zrangebyscore', zkey, KEYS[2], KEYS[3], 'withscores', 'limit', 0, KEYS[4])for i=1,#a,2 do  r[i]=a[i+1]  r[i+1]=redis.call('get', a[i])endreturn r

您可以这样使用它 (原始示例,未针对性能进行编码)

redis-cli -p 14322 set activity:1 act1JSONredis-cli -p 14322 set activity:2 act2JSONredis-cli -p 14322 zadd feed 1 activity:1redis-cli -p 14322 zadd feed 2 activity:2redis-cli -p 14322 eval '$(cat example.lua)' 4 feed '-inf' '+inf' 100

结果:

1) "1"2) "act1JSON"3) "2"4) "act2JSON"


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5010157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存