开发手记:Redis中zset查询的range

问题描述

从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条数据
posted @ 2023-05-19 17:15  YaosGHC  阅读(357)  评论(0)    收藏  举报