一个问题引发的「血案」

曾经发生过这样一件事,我们的 Redis 服务器存储了海量的数据,其中登录用户信息是以 user_token_id 的形式存储的。运营人员想要当前所有的用户登录信息,然后悲剧就发生了:因为我们的工程师使用了 keys user_token_* 来查询对应的用户,结果导致 Redis 假死不可用,以至于影响到线上的其他业务接连发生问题,然后就收到了一堆的系统预警短信。并且这个假死的时间是和存储的数据成正比的,数据量越大假死的时间就越长,导致的故障时间也越长。

那如何避免这个问题呢?

问题的解决方案

在 Redis 2.8 之前,我们只能使用 keys 命令来查询我们想要的数据,但这个命令存在两个缺点:

  1. 此命令没有分页功能,我们只能一次性查询出所有符合条件的 key 值,如果查询结果非常巨大,那么得到的输出信息也会非常多;
  2. keys 命令是遍历查询,因此它的查询时间复杂度是 o(n),所以数据量越大查询时间就越长。

然而,比较幸运的是在 Redis 2.8 时推出了 Scan,解决了我们这些问题,下面来看 Scan 的具体使用。

Scan 命令使用

我们先来模拟海量数据,使用 Pipeline 添加 10w 条数据,Java 代码实现如下:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import utils.JedisUtils;public class ScanExample {public static void main(String[] args)

游标迭代器(过滤器)——Scan相关推荐

  1. redis之十五(游标迭代器(过滤器)——Scan)

    一个问题引发的「血案」 曾经发生过这样一件事,我们的 Redis 服务器存储了海量的数据,其中登录用户信息是以 user_token_id 的形式存储的.运营人员想要当前所有的用户登录信息,然后悲剧就 ...

  2. Redis都不懂?就别去面试了!聊聊我的Redis新专栏「视频版」

    前不久,有一个读者在后台留言,说他面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis ,他都差点都忘记了自己应聘的是 Java 工程师了.而然这种现象在现在的后端面试中很常见, ...

  3. 你技术很强但薪资不涨?这门技术远比你想的更重要!

    前不久,有一个读者在后台留言,说他面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis 的,他都差点都忘记了自己应聘的是 Java 工程师了.而然这种现象在现在的后端面试中很常见 ...

  4. 千万不要好奇 Redis 的宝藏功能

    Redis 从 2009 年发展到现在,已经被国内外几乎全部公司所使用,国内的 BATJ.新浪微博.360.小米:国外的微软.Twitter.Stack Overflow.Github.暴雪等公司都在 ...

  5. hbase建表,删表,修改,查询(get,scan,布隆过滤器)

    建表 直接建表: create '表名','列族名' 如果之后想加入新的列族: alter '表名','列族名' 补充: alter '表名',{NAME='列族名',属性1=>属性值 1,属性 ...

  6. java redis keys_jedis keys和scan操作

    KEYS pattern 查找所有符合给定模式 pattern 的 key . KEYS * 匹配数据库中所有 key . KEYS h?llo 匹配 hello , hallo 和 hxllo 等. ...

  7. 迭代器模式源码解析(jdk+mybatis)

    自己实现的数据结构,迭代器在源码中的一些应用,java.util.Iterator接口,/*** An iterator over a collection. {@code Iterator} tak ...

  8. Hbaseshell scan多种过滤操作

    查询数据 get 'bjcjtest1_hdrive_2000',"\x00\x80\x03\x8D\x96\xA9\xDCO\xB6"scan 'tts_201905',{STA ...

  9. 采坑记录-Redis使用scan代替keys

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! spark代码案例地址: https://github.com/Mydreaman ...

最新文章

  1. R语言dplyr包将dataframe中的NA值替换(replace)为0实战:所有NA值替换(replace)为0、具体列的NA值替换(replace)为0、若干列的NA值替换(replace)为0
  2. 人工智能基础-机器学习任务之常规解决的六大问题
  3. Oracle存储过程中异常Exception的捕捉和处理
  4. OSChina 周六乱弹 —— 这辈子最丢脸的事
  5. yum安装与源码编译安装实际使用区别
  6. queryList爬虫获取内容的几种方法总结 queryList给抓取的内容增加html追加元素html 代码实例...
  7. gitlab备份及恢复
  8. 加密安装Kli Linux
  9. Chrome插件(扩展)
  10. 菜刀php教程,Weevely(php菜刀)工具使用详解
  11. mysql中的存储机制_Mysql的存储引擎
  12. 2012中国移动社交游戏市场盈利模式探讨
  13. 中国雅虎殒身记:当初说好的独立上市呢?
  14. 回归分析-线性回归-检验-模型
  15. JAVA实现Excel照相机功能_用Excel照相机功能在Excel中显示和调用图片的方法
  16. BZOJ_P3110 [ZJOI2013]K大数查询(线段树+整体二分)
  17. ubuntu 下安装java_Ubuntu下安装java
  18. Java项目:SSM实现的一个在线文具学习用品购买商城网站
  19. 镭速传输安全设计第三篇:传输安全设计
  20. 如何成为用户真正需要的短信验证平台

热门文章

  1. 修改tomcat服务器图标,修改tomcat小猫图标,设置项目的favicon图标
  2. Linux创始人数据结构,Linux 通用数据结构说明
  3. Angular之ngx-permissions的角色管理
  4. 计算机技术与软件专业技术资格(水平)考试 全国各省市成绩查询
  5. linux I/O 栈 预习(上)
  6. cf375D. Tree and Queries(莫队)
  7. destoon b2b 360网站智能摘要标签配置
  8. [转载]使用awk进行数字计算,保留指定位小数
  9. Linux 服务器中文乱码编码解决
  10. perl anyevent socket监控web日志server