首页 > 数据库 >面试官:如何遍历 Redis 中的海量数据?

面试官:如何遍历 Redis 中的海量数据?

时间:2023-08-28 11:57:13浏览次数:58  
标签:面试官 遍历 scan redis Redis 游标 token user

来源:https://www.toutiao.com/article/6697540366528152077/

前言

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

事故产生

因为我们的用户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、单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零

推荐一个开源免费的 Spring Boot 实战项目:

https://github.com/javastacks/spring-boot-best-practice

一、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"

总结

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

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

标签:面试官,遍历,scan,redis,Redis,游标,token,user
From: https://www.cnblogs.com/javastack/p/17661914.html

相关文章

  • 服务启动连接redis报错问题
    报错截图如下1,该报错为redis认证问题,也就是需要redis登录密码,需要在配置文件redis配置中,需填写密码2,对于redis的修改有一下操作 2.1,关闭redis的保护模式:打开redis的配置文件,redis.conf文件,找到protected-mode,改成no, 2.2,设置redis密码,requirepass***  到redis的......
  • Redis中文乱码解决方案
    问题描述刚开始学Redis,当我存入中文并想要读取时发现控制台上显示的是乱码......
  • Redis集群
     Redis集群一、Redis集群Redis集群是一种使用分布式技术将数据分散存储在多个节点上的解决方案。它可以提供高可用性、扩展性和性能的优势。Redis集群通过分片(Sharding)来存储数据。数据被平均分配到多个节点上,每个节点负责存储一部分数据。这样可以将负载分散到多个节点上,......
  • Docker安装redis、redis设置密码、挂载配置文件并以配置文件方式启动(避坑)
    1.拉取redis镜像:拉取最新版:dockerpullredis拉取指定版本,以6.2.7为例:dockerpullredis:6.2.72.在Linux环境中创建需要挂载的目录mkdir/usr/local/software/redis/6379/confmkdir/usr/local/software/redis/6379/datamkdir/usr/local/software/redis/6379/log3......
  • Redis存取多维对象或数组
    最近阅读tp5的底层类的实现,看到了大神的Redis类的实现,觉得非常的简洁明了,而且统一了所有的get,set,在更新一下,非常值得参考/***读取缓存*@accesspublic*@paramstring$name缓存变量名*@parammixed$default默认值*@returnmixed......
  • 二叉树层序遍历队列实现
    参考:二叉树的层序遍历(两种方法实现)_askunix_hjh的博客-CSDN博客题解|#求二叉树的层序遍历#_牛客博客(nowcoder.net)题解二:BFS(迭代)主要思路:广度优先8.27用到的思路是广度优先,循环,不是递归......
  • Redis哨兵
    哨兵的作用和原理Redis提供了哨兵机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:监控:sentinel会不断检查你的master和slave是否按预期工作自动故障恢复:如果master故障,sentinel会将一个slave提升位master。当故障实例恢复后也以新的master为主通知:sentinel充当redi......
  • Shell 遍历文件夹
    例11#!/bin/bash2read_dir(){3a=04declare-aarr5forfilein`ls$1`6do7a=$a+18if[-d$1"/"$file]9then10arr[$a]=$1"/"$file11echo$1"/"$file12fi13done1......
  • Redis集群
    Redis主从集群主从复制模式就是,部署多台redis节点,其中只有一台节点是主节点(master),其他的节点都是从节点(slave),也叫备份节点(replica)。只有master节点提供数据的事务性操作(增删改),slave节点只提供读操作。所有slave节点的数据都是从master节点同步过来的。该模式的架构图如下:共包含......
  • 架构师必读:揭秘Redis五大数据类型及超实用应用场景!
    大家好,我是你们的小米!今天我们要来聊聊一个在面试中经常被问到的话题:Redis的五种数据类型及其应用场景。作为一名热爱技术的小伙伴,对于这个话题,我们可是要深入挖掘一下哦!String(字符串)String(字符串)类型是Redis最简单的数据类型之一,它不仅可以存储字符串,还可以存储整数和浮点数。在......