试图弄清楚如何做这个Redis

时间:2013-04-09 16:56:27

标签: php database-design redis

我正在尝试存储以下内容......

我的系统有关键字,这些关键字可以是对还是错。我希望每次有人输入错误的关键字(以及他们所在的特定应用程序和时间戳)时存储。

timestamp - application#1我希望它在自己的密钥内。

然后我需要能够“有多少人在尝试使用应用程序#1的TIMESTAMP1和TIMESTAMP2之间获得了关键字错误”

还有其他方法吗?如果最后一部分(尝试使用应用程序#1)将无法工作,我怀疑这不是SQL。然后它可以返回应用程序#1的值,所以我可以在PHP中完成最后一部分。

谢谢!

2 个答案:

答案 0 :(得分:0)

Redis不支持密钥通配符,因此您必须选择客户端密钥。

这意味着您必须获得批量密钥并将结果组合在一起;如果那并不总是可能的(例如,大范围,ms键命名解析......)你应该考虑保留聚合(每小时关键字/关键字每天...)

如果您使用集合/有序集来存储关键字,请查看特定的集合命令(特定于UNION / UNIONSTORE),因为它们可能会派上用场:)

答案 1 :(得分:0)

我知道这是一个老问题,但是我有sorted sets这个问题的解决方案。

  • 通过sorted setsappName的组合,您将拥有不同的wrong keyword,例如myapp1:wrongwordmyapp2:anotherwrongwordmyanotherapp:yetanotherwrongword ...是关键。
  • 每当用户在应用程序中输入错误的关键字时,您都将ZADDunique identifier(在应用程序层中创建,例如UUID)用作值,并将timestamp(输入时间)用作值与score相同。标识符必须唯一,因为如果您输入用户ID,那么只要同一用户在不同时间在同一应用程序中输入错误的关键字,就会覆盖已排序集合的score
  • 然后您可以使用ZCOUNT进行计算

有多少人在TIMESTAMP1TIMESTAMP2之间输入了错误的关键字,并尝试使用应用程序#1“

为简单起见;我使用小数字作为时间戳记(score),您的应用名称为myapp,而错误的关键字为wrong1。任意字母是在您的应用程序层生成的唯一ID。

127.0.0.1:6379> ZADD myapp:wrong1 123 abcdef 123 defg 126 xyz 132 qpr 145 ypz
(integer) 5
127.0.0.1:6379> ZRANGE myapp:wrong1 0 -1 WITHSCORES
 1) "abcdef"
 2) "123"
 3) "defg"
 4) "123"
 5) "xyz"
 6) "126"
 7) "qpr"
 8) "132"
 9) "ypz"
10) "145"
127.0.0.1:6379> ZRANGEBYSCORE myapp:wrong1 123 127
1) "abcdef"
2) "defg"
3) "xyz"
127.0.0.1:6379> ZCOUNT myapp:wrong1 123 127
(integer) 3
127.0.0.1:6379> ZCOUNT myapp:wrong1 123 126
(integer) 3
127.0.0.1:6379> ZCOUNT myapp:wrong1 123 125
(integer) 2

使用ZCOUNT时,您可以使用时间戳记间隔来获取用户总数,如here所述。