Redis遍历海量数据的实现示例

 更新时间:2025年04月21日 09:10:12   作者:汤姆yu  
本文主要介绍了 Redis遍历海量数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、前言

有时候我们需要知道线上的redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?今天给大家分享一个小知识点!

2、事故产生

因为我们的用户token缓存是采用了【user_token:userid】格式的key,保存用户的token的值。我们运维为了帮助开发小伙伴们查一下线上现在有多少登录用户。

直接用了 keys user_token 方式进行查询,事故就此发生了。导致redis不可用,假死。

分析原因

我们线上的登录用户有几百万,数据量比较多;keys算法是遍历算法,复杂度是O(n),也就是数据越多,时间复杂度越高。

数据量达到几百万,keys这个指令就会导致 Redis 服务卡顿,因为 Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续。

解决方案

那我们如何去遍历大数据量呢?这个也是面试经常问的。我们可以采用redis的另一个命令scan。

我们看一下scan的特点

1、复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程

2、提供 count 参数,不是结果数量,是redis单次遍历字典槽位数量(约等于)

3、同 keys 一样,它也提供模式匹配功能;

4、服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;

5、返回的结果可能会有重复,需要客户端去重复,这点非常重要;

6、单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零

一、scan命令格式

SCAN cursor [MATCH pattern] [COUNT count]

二、命令解释

scan 游标 MATCH <返回和给定模式相匹配的元素> count 每次迭代所返回的元素数量

SCAN命令是增量的循环,每次调用只会返回一小部分的元素。所以不会让redis假死

SCAN命令返回的是一个游标,从0开始遍历,到0结束遍历

三、举例

redis > scan 0 match user_token* count 5 
 1) "6"
 2) 1) "user_token:1000"
 2) "user_token:1001"
 3) "user_token:1010"
 4) "user_token:2300"
 5) "user_token:1389"

从0开始遍历,返回了游标6,又返回了数据,继续scan遍历,就要从6开始

redis > scan 6 match user_token* count 5 
 1) "10"
 2) 1) "user_token:3100"
 2) "user_token:1201"
 3) "user_token:1410"
 4) "user_token:5300"
 5) "user_token:3389"

3、总结

这个是面试经常会问到的,也是我们小伙伴在工作的过程经常用的,一般小公司,不会有什么问题,但数据量多的时候,你的操作方式不对,你的绩效就会被扣哦,哈哈。

到此这篇关于 Redis遍历海量数据的实现示例的文章就介绍到这了,更多相关 Redis遍历海量数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis与mongodb的区别总结

    redis与mongodb的区别总结

    在本篇文章里小编给大家分享的是关于redis与mongodb的区别的相关知识点内容,有需要的朋友们参考下。
    2019-06-06
  • Redis的使用模式之计数器模式实例

    Redis的使用模式之计数器模式实例

    这篇文章主要介绍了Redis的使用模式之计数器模式实例,本文讲解了汇总计数器、按时间汇总的计数器、速度控制、使用 Hash 数据类型维护大量计数器等内容,需要的朋友可以参考下
    2015-03-03
  • 使用Redis实现实时排行榜功能

    使用Redis实现实时排行榜功能

    排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。接下来通过本文给大家介绍使用Redis实现实时排行榜功能,需要的朋友可以参考下
    2021-07-07
  • Redis 内存碎片原因及清理

    Redis 内存碎片原因及清理

    内存碎片是指在内存分配的时候,产生的不能重复利用的空间,本文主要介绍了Redis 内存碎片原因及清理,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Redis实战记录之限制操作频率

    Redis实战记录之限制操作频率

    这篇文章主要给大家介绍了关于Redis实战记录之限制操作频率的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • 浅谈redis在项目中的应用

    浅谈redis在项目中的应用

    下面小编就为大家带来一篇浅谈redis在项目中的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Redis实现多人多聊天室功能

    Redis实现多人多聊天室功能

    这篇文章主要为大家详细介绍了Redis实现多人多聊天室功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • redis list类型命令的实现

    redis list类型命令的实现

    本文主要介绍了redis list类型命令的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Redis GEO地理信息定位功能

    Redis GEO地理信息定位功能

    Redis 提供了GEO地理信息定位功能,地理空间项(经度、纬度、名称),实现查找附近的人、上班打卡、自行车租赁、摇一摇等相关与地理位置信息的功能,这篇文章主要介绍了Redis GEO地理信息定位功能,需要的朋友可以参考下
    2023-12-12
  • 使用Redis实现秒杀功能的简单方法

    使用Redis实现秒杀功能的简单方法

    这篇文章主要给大家介绍了关于使用Redis实现秒杀功能的简单方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论