Redis多键设置计数

时间:2016-01-02 06:06:21

标签: count redis

所以我为我的Redis实现添加了按键,这样的壁纸视图计数...... (这些值用于演示目的,但整体格式相同)

SADD wallpapers:100:2015-12-31 "127.0.0.1"
SADD wallpapers:100:2016-01-01 "127.0.0.1"
SADD wallpapers:100:2016-01-01 "192.168.1.1"
SADD wallpapers:100:2016-01-02 "127.0.0.1"

这样就应该在关联的集合中添加IP。所以我的问题是,他们是否允许某种基于模式的计数?

SCARD wallpapers:100:2016:01-01

例如,上面的命令将返回" 2",因为集合中存储了两个IP,但有没有办法运行类似下面的命令来获取所有日期的所有计数?

SCARD wallpapers:100:*

2 个答案:

答案 0 :(得分:1)

实际上它比你想象的要容易:存储较少的特定集合以便能够得到你想要的东西。

例如,如果您需要wallpapers:100:*,则表示您只需要一个名为wallpapers:100 set ,您可以在其中存储唯一的IP地址。

也就是说,每当您将IP地址添加到其中一个特定集(即每日集)时,也会将其添加到给定壁纸标识符的全局

Redis就像使用手动索引一样。以有效使用数据的方式索引数据。就这样!这意味着数据冗余是一种很好的方法。

答案 1 :(得分:0)

EVAL "local total = 0 for _, key in ipairs(redis.call('keys', ARGV[1])) do total = total + redis.call('scard', key) end return total" 0 wallpapers:100:*

此命令返回键wallpapers:100:*中元素的总数。

如果您想要组合所有键的唯一值总数,

EVAL "return redis.call('SUNIONSTORE', 'wallpapers:temp', unpack(redis.call('keys', ARGV[1])))" 0 wallpapers:100:*

这将返回所有组合键中唯一值的数量,并创建一个键wallpapers:temp

您可以稍后删除此密钥del wallpapers:temp

我使用SUNIONSTORE作为第二个命令。

参考EVAL