当前位置:硬件测评 > 【第102期】如何正确访问Redis中的海量数据?服务不会下降!

【第102期】如何正确访问Redis中的海量数据?服务不会下降!

  • 发布:2023-10-04 10:33

2022年5月17日下午3:49 • 面试问题 • 阅读 1 点击上方“Java面试题精选”,关注公众号 面试时画图,查漏补缺 >>番外:往期面试题,10个为单位放在这个公众号菜单栏->面试题,有需要的欢迎阅读 阶段总结合集:++小旗实现、百道面试题总结++ 目录 前言 发生意外 分析原因 解决方案 总结 前言 有时候我们需要在线了解Redis的使用情况,尤其是一些前缀的键值。我们如何检查它?今天老顾分享一个小知识点 发生意外 因为我们的用户token缓存使用[user_token:userid]格式的key来保存用户的token值。为了帮助我们的开发伙伴,我们的运维团队可以查看有多少登录用户在线。 我直接使用keys user_token*方法去查询,结果就发生了意外。导致redis不可用,假死。 分析原因 我们在线登录用户数百万,数据量比较大; key算法是一种遍历算法,复杂度为O(n)。也就是说,数据越多,时间复杂度越高。 如果数据量达到几百万,keys指令会导致Redis服务冻结,因为Redis是单线程程序,顺序执行所有指令,其他指令必须等到当前keys指令执行完毕后才能继续。 解决方案 那么我们如何遍历大量数据呢?这也是面试中经常被问到的。我们可以使用redis的另一个命令,scan。我们先来看看扫描的特点 虽然复杂度也是O(n),但是是通过游标一步步执行的,不会阻塞线程。 提供count参数,不是结果数,而是redis单次遍历的字典槽数(约等于) 与按键一样,它也提供模式匹配功能; 服务器不需要保存游标的状态。游标的唯一状态是scan返回给客户端的游标整数; 返回的结果可能重复,客户端需要重复。这个非常重要; 单次返回结果为空并不意味着遍历结束,而是取决于返回的游标值是否为零。 1. 扫描命令格式 SCAN 光标 [MATCH 模式] [COUNT 计数] 2、命令解释:扫描游标 MATCH <返回和给定模式相匹配的元素> count 每次迭代返回的元素数量SCAN命令是一个增量循环,每次调用只会返回少量元素。所以redis是不允许假死的 SCAN命令返回一个从0开始遍历到0结束的游标 3. 例子 redis > 扫描 0 匹配 user_token* 计数 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,返回数据。要继续扫描遍历,必须从6开始。 redis > 扫描 6 匹配 user_token* 计数 5 1) "10" 2) 1) "user_token:3100" 2) "user_token:1201" 3) "user_token:1410" 4) "user_token:5300" 5) "user_token:3389 ” 总结 这是面试中经常被问到的,也是我们朋友在工作过程中经常用到的。一般小公司不会有问题,但是当数据量很大的时候,你的操作方法不对,你的性能就会受到影响。妈的,哈哈。谢谢! ! ! 本文来源:www.sychzs.cn/i6697540366528152077 而不是在网上搜索问题?还不赶快关注我们吧~ 版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。 本文由斑马博客整理。本文链接为:https://www.sychzs.cn/index.php/post/6957.html

相关文章

最新资讯