部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Redis的HSCAN命令遇到的一个问题

使用Redis的HSCAN命令遇到的一个问题

作者头像
Throwable
发布于 2020-06-23 08:08:56
发布于 2020-06-23 08:08:56
4.2K00
代码可运行
举报
文章被收录于专栏:Throwable's BlogThrowable's Blog
运行总次数:0
代码可运行

前提

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)的字段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HSCAN key cursor [MATCH pattern] [COUNT count]
// 返回值如下:
// 1. cursor,数值类型,下一轮的起始游标值,0代表遍历结束
// 2. 遍历的结果集合,是一个映射

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 第一页
HSCAN USER_ID:1 0 COUNT 1    <= 这里认为返回的游标值为1
// 第二页
HSCAN USER_ID:1 1 COUNT 1    <= 这里认为返回的游标值为0,结束迭代

实际上,执行的结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HSCAN USER_ID:1 0 COUNT 1

// 结果
0 
 ORDER_ID:ORDER_XX
 {"amount": "100","orderId":"ORDER_XX"}
 ORDER_ID:ORDER_YY
 {"amount": "200","orderId":"ORDER_YY"}

也就是在第一轮遍历的时候,KEY对应的所有Field-Value已经全量返回。笔者尝试增加哈希集合KEY = USER_ID:1里面的元素,但是数据量相对较大的时候,依然没有达到预期的分页效果;另一个方面,尝试修改命令中的COUNT值,发现无论如何修改COUNT值都不会对遍历的结果产生任何影响(也就是还是在第一轮迭代返回全部结果)。百思不得其解的情况下,只能仔细翻阅官方文档寻找解决方案。在SCAN命令的COUNT属性描述中找到了原因:

简单翻译理解一下:

SCAN命令以及其衍生命令并不保证每一轮迭代返回的元素数量,但是可以使用COUNT属性凭经验调整SCAN命令的行为。COUNT指定每次调用应该完成遍历的元素的数量,以便于遍历集合,本质只是一个提示值。

  1. COUNT默认值为10。
  2. 当遍历的目标SetHashSorted Set或者Key空间足够大可以使用一个哈希表表示并且不使用MATCH属性的前提下,Redis服务端会返回COUNT或者比COUNT大的遍历元素结果集合。
  3. 当遍历只包含Integer值的Set集合(也称为intsets),或者ziplists类型编码的Hash或者Sorted Set集合(说明这些集合里面的元素占用的空间足够小),那么SCAN命令会返回集合中的所有元素,直接忽略COUNT属性。

注意第3点,这个就是在Hash集合中使用HSCAN命令COUNT属性失效的根本原因。Redis配置中有两个和Hash类型ziplist编码的相关配置值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

在如下两个条件之一满足的时候,Hash集合的编码会由ziplist会转成dict

  • Hash集合中的数据项(即Field-Value对)的数目超过512的时候。
  • Hash集合中插入的任意一个Field-Value对中的Value长度超过64。

Hash集合的编码会由ziplist会转成dictRedisHash类型的内存空间占用优化相当于失败了,降级为相对消耗更多内存的字典类型编码,这个时候,HSCAN命令COUNT属性才会起效。

案例验证

简单验证一下上一节得出的结论,写入一个测试数据如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 70个X
HSET USER_ID:2 ORDER_ID:ORDER_XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX   
// 70个Y
HSET USER_ID:2 ORDER_ID:ORDER_YYY YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

接着开始测试一下HSCAN命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查看编码
object encoding USER_ID:2
// 编码结果
hashtable

// 第一轮迭代
HSCAN USER_ID:2 0 COUNT 1
// 第一轮迭代返回结果
2 
 ORDER_ID:ORDER_YYY
 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

// 第二轮迭代 
HSCAN USER_ID:2 2 COUNT 1
0 
 ORDER_ID:ORDER_XXX
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

测试案例中故意让两个值的长度为70,大于64,也就是让Hash集合转变为dict(hashtable)类型,使得COUNT属性生效。但是,这种做法是放弃了RedisHash集合的内存优化。显然,HSCAN命令天然不是为了做数据分页而设计的,而是为了渐进式的迭代(也就是如果需要迭代的集合很大,也不会阻塞Redis服务)。所以笔者最后放弃了使用HSCAN命令,寻找更适合做数据分页查询的其他Redis命令。

小结

通过这简单的踩坑案例,笔者得到一些经验:

  • 切忌先入为主,使用中间件的时候要结合实际的场景。
  • 使用工具的之前要仔细阅读工具的使用手册。
  • 要通过一些案例验证自己的猜想或者推导的结果。

Redis提供的API十分丰富,后面应该还会遇到更多的踩坑经验。

附件

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年8月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022年消费金融行业研究报告
消费金融,指为个人提供以消费为目的的贷款,额度一般在 20 万元以下。早期消费金融产品主要由商业银行及汽车金融公司提供,随着消费金融市场的发展,持牌消费金融机构及互联网机构逐渐加入竞争。
资产信息网
2022/03/28
1.4K0
2022年消费金融行业研究报告
2022年不良资产和资产管理公司行业研究报告
不良资产(Non-performing Assets)是一个比较宽泛的概念,它是针对会计科目里的坏账科目而言,包括但不限于银行的不良资产、政府的不良资产,以及证券、保险、基金、信托等的不良资产,企业的不良资产等等。金融企业尤其是银行作为风险行业,是不良资产的主要源头之一。
资产信息网
2022/03/23
2.2K0
2022年不良资产和资产管理公司行业研究报告
2022年金融租赁行业研究报告
金融租赁指由出租人根据承租人请求,按双方合同约定,从指定卖家购买承租人指定固定资产,在出租人拥有该固定资产所有权前提下,以承租人支付租金为条件,将一定时期该固定资产的占有、使用和收益权让渡给承租人。
资产信息网
2022/03/25
8560
2022年金融租赁行业研究报告
2021年资产管理行业发展研究报告
资产管理(Asset Management),通常是指一种“受人之托,代人理财”的信托业务。从这个意义上看,凡是主要从事此类业务的机构或组织都可以称为资产管理公司(Asset Management Companies),简称 AMC。
资产信息网
2022/04/20
1.4K0
2021年资产管理行业发展研究报告
2021年资产管理与托管银行行业发展研究报告
资产管理与托管银行是主要从事投资管理和与其相关的有偿托管和证券业务。包括经营共同基金和封闭式基金的公司以及单位信托公司。不包括那些主要从事商业贷款、投资银行业、经纪业和其它特殊金融业务的银行和金融机构。
资产信息网
2022/04/22
8000
2021年资产管理与托管银行行业发展研究报告
《大数据时代,全球征信业发展》研究报告
怎么理解征信? 征信的本质:对金融主体的数据刻画 征信是指对企业组织和个人的信用信息进行采集、整理、保存和加工,并向信息使用者提供的活动,其本质在于利用信用信息对金融主体进行数据刻画。 征信的功能:
数据猿
2018/04/19
2.9K0
《大数据时代,全球征信业发展》研究报告
2021年房地产金融行业发展研究报告
房地产金融是房地产业与金融业密切结合的产物。作为经济学的一个分支,主要研究房地产经济领域内信贷资金运动及其规律性。
资产信息网
2022/04/08
5770
2021年房地产金融行业发展研究报告
阿里小贷:封闭流程与数据挖掘
  随着新年后资金面的舒缓,货币基金收益率开始了持续的回落,货币基金投资方式的必然调整也加剧了风险收益比的不确定性。更为严峻的是明显的竞争加剧,随着一些大型商业银行让夺利益推出类似产品,始终无法进入线下支付的支付宝和财付通并不占优势。   支付清算是现代金融服务的大门,但如果马云所勾画的“外行对于内行的颠覆性领导”仅仅停留在这个层面,未免有些言过其实了。令我们欣喜的是,在大门的里面,互联网金融同样给传统银行们上了一课。并且相比于坐在顺风船上的余额宝,从尘埃中走出的阿里小贷更具有那么一丝超现实的意
大数据文摘
2018/05/21
9320
平安、宜信、飞贷,谁将称霸移动互联网贷款市场?
如果把2015年看做是我国个人征信市场化的元年,那在这个千亿级别的征信市场上,借贷成为了首当其冲的战场,无论是传统金融大佬平安、还是互联网巨头阿里、腾讯,抑或是创业新秀宜信、最大黑马飞贷都使出浑身解数,准备打一场持久战。但现实情况是虽然国家近一步放宽了借贷市场,借贷市场依然吃紧,再加上整个行业的残酷厮杀,无担保、无抵押依靠信用贷款的借贷模式到底能不能迎来爆发,又将面临着什么样的问题?
曾响铃
2018/08/20
9460
2021年券商行业发展研究报告
证券行业指专门从事有价证券买卖的法人企业。分为证券经营公司和证券登记公司。狭义的证券公司是指证券经营公司,是经主管机关批准并到有关工商行政管理局领取营业执照后专门经营证券业务的机构。它具有证券交易所的会员资格,可以承销发行、自营买卖或自营兼代理买卖证券。普通投资人的证券投资都要通过证券商来进行。
资产信息网
2022/04/15
5460
2021年券商行业发展研究报告
早报:中国网络直播用户规模年底将达3.92亿
1、新设网络小贷被叫停,真正持有网络小贷牌照的仅几十家机构 近日,设在央行的互联网金融风险专项整治工作领导小组办公室与设在银监会的P2P网贷风险专项整治工作领导小组办公室联合发布《关于规范整顿“现金贷”业务的通知》(以下简称《通知》)。随着政策落地,“现金贷”行业将迎大洗牌,上千家平台面临整顿清理。《通知》指出,具有无场景依托、无指定用途、无客户群体限定、无抵押等特征的“现金贷”业务快速发展,在满足部分群体正常消费信贷需求方面发挥了一定作用,但过度借贷、重复授信、不当催收、畸高利率、侵犯个人隐私等问题十分
用户1335017
2018/03/09
1.2K0
早报:中国网络直播用户规模年底将达3.92亿
关于Fintech的九个预言
摘要: 随着金融市场化和利率市场化的进程,国内的金融压抑减轻之后,金融创新的高潮可能会有回落,这是必然的,未来市场会进入更加理性、平稳的发展阶段。 ◆ ◆ ◆ 金融科技即为资产创新的一种 金融科技的出现和蓬勃发展,很大程度上是由时下的经济环境决定的。从信贷周期或流动性周期来看,金融的创新是有周期性的,创新最主要的动力就来自于资金的流动性过剩,资金的本质是追求高回报,因为近年来经济形势不好、以往资金获利的能力下降,所以解决资金回报问题的方法之一是资产创新。金融科技就是资产创新的一种。 在峰瑞资产创始合伙
大数据文摘
2018/05/24
4470
移动端借款比例上升 大数据和风控是关键
移动互联网的迅猛发展催生了更多创新和颠覆的模式,传统金融正受着巨大冲击。当前,随着微众银行微粒贷上线,加上现金贷、随意借、手机贷等平台,通过移动端贷款的平台也越来越多。 与此同时,以友信为代表的部分P2P平台也纷纷抢滩进入移动金融领域,“移动借款”正在从一个尚且新鲜的认知逐渐成为P2P行业的普遍共识。 对此,业内人士表示,通过移动端来贷款确实更加方便,不过可能更适合一些金额较小的贷款,同时,通过移动端等纯线上模式完成贷款,仍需依靠大数据的发展和不断完善征信体系。随着大数据、云计算等新一代互联网技术的迅速崛起
灯塔大数据
2018/04/10
1.1K0
BAT三巨头的互联网金融落子图
昨天百度宣布本月28日将推出类似余额宝的理财产品“百发”,其目标年化收益率可能达到8%。此举距离阿里彭蕾刚刚抨击完微信不过一周。百度、腾讯等互联网巨头,招行和平安等老牌金融机构、甚至游戏厂商巨人均尝试抢滩互联网金融这个时髦业务。 “互联网金融”与“金融互联网”最大的不同之处便在于“互联网”的属性。传统金融因财聚人,互联网金融因人聚财;传统金融以机构为中心,互联网金融用户为中心;传统金融牌照、资金为主,互联网金融技术和数据为主;传统金融产品是生硬的利率、收益率、年限方案,互联网金融通过互联网手
罗超频道
2018/04/27
1.1K0
2022年财务顾问FA行业研究报告
财务顾问(Financial Advisor, FA)又称融资顾问,这里主要是指帮助创业公司提供投融资服务的机构。FA本质上其实是介于创业者与投资机构之间的第三方,面向双方提供投融资的撮合服务,当然不仅限于私募融资服务,包括合并收购、战略重组、IPO、定向增发等方面不同机构都各有涉猎。在早期项目中,FA机构的佣金通常是融资金额的3%-5%,后期的项目融资金额较大,佣金比例也会适当调低。
资产信息网
2022/03/25
8060
2022年财务顾问FA行业研究报告
史上最全2017年百度贷款行业报告在这里!
数字是理性的,金融不总是理性的 金融,是人类自己制造的时光机。金融的初心,则是帮助人类突破约束条件,在不确定的未来中追求更大的自由。 古时的共享食物,今日的基金、股票、债券,都是一种金融安排,通过共担风险和共享利益,人类得以规模化地实现增长和繁荣。 金融拓展了人类计算未来的能力。特别是近两年,得益于政策支持,普惠金融站上了风口,使得原本没有机会享受金融服务的人群也能获得服务,其中的关键点和难点,是贷款的可获得性。 然而数字是理性的,金融不总是理性的。近两年信贷公司赴美上市潮引发各方争议,今时贷款有普惠金融的
用户1310347
2018/03/02
7980
史上最全2017年百度贷款行业报告在这里!
深度|新势能的缩影,消费金融爆发的这几年。
2009年7月,中国银监会发布《消费金融公司试点管理办法》,正式宣布启动消费金融试点工作。消费金融公司的角色定位是作为银行的创新及补充部分,发展商业银行动力不足的个人金融服务。因此,这一试点办法的下发及试点公司的批复可以被视为我国消费金融行业的开端。
用户1310347
2019/07/30
5110
深度|新势能的缩影,消费金融爆发的这几年。
2022年金融与互联网资质牌照研究报告
《国民经济行业分类》国家标准于1984年首次发布,分别于1994年和2002年进行修订,2011年第三次修订,2017年第四次修订。该标准(GB/T4754-2017)由国家统计局起草,国家质量监督检验检疫总局、国家标准化管理委员会批准发布,于2017年10月1日实施。
资产信息网
2022/03/25
2.1K0
2022年金融与互联网资质牌照研究报告
中国互联网银行深度研究报告:互联网+银行前景与数据分析
4. 互联网+银行:前途不可限量 4.1. 银行业的互联网渗透率仍处于低位 银行业资产规模基数庞大。2014 年银行业金融机构总资产规模达到 134.8 万亿元,商业银行净利润规模达到 1.55 万亿元,远超过保险、信托、基金等细分市场的总量。 互联网银行的渗透率仍处于低位。2013年被称为“互联网金融元年”,2013 年至今短短的两年多时间,互联网金融发展迅猛,尽管如此,与传统银行业庞大的体量相比较,互联网银行的渗透率仍处于低位,余额宝、P2P 等产品目前仅吸引了传统银行业未曾覆盖的长尾用户,尚未触及银行
CDA数据分析师
2018/02/11
1.7K0
微众微粒贷、蚂蚁借呗、京东金条,谁能赢得网贷下半场?
作为当前互联网金融市场最重要的分支之一,网络借贷已入“短、平、快、准”的移动互联网时代。不论是传统银行、消费金融公司还是BAT巨头、P2P等互联网金融平台,都在觊觎这一块大蛋糕。在经历了数年的快速成长后,网络信贷开始两极分化,并逐渐形成几超多强的局面,那么在网贷整体进入下半场的时候,谁才是决定生死的力量?谁又能打好风控这张牌?
曾响铃
2018/08/20
7660
推荐阅读
相关推荐
2022年消费金融行业研究报告
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验