Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用正则表达式搜索时redis响应时间长_Node.js_Regex_Caching_Redis - Fatal编程技术网

Node.js 使用正则表达式搜索时redis响应时间长

Node.js 使用正则表达式搜索时redis响应时间长,node.js,regex,caching,redis,Node.js,Regex,Caching,Redis,我将redis用于我的主数据库(mongodb)缓存系统。 在缓存的文档数变大之前,一切都正常工作,例如缓存15K文档后,redis响应时间增加 这是我在Redis中的键,值 key: userId_123_username_test_email_test@gmail.com value: JSON.stringfy(userobject) 正如我在标题中所说,当我试图用regex查找文档时,响应时间在增加 我正在寻找索引文档,我找到了这个 根据本文,我发现我可以为年龄字段设置索引,但实际上我

我将redis用于我的主数据库(mongodb)缓存系统。 在缓存的文档数变大之前,一切都正常工作,例如缓存15K文档后,redis响应时间增加

这是我在Redis中的

key: userId_123_username_test_email_test@gmail.com
value: JSON.stringfy(userobject)
正如我在标题中所说,当我试图用regex查找文档时,响应时间在增加

我正在寻找索引文档,我找到了这个

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

HMSET user:1 id 1 username antirez ctime 1444809424 age 38
ZADD user.age.index 38 1
还可以尝试以下方法:

ZADD user.username.index antirez 1
返回错误:
错误值不是有效的浮点值

错误值不是有效的浮点值是因为:

分数值应该是双精度浮点数的字符串表示形式+inf和-inf值也是有效值

因此,您不应该在sortedset值中使用电子邮件或用户名,您可以尝试另一种方法来构建二级索引:词典索引,这也在您提到的文章中提到过

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

ZADD user.username.index 0 antirez:1
因此,当您想查找名为antirez的id时,可以执行以下操作:

ZRANGEBYLEX user.username.index [antirez + limit 1 1
[
表示包含,
+
表示无限大,它只返回一个成员,例如antirez:1,然后用冒号拆分字符串,您将获得antirez的id。电子邮件sames作为用户名

更新评论:

是的,您可以创建类似于关系数据库的复合索引,但它也需要有一个顺序,比如(用户名,ctime,…)

例如,如果您想使用用户名和ctime构建复合索引:

ZADD user.composite.index 0 antirez:2017-09-04:1
ZRANGEBYLEX user.composite.index [antirez:2017-09-04 (antirez:2017-09-05 
当您想要获取用户名和ctime的id时:

ZADD user.composite.index 0 antirez:2017-09-04:1
ZRANGEBYLEX user.composite.index [antirez:2017-09-04 (antirez:2017-09-05 
它将返回此期间的所有ID,其用户名为antirez

总之,您可以使用sortedset构建一个类似rdb索引的索引

如果索引为(key1、key2、key3),则应将成员的前缀设置为“key1:key2:key3:”,然后向该字符串添加ref值或实数值,如: “key1:key2:key3:ref_value”,并将所有成员的值设置为相等。SortedSet将按其lex顺序对所有成员排序,因此您可以使用复合索引的前缀来索引,例如:key1、key1:key2或key1:key2:key3

对于带有ref值或real值的存储,ref\u值可能更灵活,您可以将real值存储在其他数据类型中,可以是list、hash或set。当您要更新某些内容时,您可以先使用二级索引获取其ref\u值,然后转到其real\u值进行更改

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) “安特里兹”

2) “1”


当我更改ZRANGEBYLEX user.username.index[antrez+limit 0 1时,它起作用了,谢谢♥有没有办法用两个或两个以上的索引来查找,例如,我想要像这样的东西
ZRANGEBYLEX user.username.index[antrez+limit 01 user.ctime.index[1444809424+limit 01
,而且我也索引了它们两个(username,ctime),这是可行的,但实际上我需要用未排序的索引来查找这样的东西:(uname,email,ctime)或(email,ctime,uname,…)或其他在`(uname,email,ctime,…`和`(email,ctime,uname,…)之间有什么区别呢?`,您可以按指定的顺序订购,然后它们将是相同的。在这种情况下,您应该将订单设置为(uname,ctime,email),然后您可以使用前两个键进行查找,如果您没有电子邮件键,zadd应该类似于find
ZRANGEBYLEX user.composite.index[uname:ctime+limit 0 1