Redis Scan 命令

文章目录

  • 1. Scan 命令的基本用法
    • 1.1 Scan 命令的输入值
    • 1.2 Scan 命令的返回值
  • 2. Scan 命令与 Keys 命令比较
    • 2.1 Keys 命令的缺点
    • 2.2 Scan 命令的优点
  • 3. Scan 命令的限制
    • 3.1 有限保证原则
    • 3.2 返回的结果有可能会重复

1. Scan 命令的基本用法

Scan 命令是一个基于游标的迭代器:Scan 命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 Scan 命令的游标参数,以此来延续之前的迭代过程。

当 Scan 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当服务器向用户返回值为 0 的 游标时,表示迭代已经结束。

1.1 Scan 命令的输入值

Scan 命令的语法为:

SCAN cursor [MATCH pattern] [COUNT count] (The default COUNT value is 10)

举例:当需要查找以 keyA 开头的 key 值时,可以使用如下命令进行开始:

SCAN 0 match keyA* count 20

注意,上面的 0 代表第一次遍历,20 是限定服务器单次遍历的字典槽位数量。

1.2 Scan 命令的返回值

Scan 命令的返回值是一个包含两个元素的数组,第一个数组元素是用于下一次迭代的新游标,而第二个数组元素则是一个数组,这个数组中包含了所有被迭代的元素。

以 0 作为游标开始一次新的迭代,一直调用 Scan 命令,直到命令返回游标 0,这个过程称之为一次完整遍历。

2. Scan 命令与 Keys 命令比较

2.1 Keys 命令的缺点

  • 没有限制返回结果的参数。由于 Keys 命令只能一次性获取所有符合匹配规则的 key,所以没办法限制返回的结果数量。
  • keys 命令是遍历来实现的,时间复杂度是 O(N)

所以结合以上两个缺点,再加上 Redis单线程 的这个性质,在结果集数量非常大时,会造成 Redis 进程被阻塞,导致 Redis 服务卡顿。

2.2 Scan 命令的优点

  • Scan 命令提供了 limit 参数, 可以限制返回的结果数量。
  • Scan 命令时间复杂度也为 O(N),但是它是分次进行的,即不会阻塞进程。

所以结合以上两个优点, Scan 命令不会导致 Redis 服务卡顿。

3. Scan 命令的限制

3.1 有限保证原则

Scan 命令可以保证:

从完整遍历开始直到完整遍历结束期间,一直存在于数据集内的所有元素都会被完整遍历返回,但是同一个元素可能会被返回多次。如果一个元素是在遍历过程中被添加到数据集或者从数据集中被删除,那么这个元素可能被返回,也可能不被返回。

3.2 返回的结果有可能会重复

Scan 命令每次返回的结果有可能会重复,所以要在应用层进行去重处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MybatisPlus 的 MetaObjectHandler 与 @TableLogic

文章目录1.MetaObjectHandler 实现公共字段自动填充功能1.1 日常开发中的公共字段1.2 Mybatis Plus 中的解决方案1.3 用法1.3.1 定义公共字段超类,并在字段上添加注解1.3.2 实现 MetaObjectHandler 接口2. Mybatis Plus 实现逻辑删除2.1 目前的逻辑删除2.2 Mybatis Plus 提供的…

红黑树 —— 原理和算法详细介绍

红黑树 —— 原理和算法详细介绍 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 红黑树的特性: 每个节点或…

微服务雪崩效应与 Hystrix

文章目录微服务雪崩效应微服务中常见的容错方案常见的服务容错思路Hystrix 简介微服务雪崩效应 微服务系统中, 每一个服务专心于自己的业务逻辑, 并对外提供相应的接口, 看上去似乎耦合度比较低, 但经常会遇见这样一种场景: 可以看到, 当 C 服务挂掉时, B 服务还在不断地调用…

MySQL count(1) , count(*), count(列名) 的异同

count 函数主要用于统计行数,我们一般会用 count(1) , count(*), count(列名) 来统计行数,但是这三者之间有什么差距呢? 异同 当 count(列名) 在列名不是主键列的情况下,将只统计该列的非空行数,效率也最低下;当 count(列名) 在列名为主键列,且在没有非聚集索引的情况下,三者…

时间复杂度到底怎么算

时间复杂度到底怎么算 算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡…

Java 异常种类及处理方法

概述 异常的基类是 Throwable, Throwable 有两个子类: Exception : 表示可以恢复的异常, 编译器可以捕捉。Error : 表示编译时和系统错误, 表示系统在运行期间出现了严重的错误, 属于不可恢复的错误。 受检异常和非受检异常 受检异常指的是在编译期间会接受编译器检查, 且必…

十分钟搞定时间复杂度(算法的时间复杂度)

十分钟搞定时间复杂度(算法的时间复杂度) 我们假设计算机运行一行基础代码需要执行一次运算。 int aFunc(void) {printf("Hello, World!\n"); // 需要执行 1 次return 0; // 需要执行 1 次 }那么上面这个方法需要执行 2 次运算 …

Java 父子类加载顺序

现在有一个Parent类和一个Son类, 代码分别如下: public class Parent {static {System.out.println(" order 0");}private static String s init();{System.out.println(" order 3");}public Parent() {System.out.println(" order 4");}publi…

java实现简单二叉树

二叉树基本知识: 一、树的定义 树是一种数据结构,它是由n(n>1)个有限结点组成一个具有层次关系的集合。 树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有…

HashMap 学习笔记

1.HashMap 的类继承关系 图示即为 Map 相关类的继承关系。源码中的类签名如下: public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {...... }2.HashMap 的底层存储结构 HashMap 的底层存储结构是 Node 类,…

MySQL中清空表和截断表的区别(新手入门)

清空表和截断表 清空表&#xff1a;delete from users&#xff1b; 清空表只是清空表中的逻辑数据&#xff0c;但是物理数据不清除&#xff0c;如主键值、索引等不被清除&#xff0c;还是原来的值。 截断表&#xff1a;truncate table users&#xff1b; 截断表可以用于删除…

终止线程的方法

如何终止一个正在运行的线程&#xff1f; 设置状态位来终止一个正在运行的线程。可以自己实现, 也可以使用 interrupt 方法来设置这个状态位, 然后在代码中判断 isInterrupted 的返回结果来执行退出执行的逻辑。 了解 Thread 类中的 stop、interrupt 方法吗?为什么不用 stop…

十大经典排序算法动画与解析(配代码完全版)

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。 常见的内部排序算法有&…

服务启动不了,显示 config 异常的问题排查

文章目录问题详情排查过程1.1 查看配置文件是否可以正常加载1.2 进入 config 服务正在运行的容器, 查看文件是否存在1.3 查看容器运行日志:最后发现是配置文件中多了一个 TAB 符,唉,说多了都是泪!问题详情 出现异常报错: Could not locate PropertySource and the fail fast p…

java使用Socket类接收和发送数据

java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分&#xff0c;而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上&#xff0c;并且可以和服务器互相发送和接受数据。在本文及后面的数篇文章中将详细讨论Socket类的使用&a…

Docker Swarm compose 文件 depends_on 属性

Swarm 部署时候如果需要管理应用之间的启动先后顺序,则可以使用 services.depends_on 属性进行指定,例如 services:eureka-service:......depends_on:- config-service......

Java 单例模式:懒加载(延迟加载)和即时加载

Java 单例模式&#xff1a;懒加载&#xff08;延迟加载&#xff09;和即时加载 引言 在开发中&#xff0c;如果某个实例的创建需要消耗很多系统资源&#xff0c;那么我们通常会使用惰性加载机制&#xff08;或懒加载、延时加载&#xff09;&#xff0c;也就是说只有当使用到这…

递推算法之滚动数组思维方式

概述 在算法的最终结果只用到本层与上一层的结果时&#xff0c; 可以使用滚动数组思想。 简单的理解就是每次都使用固定的几个存储空间达到压缩节省存储空间的作用&#xff0c; 主要用在递推算法中。示例1&#xff1a; 爬楼梯问题 假设你正在爬楼梯。需要 n 阶你才能到达楼顶…

Java创建并执行线程的四种方法

Java创建并执行线程的四种方法 java里面创建线程有四种方式&#xff1a; 无返回&#xff1a; 实现Runnable接口&#xff0c;重写run();继承Thread类&#xff0c;重写run(); 有返回&#xff1a;实现Callable接口&#xff0c;重写call(),利用FutureTask包装Callable&#xff0c…

idea中svn的更新、检出、提交操作

一、首先集成svn到idea 点击号连接svn仓库地址 等待代码下载完毕后就可以对代码进行update,commit操作了 更新操作方法一:项目上右键 方法二:点击快捷图标 方法三: 代码提交 方法一 方法二: 方法三: 会跳出窗口: 然后点击Commit 如果检测代码有错误会询问你是否要处理,一般确定…