问题描述
从Redis中查询关注列表(使用zset
存储),但是查询到的记录总是比应有的记录数少一个
Set<Integer> targetIds = redisTemplate.opsForZSet().reverseRange(key, offset, offset + limit - 1);
调试
于是去检查Redis中置顶键zset
中的所有数据,发现自己对zset相关命令似乎并不太熟悉,于是笔记恶补一波Redis中zset
的常用命令
数据是对的,也就是说确实是少查了一条出来
ZRANGE follower:3:11 0 -1
-1
表示查询所有
解决
发现是偏移量的问题,一般使用的offset从1开始,像这样
ZRANGE follower:3:11 1 100
但是其实应该是从0开始
ZRANGE follower:3:11 0 100
反思总结
之前一直以为offset
是从1
开始编号的,自己也是一直这么做的,但是跟ChatGPT确认后才发现原来自己一直都是错的,无论是MySQL还是Redis都应该从0
开始编号
属于低级错误
稍微复习了下SQL,发现自己有更多的低级错误和很差的基础知识,这里记下,引以为戒
首先offset
关键字和limit
关键字是有顺序要求的,limit
在前offset
在后
SELECT * FROM `bookinfo` OFFSET 0 limit 1 # 这样写是错误的
SELECT * FROM `bookinfo` limit 1 OFFSET 0 # 正确写法
同时还有替代写法,第一个参数是offset
,第二个参数是limit
SELECT * FROM `bookinfo` limit 0,2
另外还有很重要的一点,SQL中原生的offset
是行偏移而不是页偏移,页便宜应该是分页插件提供的功能,和这里的不是同一个偏移概念
SELECT * FROM `bookinfo` limit 1,5 # 返回第2~6条数据
标签:zset,Redis,bookinfo,range,limit,offset,SELECT
From: https://www.cnblogs.com/yaocy/p/17415696.html