当用正则expression式search时,redis的响应时间很长

我使用redis作为我的主数据库(mongodb)caching系统。 一切工作正常,直到caching的文件数越来越大,例如15K文件caching后,redis响应时间增加。

这是我在Redis中的关键 价值

key: userId_123_username_test_email_test@gmail.com value: JSON.stringfy(userobject) 

正如我在标题中说的,当我试图find与正则expression式的文件,响应时间增加。

我正在寻找索引文件,我发现这篇文章

根据这篇文章我发现,我可以设置年龄字段的索引,但实际上我需要设置电子邮件或用户名索引

 HMSET user:1 id 1 username antirez ctime 1444809424 age 38 ZADD user.age.index 38 1 

也试试这个:

 ZADD user.username.index antirez 1 

返回错误: ERR值不是有效的浮点数

ERR value is not a valid float是因为:

得分值应该是双精度浮点数的string表示。 + inf和-inf值也是有效值。

所以你不应该使用电子邮件或用户名在sortedset值,你可以尝试另一种方法来build立二级索引: 字典学索引 ,这也在你提到的文章中提到。

在这种方法中,只需将值设置为0并使用成员的lex顺序来构build索引。 例如,如果你想build立用户名索引:

 ZADD user.username.index 0 antirez:1 

所以当你想find名字是antirez的id时,你可以这样做:

 ZRANGEBYLEX user.username.index [antirez + limit 1 1 

[意思是包容, +意思是无限大,只会返回一个成员,比如antirez:1,那么你用冒号分割string,就会得到antirez的id。 用户名和电子邮件地址相同

更新评论:

是的,你可以使像复合索引喜欢关系数据库。 但它也需要有一个命令,如(用户名,ctime,…)。

例如,如果你想用username和ctime构build一个复合索引:

 ZADD user.composite.index 0 antirez:2017-09-04:1 

当你想获得用户名和ctime的id:

 ZRANGEBYLEX user.composite.index [antirez:2017-09-04 (antirez:2017-09-05 

它会在这个期间返回所有的ID,用户名是antirez。

总之,你可以使用sortedset来build立一个像rdb的索引这样的索引。

如果索引是(key1,key2,key3),则应该将成员的前缀设置为“key1:key2:key3:”,然后向该string添加ref值或实际值,如:“key1:key2:key3: ref_value“,并设置所有成员的值相等。 SortedSet将按照他们的顺序排列所有成员,因此您可以使用组合索引的前缀来索引,例如:key1,key1:key2或key1:key2:key3。

对于具有ref值或实际值的商店,ref_value可能更加灵活,可以将实际值存储在其他数据types中,可以是list或hash或set。 当你想更新某些东西时,你可以先使用二级索引来获取它的ref_value,然后去real_value来改变它。

 return error: ERR value is not a valid float is because the order is wrong Try zadd user.username.index 1 antirez 127.0.0.1:6379> zadd user.username.index 1 antirez Response: (integer) 1 127.0.0.1:6379> zrange user.username.index 0 -1 withscores 

1)“antirez”

2)“1”

 127.0.0.1:6379>