当用正则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>