ERR value is not a valid float 是因为:
分数值应该是双精度浮点数的字符串表示。 +inf 和 -inf 值也是有效值。
所以你不应该在 sortedset 值中使用电子邮件或用户名,你可以尝试另一种方法来构建二级索引:字典索引,在你提到的文章中也提到了。
在此方法中,只需将值设置为 0 并使用成员的 lex order 来构建索引。例如。如果你想为用户名建立索引:
ZADD user.username.index 0 antirez:1
所以当你想找到名字为antirez的id时,你可以这样做:
ZRANGEBYLEX user.username.index [antirez + limit 1 1
[ 表示包容,+ 表示无限大,它只会返回一个成员,例如antirez:1,然后你用冒号分割字符串,你会得到antirez的id。电子邮件与用户名相同。
更新评论:
是的,你可以让复合索引之类的东西喜欢关系数据库。但它也需要有一个命令,比如(用户名,ctime,...)。
例如如果你想用 username 和 ctime 建立一个复合索引:
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 来构建一个类似于 rdb 的索引的索引。
如果索引是(key1,key2,key3),那么你应该将成员的前缀设置为“key1:key2:key3:”,然后在这个字符串中添加一个参考值或真实值,如:
"key1:key2:key3:ref_value",并将所有成员的值设置为相等。 SortedSet 将按其 lex 顺序对所有成员进行排序,因此您可以使用复合索引的前缀来索引,例如:key1、key1:key2 或 key1:key2:key3。
对于使用 ref value 或 real value 存储,也许 ref_value 更灵活,您可以将 real value 存储为其他数据类型,可以是 list 或 hash 或 set。当你想更新一些东西时,你可以先使用二级索引来获取它的 ref_value,然后去它的 real_value 去改变它。