redis zrange 与 zrangebyscore的区别解析

 更新时间:2023年06月20日 09:54:37   作者:FBI HackerHarry浩  
这篇文章主要介绍了redis zrange与zrangebyscore的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

redis zrange 与 zrangebyscore的区别

前言

想做一个在redis中获取数据时分页的功能,从网上查找到了zrange和zrangebyscore两个函数,对于这两个函数的理解,在刚刚读完官方文档后,还是不太懂:

zrange: “The order of elements is from the lowest to the highest score. Elements with the same score are ordered lexicographically.” https://redis.io/commands/zrange

zrangebyscore:“The elements are considered to be ordered from low to high scores.” https://redis.io/commands/zrangebyscore

嗯?都是依据socre排序,所以啥区别?虽说是一个索引一个score,但结果都是按照score排序,所以到底有啥区别???

刚接触的时候,光靠看定义来理解,真的很容易蒙蔽。

所以做个实验,就清楚了。

先说概念上的结论:

 两者的区别,就是一个是“索引”(zrange),一个是“score”(zrangebyscore)!【are you kidding me?!】

实验

数据准备

在redis中依次执行下列语句:

zadd test 1 first
zadd test 10 two
zadd test 8 three
zadd test 7 four
zadd test 2 five
zadd test 1.1 onePointOne
zadd test 2 six
zadd test 8 seven
zadd test 7 sight

对比案例一

我们输入0 2两个参数来查询(具体命令使用方法请自行查阅官方文档)

用zrange
命令:

zrange test 1 2 withscores

结果:

用zrangebyscore
命令

zrangebyscore test 1 2 withscores

结果:

对比结论:

zrange是传入的值是索引 ,因此查询的值“1”代表是查询第二个值,也就是说,索引的情况下,索引0是第一个元素。

而zrangebyscore传入的值就是值本身的含义,也就是“score”

注:确实,官方文档就说了起始值为0的问题,但这确实是一个容易犯错误的地方。

对比案例二

我们输入0 7两个参数来查询(具体命令使用方法请自行查阅官方文档)

用zrange
命令:

zrange test 0 7 withscores

结果:

用zrangebyscore

命令:

zrangebyscore test 0 7 withscores

结果:

对比结论:

同上一个测试

zrange查询的结果个数,就是索引的区间长度(如【0-7】,区间长度是8,所以查出来8个数据,当然,前提是数据不少于8个),
而zrangebyscore由于是用socre来查询,因此,在准备的数据中,有多少个符合【0,7】区间的数据,就会返回多少数据。

注:确实,官方文档就说了起始值为0的问题,但这确实是一个容易犯错误的地方。

总结

zrange的第一个数据是索引为0的数据,而zrangebyscore的第一个数据,是score值最小的那个数据

zrange传入的参数是“索引”的含义,而zrangebyscore就是单纯的一个数值的含义

zrange查询的结果个数<= 查询区间长度,也就是说 ,区间多长,就查询出多少个结果出来(数据不少于区间长度,足够多的情况下),而zrangebyscore的查询结果个数视实际数据而定,也就是凡是符合区间的数据,全部查询出来.

所以在分页查询的需求下,zrange可以保证每页的数据量,而zrangebyscore不能保证。

如果有数据更新,zrange就会出现数据查询重复和遗漏的情况。而zrangebyscore却由于符合条件则全部查询出来的特性,而不会出现重复和遗漏。

不理解“重复和遗漏”是怎么发生的?自己仔细思考去吧,实在不行做个实验,你就明白了,这里我不细说。

到此这篇关于redis zrange 与 zrangebyscore的区别的文章就介绍到这了,更多相关redis zrange 与 zrangebyscore区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何使用Redis实现分布式锁

    详解如何使用Redis实现分布式锁

    Redis 作为一个独立的三方系统,其天生的优势就是可以作为一个分布式系统来使用,因此使用 Redis 实现的锁都是分布式锁,所以本文就给大家讲讲如何使用Redis实现分布式锁,感兴趣的小伙伴跟着小编来看看吧
    2023-08-08
  • Redis分布式锁解决秒杀超卖问题

    Redis分布式锁解决秒杀超卖问题

    本文主要介绍了Redis分布式锁解决秒杀超卖问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 查看redis占用内存的实现方法

    查看redis占用内存的实现方法

    这篇文章主要介绍了查看redis占用内存的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Redis中lua脚本实现及其应用场景

    Redis中lua脚本实现及其应用场景

    本文主要介绍了Redis中lua脚本实现及其应用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Redis中键和数据库通用指令详解

    Redis中键和数据库通用指令详解

    这篇文章主要为大家介绍了Redis中键和数据库通用指令基本操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • redis 限制内存使用大小的实现

    redis 限制内存使用大小的实现

    这篇文章主要介绍了redis 限制内存使用大小的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • redis加锁的几种方式汇总

    redis加锁的几种方式汇总

    这篇文章主要介绍了redis加锁的几种方式汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • redis实现分布式的方法总结

    redis实现分布式的方法总结

    在本篇文章中小编给大家整理了关于redis分布式怎么做的具体内容以及知识点总结,有兴趣的朋友们参考下。
    2019-06-06
  • Redis 的内存淘汰策略和过期删除策略的区别

    Redis 的内存淘汰策略和过期删除策略的区别

    这篇文章主要介绍了Redis 的内存淘汰策略和过期删除策略的区别,Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略
    2022-07-07
  • redis中使用java脚本实现分布式锁

    redis中使用java脚本实现分布式锁

    这篇文章主要介绍了redis中使用java脚本实现分布式锁,本文同时讲解了java脚本和lua脚本实现分布式锁,需要的朋友可以参考下
    2015-01-01

最新评论