获得Redis分类集中SCORES总和的最佳方法是什么?Redis:分类集中的SCORES总数
回答
我认为唯一的选择是迭代排序后的集合并计算总和客户端。
如果集合很小,并且不需要杀手级的性能,那么我只需迭代(zrange/zrangebyscore)并对客户端的值进行求和即可。
另一方面,如果您谈论的是数千至数百万个项目,您可以随时为每个用户保留一个参考集合,然后在发送礼物时递增/递减总计。
所以,当你做你的ZINCR 123:gifts 1 "3|345"
,你可以做一个单独的ZINCR命令,这可能是这样的:
ZINCR received-gifts 1 <user_id>
然后,得到的礼物#给定用户接收到的,你只需要运行ZSCORE:
ZSCORE received-gifts <user_id>
增量计数赢得了迄今为止的在线问题。扫描只能用于离线算法,恕我直言,因为没有人可以预测未来数据集的增长。这个答案应该是被接受的答案。 呵呵,顺便说一句:有人可能会写一个自定义命令,它可以同时执行这两个操作(增加一个集合并递增计数器;更新一个值并调整计数器,从集合中删除......) – 2015-05-23 19:07:36
可用,因为Redis v2.6是在Redis服务器上执行Lua脚本的最棒的能力。这使得一个有序集合的成绩总结琐碎的挑战:
local sum=0
local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES')
for i=2, #z, 2 do
sum=sum+z[i]
end
return sum
运行例如:
~$ redis-cli zadd z 1 a 2 b 3 c 4 d 5 e
(integer) 5
~$ redis-cli eval "local sum=0 local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES') for i=2, #z, 2 do sum=sum+z[i] end return sum" 1 z
(integer) 15
一个重要的注意事项是Redis服务器-Lua脚本封锁了一切,在大多数情况下这可能是一个破坏者。来源:http://stackoverflow.com/a/30896608/2440 – Sire 2016-12-20 08:32:23
这里是一个小LUA脚本,当您去维持的zset成绩总在一个柜台关键字后缀为'.ss'。您可以使用它来代替ZADD。
local delta = 0
for i=1,#ARGV,2 do
local oldScore = redis.call('zscore', KEYS[1], ARGV[i+1])
if oldScore == false then
oldScore = 0
end
delta = delta - oldScore + ARGV[i]
end
local val = redis.call('zadd', KEYS[1], unpack(ARGV))
redis.call('INCRBY', KEYS[1]..'.ss', delta)
该脚本不应该在lua(`KEYS [1] ..'。ss'`)中构造密钥,该密钥违反了EVAL命令语义,脚本使用的密钥应该使用KEYS数组传递“ - https://redis.io/commands/eval – Jonathan 2018-02-09 04:00:50
- 1. 在Ruby中分页Redis数据集
- 2. redis排序集最高分
- 3. Redis的:按分数
- 4. 在Redis中分离数据
- 5. 双数据类型的子集总和?
- 6. Spring Redis集成中的java.lang.annotation.AnnotationFormatError
- 7. 在Wordpress中计算总分类数量?
- 8. Redis复制和redis分片(群集)区别
- 9. MassTransit Redis集成
- 10. Redis排序集
- 11. 如何分类数据集?
- 12. 帮助计算分层数据集中的复杂总和
- 13. Caffe中的图像分类总是返回相同的分类
- 14. 在SYNC期间,Redis Slave是否会部分更新数据集?
- 15. 是否有可能在排序集[Redis]中获得相同分数的成员?
- 16. spring-data-redis是否支持redis集群?
- 17. Redis多集与TTL
- 18. Redis集群和zsets
- 19. redis中有没有可能对密钥类型进行分类?
- 20. 使用Jmeter Redis数据集从Redis获取价值
- 21. 将数据从redis独立实例移动到redis集群
- 22. Redis的ZRANGEBYSCORE返回空集
- 23. Redis的群集错误
- 24. 过滤大集与Redis的
- 25. 分类收集
- 26. redis中的哈希或排序集?
- 27. 程序集中浮点数的总和
- 28. 总分配使用较小的聚集
- 29. polyA.fa数据集的Python分类
- 30. MATLAB的文本分类数据集
谢谢!是的,我想这可能是Redis为了执行...而特别设计的一个特性。因为我甚至可能没有做一些明智的事情。我使用zset来存储用户收到的礼品ID和发送用户ID,SCORE是从同一个发件人收到同一礼品的次数。例如,`ZINCR 123:礼物1“3 | 345”`将来自用户345的礼物w id 3发送给用户123.因此,我希望得到用户已收到的总礼物。看到?也许有更好的方法来实现这一点?这就像Facebook Gift API。 Redis规则! :)谢谢你的一切! – ma11hew28 2011-02-02 17:55:36