踩坑记录 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

智能推荐

️创意网页:经典透明登录页面(好看易学易用)_透明网页-程序员宅基地

这篇文章介绍了如何使用HTML和CSS创建一个漂亮的透明登录页面,包括设置布局、字体、颜色和背景等。可以根据需要进行修改和扩展。

android 固定大小填充图片大小,java – Android ImageView – 填充宽度和调整大小以保持宽高比...-程序员宅基地

文章浏览阅读167次。我有一个View View,我在ListView中使用.此RowView由左侧的ImageView和水平LinearLayout右侧的TextView组成,其中图像占40%的空间,文本占剩余的60%.我希望布局以下列方式处理ImageView中图像的大小调整:>水平拉伸图像,使其占据LinearLayout的40%>垂直调整ImageView的大小以保持原始高宽比这是我对布局的方法:p..._imageview 设置大小 java

Excel和Python求解线性规划问题_为啥python求出的指派问题和excel求出的值不一样-程序员宅基地

文章浏览阅读863次,点赞2次,收藏7次。文章目录一、线性规划的基本思想二、Excel求解线性规划三、Python 编程实现【scipy库】四、参考????一、线性规划的基本思想为求解决策变量,需要将目标函数、约束条件表达为决策变量的函数式,若约束条件和目标函数都是线性的,即表示約束条件的数学式子都是线性等式或线性不等式,表示问题最优化指标的目标函数都昌线性函数,则该问题就是线性规划的问题。例:已知 {x≤0x+2y≥0x−2y+4≥0\left\{\begin{aligned} x\leq 0 \\ x+2y \geq 0 \\ x-2_为啥python求出的指派问题和excel求出的值不一样

解决跨域问题的java工具类_java第三方跨域工具类-程序员宅基地

文章浏览阅读249次。import org.apache.juli.logging.Log;import org.apache.juli.logging.LogFactory;import org.apache.tomcat.util.res.StringManager;import org.springframework.core.Ordered;import org.springframework.cor..._java第三方跨域工具类

_Container_base12-程序员宅基地

文章浏览阅读3.1k次。_Container_base12当看到list的源码的时候发现顶层还有这个东东,就在这里也记录一下文件中的位置#include <xutility>大致结构//listnod继承的类型在这里定义的typedef _Container_base12 _Container_base;typedef _Iterator_base12 _Iterator_base;//...__container_base12

Matlab极坐标系(Polarplot)常用设置_matlab 极坐标-程序员宅基地

文章浏览阅读4w次,点赞70次,收藏277次。记录程序人生环境:Win 10最近找关于matlab中极坐标旋转的设置方法,发现网上大多方法都不太实用。这里整理了关于polarplot的相关设置以及对极坐标刻度进行旋转的实用方法。具体步骤:1 . 新建极坐标系polarplot(theta, rho) % theta表示的角度,rho是对应的半径。例:theta= -2*pi:0.001:2*pi;A=1-sin(theta);polarplot(theta,A,'b')2 . 设置极坐标系字体大小p_matlab 极坐标

随便推点

mac c语言 可视化,mac安装Redis可视化工具-Redis Desktop Manager-程序员宅基地

文章浏览阅读311次。Redis是一个超精简的基于内存的键值对数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库。不过它公自带一个最小化的命令行式的数据库管理工具,有时侯使用起来并不方便。不过Github上面已经有了很多图形化的管理工具,而且都针对REDIS做了一些优化,如自动折叠带schema的key等。Redis Desktop Manager一款基于Qt5的跨平台Re..._mac rdm

实习周记-day6_实习周记博客园-程序员宅基地

文章浏览阅读206次。今天分析了一下项目结构,4个大模块,一个主要通信模块,一个底层处理模块,一个ui模块,一个自动化测试模块,看了通讯模块,最主要就是core跟rest小模块,理解项目最主要先看通调用过程,可以先用测试模块debug来查看调用过程,测试入口可能跟实际rest入口不同,但是可以很好的理解实际请求处理流程,看完处理流程再找入口就简单多了,每个人理解项目的方法不同,但是都是有一些通用技巧的。除了看项目之外,每日的排核酸真心累,打底一小时..._实习周记博客园

Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)...-程序员宅基地

文章浏览阅读124次。ORACLE集群概念和原理(二)概述:写下本文档的初衷和动力,来源于上篇的《oracle基本操作手册》。oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总。然后形成体系的总结,一则进行回顾复习,另则便于查询使用。本图文文档亦源于此。阅读Oracle RAC安装与使用教程前,笔者先对这篇文章整体构思和形成进行梳理。由于阅读者知识储备层次不同,我将从Oracle RAC安装..._集群darts

【vue设计与实现】渲染器 1-渲染器与相应系统的结合&渲染器基本概念_innerhtml和渲染器-程序员宅基地

文章浏览阅读354次。由于首次渲染时已经把oldVnode渲染到container内了,所以再次调用renderer.render函数并尝试渲染newVnode的时候,就不能简单的执行挂载动作了。这里,先暂时将渲染器限定在DOM平台,既然渲染器用来渲染真实DOM元素,那么严格来说,下面的函数就是一个合格的渲染器。渲染器就是用来执行渲染任务的,渲染器不仅能够渲染真是DOM元素,还是框架跨平台能力的关键。关于这里为什么用了一个createRender的函数,其实渲染器和渲染的概念是不同的,这就是响应系统和渲染器之间的关系。..._innerhtml和渲染器

GO语言学习之路10_golang replace -1-程序员宅基地

文章浏览阅读122次。2022/02/01package mainimport ( "fmt" "strconv" "strings")//1.字符串中常用的系统函数func main() { //*** 1.1 统计字符串的长度,按字节 len(str) str1 := "hello中国" //utf-8 ASCII字符占一个字节 一个汉字占三个字节 fmt.Println("str len = ", len(str1)) // 11 //*** 1._golang replace -1

【硬件设计】模拟电子基础三--集成运算放大电路_设计一个集成运算放大器-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏46次。本篇讲述集成运算放大电路的原理以及运用_设计一个集成运算放大器