redis使用scan count 返回数量不准确

1、前提

因为项目需要redis一些老数据做删除操作,大概30w数据,当时想的是用keys命令把数量一次性拿出来,但是keys会造成线程的阻塞,所以选择使用scan命令进行操作

2、发现问题

当我在本地使用scan命令的时候,发现我测试环境明明有1000条数据,我每次count的条数是100条,但是惊奇的发现返回的总数居然不是100条,而是79条数据。

 

 

 

 

这个时候我就怀疑应该是我没有理解到count机制的问题,然后就去翻阅官网,果然找到了答案。:

由此可以看到,count并不一定能返回用户所指定的数量。既然如此,那么这个count到底做了什么尼。

3、在网上找到了一篇我认为还比较好的解答

 

 从上面的解释就可以看出,count其实并不是返回的是数量集合,而是查询数据的时候进行的字典槽数量。

4、什么是字典槽

在 Redis 中所有的 key 都存储在一个很大的字典中,这个字典的结构和 Java 中 的 HashMap 一样,是一维数组 + 二维链表结构,

第一维数组的大小总是 2^n (n>=0),扩容一次数组大小空间加倍,也就是 n++。

 

 

scan 指令返回的游标就是第一维数组的位置索引,我们将这个位置索引称为槽 (slot)。

如果不考虑字典的扩容缩容,直接按数组下标挨个遍历就行了。

limit 参 数就表示需要遍历的槽位数,之所以返回的结果可能多可能少,是因为不是所有 的槽位上都会挂接链表,

有些槽位可能是空的,还有些槽位上挂接的链表上的元 素可能会有多个。每

一次遍历都会将 limit 数量的槽位上挂接的所有链表元素进 行模式匹配过滤后,一次性返回给客户端。

 

posted @   二娃的园子  阅读(3699)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示