我们现在就是Redis

了解更多

Redis最佳实践

词典编码

除了按分数排序外,排序集(ZSET)还有一个有趣的特性,可以用来创建大致字母排序机制. 这个属性是相同分数的成员可以按有界的字典顺序返回。让我们以以下数据为例:

>扎德动物名单0野牛0野猪0狗0鸸鹋0猎鹰0短吻鳄0花栗鼠

上面的命令将一些动物添加到密钥动物名录.每个成员总是有相同的分数(0)。运行参数为0(表示第一项)和-1(表示“最后一个”成员的分数)的ZRANGE命令时,我们会看到一个奇怪的顺序:

>ZRANGE动物名单0-11) “鳄鱼”2) “野牛”3) “博阿”4) “花栗鼠”5) “狗”6) “欧洲货币联盟”7) “猎鹰”

尽管项目按非字母顺序输入,但返回的项目按字母顺序正确排序。这种排序顺序实际上是在二进制安全的基础上逐字节进行字符串比较的结果。这意味着ASCII字符将以正确的英文字母排序顺序返回。这有几个含义:

  • 小写和大写不能理解为同一个字母
  • 多字节字符将不会按预期方式排序

Redis还提供了一些高级功能来进一步缩小词典搜索范围。例如,我们希望返回以“b”开头、以“e”结尾的动物。我们可以使用以下命令:

>ZRANGEBYLEX动物名录[b(f 1)“野牛”2“野猪”3“花栗鼠”4“狗”5“鸸鹋”

争论(f)这可能有点令人惊讶。这是很重要的一点,因为Redies没有真正理解字母字母的概念,这意味着我们必须考虑从一个字母开始的任何东西。E总是在以F,而不考虑其后的信件。其他值得注意的是,方括号表示包含搜索,而paren表示独占搜索B,它将被包括在列表中,而F不会向其发出上述命令。如果要使所有项目通过某个点,则应使用最后一个字符(255或0xFF)的十六进制编码:

>ZRANGEBYLEX动物名录[c”[xff”1)“花栗鼠”2“狗”3“鸸鹋”4“猎鹰”

同样的命令也可以被限制以提供分页效果。以以下命令和响应为例:

>ZRANGEBYLEX动物列表[b(f限制0 2 1)“野牛”2“野猪”>ZRANGEBYLEX动物列表[b(f限制2 2 1)“花栗鼠”2“狗”

唯一需要注意的是,时间复杂性将根据偏移量(后面的第一个参数)继续增长极限)所以,若你们有一百万个成员,你们想得到最后两个,例如,这需要遍历所有一百万个项目。

Baidu