踩坑记录 PHP实现 Redis使用SCAN 和 SSCAN(不要用scan!!!!!)_php redis scan-程序员宅基地

技术标签: smembers  scan  PHP  Redis  php  sscan  redis  

补充一下,前一段时间因为项目中使用keys导致redis卡死,于是在网上搜索解决方法,基本都是使用scan替代keys命令。然后就上线了scan替代keys。。。然后就踩坑了

结果就是redis的cpu飙升,scan操作同样是扫描表操作,会导致cpu飙高,也同样会阻塞请求

scan和keys的区别在于:keys是全表扫描,会导致阻塞,scan类似分页扫描表,通过游标接着往下扫,所以扫的数据比keys少,

相对于keys比较不容易阻塞,但不代表它不会导致阻塞,如果key数量很多,快速连续调用 SCAN,那么对 CPU 的压力会增大,会造成cpu飙升,有性能问题。

所以keys和scan在生产环境都应该禁用,最后的解决方法还是记录缓存的key,然后直接获取key。

测试环境之所以redis使用keys和scan命令没有性能问题,是因为测试环境的的key数量很少,就算整体扫描也不会有问题,所以就是:

1、缓存key时设定过期时间,这样redis就不会有大量的未失效的key

2、线上禁止使用keys和scan

下面的就不用看了 总之keys不能用,scan也不能用!!!!!!

PHP实现 Redis使用SCAN 和 SSCAN

因为大家都知道的原因(线上禁止使用keys smembers 命令

所以用了scan 和 sscan命令获取redis中的值

取出来的数据记得去重


//使用scan匹配all key
    function scanAllForMatch($pattern, $cursor=null, $results=[]) {

        if ($cursor === "0") {
            return $results;
        }

        if ($cursor === null) {
            $cursor = "0";
        }

        $redis = Cache::getRedis();
        list($cursor, $result) = $redis->scan($cursor, 'match', $pattern, 'count', 1000);

        $results = array_merge($results, $result);

        return scanAllForMatch($pattern, $cursor, $results);

    }

//使用sscan匹配 set 集合中 all key
    function setScanAllForMatch($key, $pattern='*', $cursor=null, $count = 3000, $results=[]) {

        if ($cursor === "0") {
            return $results;
        }

        if ($cursor === null) {
            $cursor = "0";
        }

        $redis = Cache::getRedis();
        list($cursor, $result) = $redis->sscan($key, $cursor, 'match', $pattern, 'count', $count);

        $results = array_merge($results, $result);


        return setScanAllForMatch($key, $pattern, $cursor, $count, $results);

    }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ljwaheng/article/details/113745434

智能推荐

MLPerf最新AI芯片跑分:谷歌TPU和英伟达打破记录_tpu 芯片-程序员宅基地

文章浏览阅读1k次。智东西7月11日消息,昨日,MLPerf基准联盟公布了最新一轮的基准测试数据,结果显示,英伟达和谷歌云刷新了人工智能训练时间的记录。MLPerf是一项用于测试ML(Machine Learning)硬件、软件以及服务的训练和推理性能的公开基准。它能帮助人工智能研究人员采用通用标准来衡量用于训练人工智能的硬件、软件的最佳性能和速度。目前,MLPerf基准测试正迅速成为测量机器学习性能的行业标..._tpu 芯片

JSP 技术练习题_jsp隐式对象out可以通过response.getwriter()方式获取,然后再通过printl-程序员宅基地

文章浏览阅读7.8k次,点赞9次,收藏66次。JSP隐式对象:(1) out 用于页面输出 (2) request 得到用户请求信息 (3) response 服务器向客户端回应信息 (4) config 服务器配置,可以取得初始化参数 (5) session 用来保存用户的信息 (6) application 所有用户的共享信息 (7) page 指当前页面转换后的Servlet类的实例 (8) pageContext JSP的页面容器 (9) exception 表示JSP页面所发生的异常,在错误页中才起作用。......_jsp隐式对象out可以通过response.getwriter()方式获取,然后再通过println()或者wr

window10下载地址-程序员宅基地

文章浏览阅读603次。window10下载地址_window10下载

拥抱你的zsh,Linux下速通zsh&oh-my-zsh配置(附常用插件&主题)_oh my sh 绿色主题-程序员宅基地

文章浏览阅读893次,点赞2次,收藏4次。zsh&oh-my-zsh配置为什么要使用zsh?功能强大插件丰富酷炫的主题对bash完全兼容,这意味着与bash语法一致功能更“健全”的Tab补全代码高亮…相信你在阅读完本文以及用上zsh一段时间过后之后(可能并不需要很久),能对以上几点有所体会。oh-my-zsh是什么?oh-my-zsh是github下一个社区驱动的开源项目,目前在github已有136k的star数,通过oh-my-zsh,你能更轻易地进行配置zsh以及对zsh插件的管理。上手使用zsh&_oh my sh 绿色主题

PyQt5基本控件详解之QMenuBar(二十四)_qt qmenubar-程序员宅基地

文章浏览阅读1.9w次,点赞9次,收藏58次。QMenuBar前言 在QMainWindow对象的标题栏下方,水平的QMenuBar被保留显示QMenu对象 QMenuBar类提供了一个可以包含一个或多个QAction对象或 级联的QMenu对象,要创建一个弹出菜单,Pyqt提供了createPopupMenu()函数,menuBar()函数用于返回主窗口的QMenuBar对象:addMenu()函数可以将菜单添加到菜..._qt qmenubar

浅谈Linux的locale,LC_ALL和LANG_lc——time-程序员宅基地

文章浏览阅读4.4k次。如果你是一个Linux新手,并且刚刚安装了一个新的英文系统但想要设置成中文系统,肯定会接触到上面几个变量,在网上搜索了一系列解决方法,给一些变量赋一下值,再export一下,或者写到配置文件里面,然后就搞定了,但究竟为什么要这样做,可能还是一知半解。通过这两天自己对网上看到的一些文章的整理和自己的试验,在这里记录一下自己的理解。一、什么是localelocale这个单词中文翻译成地_lc——time

随便推点

python SMTP邮件发送-程序员宅基地

文章浏览阅读340次。本例使用的时python2.7环境,python3的操作应该也是差不多的。需要用到smtplib和email两个包。发送文本类型的邮件下面看个发送文本邮件的例子(使用网易163的SMTP):# -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMETextfrom email.header import..._smtp_obj.quit()

Mysql区分大小写(大小写敏感)配置_dbms: mysql (版本 8.0.32) 区分大小写: 普通形式=lower,分隔形式=low-程序员宅基地

文章浏览阅读6.4w次,点赞11次,收藏43次。Linux下mysql默认区分大小写Windows下mysql默认不区分大小写查看是否区分大小写show variables like 'lower%'lower_case_table_names参数详解: lower_case_table_names = 0 其中 0:区分大小写,1:不区分大小写 MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:    1、数据库名与表名是..._dbms: mysql (版本 8.0.32) 区分大小写: 普通形式=lower,分隔形式=lower 驱动程序

(学习笔记)matplotlib.pyplot模块下基本画图函数的整理_plt模块-程序员宅基地

文章浏览阅读765次。matplotlib基本函数整理_plt模块

java网络编程Socket中SO_LINGER选项的用法解读_socket.setlinger-程序员宅基地

文章浏览阅读1.3k次。1:设置该选项: public void setSoLinger(boolean on, int seconds) throws SocketException; 读取该选项:public int getSoLinger() throws SocketException SO_LINGER选项用来控制Socket关闭时的行为,默认情况下,执行Socket的close_socket.setlinger

vue.config.js中配置proxy代理https-程序员宅基地

文章浏览阅读5.7k次。一、参考https://www.cnblogs.com/roland-sky/p/12916645.htmlvue.config.js 配置devServer: { // 如果改动node_modules内的代码, 不会触发热重载, 则取消下面的注释 // watchOptions: { // ignored: [] // }, proxy: { '^/api/': { target: 'http://localhost:8060', cha_config.js中配置proxy

计算机网络----TCP如何实现可靠传输(超时重传、滑动窗口、流量控制、拥塞避免)_4.可靠传输的实现;滑动窗口+超时重传-程序员宅基地

文章浏览阅读588次。文章目录以字节为单位的滑动窗口技术如何滑动如何保证可靠重传超时重传流量控制网络拥塞慢开始和拥塞避免算法:(有的版本已经不用了)快重传传输连接管理停止等待协议窗口技术(连续的ARQ协议)累计确认以字节为单位的滑动窗口技术如何滑动接收端发送确认号为7发送端没收到确认不能删发送端收到确认,窗口后移,发送端删除- 副本接收端窗口后移,应用程序读取数据(临时文件)如何保证可靠..._4.可靠传输的实现;滑动窗口+超时重传

推荐文章

热门文章

相关标签