面试高频:如何访问 Redis 中的海量数据?

目录

  1. 前言
  2. 事故产生
  3. 分析原因
  4. 解决方案
  5. 总结

前言

有时候我们需要知道线上的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、单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零

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

总结

这个是面试经常会问到的,也是我们小伙伴在工作的过程经常用的

一般小公司,不会有什么问题,但数据量多的时候,你的操作方式不对,你的绩效就会被扣哦,哈哈。谢谢!!!

作者:老顾聊技术

来源:https://www.toutiao.com/i6697540366528152077 本文版权归作者所有

Image placeholder
Lotus
未设置
  98人点赞

没有讨论,发表一下自己的看法吧

推荐文章
海量数据时代,金融行业数据库实践难题如何解决?

随着数字经济时代的到来,大数据、人工智能技术得到了快速发展与应用,可以说,各行各业都已全情投入到这一波数字化转型浪潮中,把握新的发展机遇,获取数字红利。其中,金融行业可以说是走在转型之路最前沿的行业之

海量数据AtlasDB:把“数据库好用”这件事做到极致

导语:坚守初心、不辱使命,近期海量数据研发的企业级数据库AtlasDB获得了市场的普遍关注。这款以“好用”著称的国产数据库产品,不仅承载着海量数据公司对技术创新的坚持和投入,更凝结着一群拥有“工匠之心

亿级海量数据的实时读写和复杂查询实践

摘要:本文分享了每日亿级增量数据的实时读写、复杂查询场景实践介绍,涉及MySQL分表分库策略、数据异构、TiDB使用和优化、微服务架构等内容。  作者:黄哲铿  黄哲铿,中通商业CTO,前1号店技术总

核心业务“瘦身”进行时!手把手带你搭建海量数据实时处理架构

01背景 在线交易服务平台目的是减轻核心系统计算压力和核心性能负荷压力,通过该平台可以将核心系统的交易数据实时捕获、实时计算加工、计算结果保存于SequoiaDB中。并能实时的为用户提供在线交易查询服

海量数据时代,磁带存储的“涅槃重生”

   磁带作为大规模非结构化数据的战略性/低成本存储手段,已然经历了一次复兴。由于磁带在快速恢复网站和反勒索软件方面具有较高的价值,所以备份仍然是它的一个主要用例。不过,磁带的未来增长机会更在于一些新

如何访问已启动的react项目

如何访问已启动的react项目1、运行react项目都会开启一个终端窗口,只需要打开窗口,查看项目的运行地址即可。上面这个项目的地址是http://localhost:3000/,打开浏览器输入这个地

阿里面试题:如何保证缓存与数据库的双写一致性?

作者:你是我的海啸出处:https://blog.csdn.net/chang384915878/article/details/86756463只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只

【python测试开发栈】帮你总结python random模块高频使用方法

随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑、或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等。这篇文章,就帮大家整理在pyt

【python测试开发栈】帮你总结python time模块高频使用方法

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:time、datetime、calendar,这篇文章主

【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

Java并发基础常见面试题总结 1.什么是线程和进程? 1.1.何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。

面试题:如何理解 Linux 的零拷贝技术?

本文讲解Linux的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux算是比较基础的技术,所以,学好Linux对于云计算的学习会有比较大的帮助。本文借鉴并总结了几种比较常见的Linu

滴滴海量离线数据的在线化 — FastLoad

桔妹导读:滴滴自成立以来,有海量的数据存储在离线平台,离线数据虽然存储便宜,压缩比高,但不适用于线上使用。为此,我们提供了一键式DTS平台——FastLoad,帮助业务往在线存储系统搬运离线数据,目前

解码GaussDB:如何成为世界级数据库?

1、开源GaussDB单机版OLTP;2、成立鲲鹏智能数据产业联盟数据库产业推进组;3、1.5亿元启动基金,发起GaussDB高校金种子发展计划;4、成立十大GaussDB高校联合创新实验室;5、现场

探秘K1 Power:如何打造一台坚若磐石的高性能小型机?

熟悉服务器领域的朋友,必然对浪潮K1小型机或多或少有所了解。在当年关键业务主机市场寡头垄断的格局下,浪潮400多位工程师耗费4年时间,于2010年成功研制出了K1小型机,为市场注入一股新的血液。使得中

专访领英工程副总裁张仁辉:如何驯服算法,打造世界级的职位推荐系统?

大数据文摘出品作者:魏子敏、宋欣仪作为全球最大的职业社交网络,创建于2003年的LinkedIn在过去6年间,从一个7000万左右年营收的企业,增长至30亿美元营业额的企业。五年间LinkedIn业务

Stack Overflow 上 370万浏览量的一个问题:如何比较 Java 的字符串?

在逛StackOverflow的时候,发现了一些访问量像喜马拉雅山一样高的问题,比如说这个:如何比较Java的字符串?访问量足足有370万+,这不得了啊!说明有很多很多的程序员被这个问题困扰过。PS:

谈PaaS平台建设:如何应对企业架构多元异构资源的挑战

据forbes预测,在2020年到来之前,83%的IT资源都会迁移上云。整个云的生态中,PaaS是最具有抽象属性的云形态,落地较晚也迟迟没有形成统一的标准。近几年,随着SaaS层业务的成熟,以及Iaa

清华大学教授马智亮:如何走向高度智慧建造?

什么是智慧建造?普遍意义上的智慧建造是指生物基于神经器官所具有的一种高级的综合能力,包括感知、知识、记忆、理解、联想、情感、逻辑、辨别、计算、分析、判断、文化等多种能力。显然,具备这种能力的生物,首当

职业规划指南:如何开启你的ML/AI 职业生涯?

无论什么行业,只有不断自我进步的人才有可能保持行业领先地位。技术行业面临着时代变迁的时候更应该如此。随着技术和相关业务的发展,在该领域工作的人必须在必要时更新技能甚至转变职业。在人工智能(AI)机器学

深度复盘GitHub发展史:如何在短短10年内改变了人们的编程方式?

前不久,微软以75亿美元的价格收购GitHub,引发了科技行业的关注。在短短的10年内,GitHub改变了人们的编程方式。不仅让编程变得更简单,还改变了软件开发者对编程的看法。GitHub是如何做到的

使用$emit传参:如何同时接收父组件和子组件的参数?

需求描述:组件内部发射事件并且有参数传递出来,然后监听该事件时,事件处理程序又同时需要获取组件外面传进来的参数举个例子:tag-input组件监听change事件 methods:{ ...,

如何在多云环境中管理数据?

在多云环境中建立数据治理策略没有灵丹妙药。在这里,我们将讨论为什么会有这种说法的原因,以及有关多云环境的IT领导者如何思考数据治理的一些方法。数据治理有点像健身:它不仅仅是一个目的,更是一个持续的过程

Go - 如何解析 JSON 数据?

概述最近掉进需求坑了,刚爬上来,评估排期出现了严重问题,下面三张图很符合当时的心境。谈需求估排期开始干为啥会这样,我简单总结了下: 与第三方对接。 跨团队对接。 首次用Go做项目。 业务流程没屡清楚就

InnoDB一棵B+树可以存放多少行数据?

一个问题?InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。我们都

干货满满 | 来自灵魂的拷问-这21道Redis面试题

1、使用redis有哪些好处?速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)支持丰富数据类型,支持string,list,set,sort