redis hash遍历_解惑:Redis的HSCAN命令中COUNT参数的"失效"场景

本文介绍了在使用Redis的HSCAN命令进行哈希遍历时,关于COUNT参数的理解误区。作者通过实例展示了COUNT参数并不保证每次迭代返回的元素数量,而在特定条件下,如元素数量超过512或Value长度超过64时,HSCAN的COUNT参数才会生效。文章强调了正确理解和使用Redis命令的重要性,以及避免数据分页时误用HSCAN的教训。
摘要由CSDN通过智能技术生成

前提

这是一篇Redis命令使用不当的踩坑经历分享

笔者最近在做一个项目时候使用Redis存放客户端展示的订单列表,列表需要进行分页。由于笔者先前对Redis的各种数据类型的使用场景并不是十分熟悉,于是先入为主地看到Hash类型的数据结构,假定:

USER_ID:1
ORDER_ID:ORDER_XX: {"amount": "100","orderId":"ORDER_XX"}
ORDER_ID:ORDER_YY: {"amount": "200","orderId":"ORDER_YY"}

感觉Hash类型完全满足需求实现的场景。然后想当然地考虑使用HSCAN命令进行分页,引发了后面遇到的问题。

SCAN和HSCAN命令

SCAN命令如下:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
// 返回值如下:
// 1. cursor,数值类型,下一轮的起始游标值,0代表遍历结束
// 2. 遍历的结果集合,列表

SCAN命令在Redis2.8.0版本中新增,时间复杂度计算如下:每一轮遍历的时间复杂度为O(1),所有元素遍历完毕直到游标cursor返回0的时间复杂度为O(N),其中N为集合内元素的数量。SCAN是针对整个Database内的所有KEY进行渐进式的遍历,它不会一直阻塞Redis,也就是使用SCAN命令遍历KEY的性能有可能会优于KEY *命令。对于Hash类型有一个衍生的命令HSCAN专门用于遍历Hash类型及其相关属性(Field)的字段:

HSCAN key cursor [MATCH pattern] [COUNT count]
// 返回值如下:
// 1. cursor,数值类型,下一轮的起始游标值,0代表遍历结束
// 2. 遍历的结果集合,是一个映射

笔者当时没有仔细查阅Redis的官方文档,想当然地认为Hash类型的分页简单如下(偏激一点假设每页数据只有1条):

// 第一页
HSCAN USER_ID:1 0 COUNT 1    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值