【Redis】Redis 通用命令、键的过期策略、渐进式遍历

news2024/11/20 9:04:13

文章目录

  • 一、基础命令
    • SET 和 GET
  • 二、全局命令
    • KEYS
    • EXISTS
    • DEL
    • EXPIRE 和 TTL
    • 经典面试题:Redis 中 key 的过期策略是怎么实现的
    • TYPE
  • 三、渐进式遍历


Redis 有许多种数据结构,但是这些数据结构的 key 的类型都是字符串类型的(所以说,Redis 不同的数据结构都是针对于 value 而言的)。正因如此,对应相同类型的 key 来说,就有一些通用的来操作 Redis 的命令。

一、基础命令

SET 和 GET

SET 和 GET 可以说是 Redis 中最基础也是最核心的两个命令了,Redis 是以键值对的形式来储存数据的,因此对于 Redis 中数据的存取就如同在操作一个哈希表一样。SET的作用就是 把 key 和 value 设置进 Redis,而 GET 则是通过 key 将 value 从 Redis 中取出。

例如下面的操作:

  1. 上述操作中,使用 SET 命令向 Redis 中添加了一个 key 为 key1,value 为 12345 和 key 为 key2,value 为 hello 的两个键值对;
  2. 然后再使用 GET key 这样的语法的命令获取到 key 对应的 value 值。
  3. 如果使用 GET 获取一个不存在的 key 对应的值则会返回 nil(即相当于null)。

注意事项:

通过上述操作可以发现,在 Redis 中 key 和 value 其实都是字符串,但是不需要加上引号。当然如果想要加的话,单引号和双引号都可以。

二、全局命令

Redis 有许多种数据结构,但是这些数据结构的 key 的类型都是字符串类型的(所以说,Redis 不同的数据结构都是针对于 value 而言的)。正因如此,对应相同类型的 key 来说,就有一些全局通用的来操作 Redis 的命令。

KEYS

KEYS 命令的作用是用来查询当前 Redis 服务器上匹配的所有的 key 的,可以通过一些特殊的通配符来描述 key 的模式,然后就可以查询出 Redis 中所有匹配这个模式的 key 。

keys pattern

在 Redis 的官方文档中给出 KEYS 的模式类型如下:


a)? 符号的作用是匹配一个字符

例如:当 pattern 为 h?llo 的时候,就能匹配到如:hellohallohxllo 这样的 key。

b)* 符号的作用是匹配 0 个或多个任意字符

例如:当 pattern 为 h*llo 的时候,就能匹配到如:hlloheeeello 这样的 key。

c)[ae] 符号的意思只匹配 a 或 e 这样的

例如:当 pattern 为 h[ae]llo 的时候,就能匹配到 hallohello,但是不会匹配到 hillo

d)[^e] 符号的意思是匹配非 e 的

例如:当 pattern 为 h[^e]llo 的时候,就不会到 hello,但能匹配到其他的如 hallohbllo 这样的。

f)[a-b] 符号的意思是匹配 a ~ b 之间的
例如:当 pattern 为 h[a-e]llo 的时候,就能匹配到 hallohello 这样的。

关于 KEYS 命令的注意事项:

在实际生产环境中,要谨慎使用命令 keys *,因为这条命令会查询出当前 Redis 中储存的所有 key,其时间复杂度为 O(N)。如果使用了该命令,可能会造成一些严重的后果:

  1. 由于 Redis 是用单线程处理命令的,如果使用 keys * 命令的话,就可能导致 Redis 会执行很长时间,而在此期间无法为其他用户提供服务了。
  2. Redis 常作为 MySQL 这样的数据库的挡箭牌(缓存),一旦因为 keys * 导致数据无法从 Redis 中获取(Redis 阻塞),累计的大量的其他请求超时后就会从数据库中去查询数据,此时 MySQL 这样的数据库可能就会措手不及了,非常有可能造成数据库崩溃。

EXISTS

exists 命令的作用是判断某个 key 是否存在。如果存在则返回 1, 不存在则返回 0。

其语法格式为:

exists key [key ...]

那么就意味着 exists 命令可以单独查询一个 key,也可以同时查询多个 key:

使用 EXISTS 命令的注意事项:

  • Redis 查询某个 key 是否存在的时间复杂度是 O(1),因为 Redis 组织这些 key 是以哈希表这样的数据结构来组织的。
  • 尽管 Redis 查询某个 key 是否存在的时间复杂度是 O(1),但是由于 Redis 是以单线程来处理命令的,并且 Redis 的客户端与服务器是通过网络进行通信的,因此同时查询多个 key 的效率比分开查询单个 key 时的效率要高得多。

DEL

DEL 命令的功能是删除指定的 key,删除成功返回 1,失败则返回 0。
使用语法:

del key [key ...]


和 EXISTS 命令一样,执行 DEL 命令的时间复杂度也是 O(1),可以单独删除一个 key,也可以同时删除多个 key,但注意应该同时删除多个 key 以避免影响 Redis 的性能。

EXPIRE 和 TTL

EXPIRE 命令的作用是为 key 指定一个秒级的过期时间,当然还有一个命令 PEXPIER,其指定的是毫秒级别的过期时间,当 key 过期之后则会删除这个 key。而 TTL 命令的作用是获取某个 key 剩余的过期时间,如果没有设置过期时间则返回 - 1,已经超时了则返回 - 2。

EXPIRE 的使用语法:

expire key seconds

TTL 的使用语法:

ttl key

使用例子:

经典面试题:Redis 中 key 的过期策略是怎么实现的

如下图所示,展示了 key 设置了超时时间然后到过期的整个过程:

在实际生成环境中,Redis 存在了大量的 key,并且大多数的 key 都是设置了超时时间的。对于 Redis 来说,内存空间是极其宝贵的资源,如果不及时清理过期的 key,就会浪费大量的内存空间。

那么如何清理这些随时会过期的 key 呢?

可能一拍脑门就会想到定时在所有的 key 里面去找出过期的 key 并清除,乍一看实现起来非常简单,但是别忘了,Redis 是使用多线程来处理任务的,如果以这样的方式去清理 key 的话,那么 Redis 的生命周期早就结束了。

实际上,简单来说 Redis 中 key 的过期策略是 定期删除与惰性删除相结合:

1. 定期删除

定期删除是 Redis 中的一种主动过期检查机制。

Redis 定期地(默认每秒钟10次,可以在配置文件中进行调整)随机选择一些已设置过期时间的键,并检查它们的过期时间是否已到。如果键已经过期,Redis 会将其删除。

并且,Redis 会在每次执行定期删除操作时,随机选择一部分键进行检查和清理。这样做是为了分散定期删除操作对性能的影响,以免在某一刻集中删除大量过期键

2. 惰性删除

惰性删除是 Redis 中的被动过期检查机制。

当客户端尝试读取一个键的值时,Redis 会首先检查该键的过期时间。如果键已经过期,Redis 不会返回它的值,而是立即将其删除。惰性删除确保了在键被访问时,如果已经过期,会立即删除。这降低了过期键在内存中积累的可能性。

综合使用这两种方法,Redis 实现了高效的键过期策略,但仍然可能存在一些过期键没有及时清理的情况,特别是在大量过期键堆积时。为了确保过期键的及时清理,还可以考虑以下方法:

  • 设置适当的过期时间: 在配置文件中,为键设置合理的过期时间,以确保不会在内存中积累大量过期键。

  • 使用内存淘汰策略: Redis 提供了不同的内存淘汰策略,如LRU(最近最少使用)、LFU(最不经常使用)等。通过选择适当的淘汰策略,可以在内存不足时主动删除一些键,包括过期键。

  • 定期扫描和清理: 可以定期执行自定义脚本或任务来扫描和清理过期键。这样可以确保即使 Redis 主线程繁忙,也有一个独立的任务负责清理过期键。

  • 使用 Redis 的 Pub/Sub 功能: 可以使用 Redis 的发布/订阅功能来实现一个过期键的监控系统。当键过期时,Redis 可以发布一个消息,然后订阅者可以处理这些消息来执行清理操作。

综合使用这些方法,可以确保 Redis 中的过期键得到及时清理,从而维护内存的稳定和性能。

TYPE

TYPE 命令的作用是返回指定 key 对应 value 的数据类型。
其语法为:

type key

例如:

三、渐进式遍历

SCAN 命令用于渐进式遍历键,以避免 KEYS 命令可能导致的阻塞问题。SCAN 命令的语法如下:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

其中,各个选项的说明如下:

  • cursor:游标,用于迭代遍历。初始时,可以将游标设置为 0,然后根据返回的新游标来继续遍历。这个参数是必需的。

  • MATCH pattern(可选):用于匹配指定模式的键。只返回匹配模式的键。这个参数是可选的。

  • COUNT count(可选):指定每次遍历返回的元素数量。这有助于控制一次扫描的数据量,减轻服务器的负担。这个参数是可选的。

  • TYPE type(可选):指定要匹配的键的类型,例如 STRING、LIST、SET、ZSET、HASH。这个参数是可选的。

使用 SCAN 命令的好处是它可以将键的遍历分布在多个迭代中,以便逐步获取数据,而不会在一次操作中返回大量键,从而导致阻塞。这对于大型数据库非常有用,因为它允许你在不影响 Redis 性能的情况下获取所有键。

注意,由于 Redis 数据可能在迭代期间发生变化,因此迭代期间新增或删除的键可能会被忽略或遍历多次,具体取决于 SCAN 命令的调用时机。

例如,使用 SCAN 遍历所有 key 的整个过程如下图 所示:

说明:

  • 首次使用 SCAN 命令从 0 位置开始遍历;
  • 未遍历完成时,会返回下一次遍历的开始位置;
  • 当 SCAN 命令返回的下次位置为 0 时,表示遍历结束;
  • count 指定一次遍历数量仅供参考,Redis 会根据实际情况做出调整,即 Redis 并不保证严格遵循该数量。

除了SCAN 命令以外,Redis 面向哈希类型、集合类型、有序集合类型分别提供了HSCAN、SSCAN、ZSCAN 命令,它们的用法和 SCAN 命令基本类似。

渐进性遍历 SCAN 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。

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

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

相关文章

链表oj题 链表与LinkedList 栈的概念 队列的概念 树和二叉树

第 1 题(编程题) 题目名称: 求环的入口点 题目内容: 求环的入口点https://leetcode-cn.com/problems/linked-list-cycle-ii/description/ 第 2 题(编程题) 题目名称: 判断链表带环 题目…

利用python工具提取多个word中的图片和表格

1. 前言 由于工作因素,经常要对多个文档内容进行查重,文字类可以借助查重工具辅助,但图片和表格只能依靠鼠标滚轮还有笔者的打工眼。久而久之,眼睛废了,肩颈也吃不消了(-.-)。于是乎&#xff0…

指引型树型组件的封装

最近,由于业务的需要,需要做一个指向形树型组件。在寻找各种文章后,终于有了思路。🤒🤒🤒 树型组件的思路主要是递归。谈到递归,我们首先要有递归的出口。递归的出口就是没有孩子节点了。这个时…

微博情绪分类

引自:https://blog.csdn.net/no1xiaoqianqian/article/details/130593783 友好借鉴,总体抄袭。 所需要的文件如下:https://download.csdn.net/download/m0_37567738/88340795 import os import torch import torch.nn as nn import numpy a…

pyqt与opencv-qt冲突解决办法

问题:pyqt显示不出界面 问题分析: 根据报错可以看出程序找到了libxcb.so,但是由于某些原因并不能够调用该驱动,这是因为pyqt5与opencv里的qt差生了冲突,这说明opencv内部的插件与pyqt5所使用的插件不兼容,因…

Elasticsearch 快速开始

Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎。 查询 : Elasticsearch 允许执行和合并多种类型的搜索 — 结构化、非结构化、地理位置、度量指标 — 搜索方式随心而变。分析 : 找到与查询最匹配的十个文档是一回事。但是如果面对的是…

zemax场曲与消场曲

场曲,像场弯曲,指的是平面物体通过透镜系统后,所有平面物点聚焦后的像面和理想平面不重合。 呈现一个弯曲的像面 单透镜为例: 此时聚焦显然不在一个平面上: 点列图可以观察到场曲的存在: 我们引入实际图…

R拒绝访问的解决方案

Win11系统 安装rms的时候报错&#xff1a; Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck vI[[j]]) : namespace Matrix 1.5-4.1 is already loaded, but > 1.6.0 is required## 安装rms的时候报错&#xff0c;显示Matrix的版本太低…

Linux日志管理-logrotate(crontab定时任务、Ceph日志转储)

文章目录 一、logrotate概述二、logrotate基本用法三、logrotate运行机制logrotate参数 四、logrotate是怎么做到滚动日志时不影响程序正常的日志输出呢&#xff1f;Linux文件操作机制方案一方案二 五、logrotate实战--Ceph日志转储参考 一、logrotate概述 logrotate是一个用于…

Java 华为真题-选修课

需求&#xff1a; 现有两门选修课&#xff0c;每门选修课都有一部分学生选修&#xff0c;每个学生都有选修课的成绩&#xff0c;需要你找出同时选修了两门选修课的学生&#xff0c;先按照班级进行划分&#xff0c;班级编号小的先输出&#xff0c;每个班级按照两门选修课成绩和的…

下载CentOS ISO镜像 (一)

总目录 https://preparedata.blog.csdn.net/article/details/132877836 文章目录 总目录一、下载CentOS 镜像 一、下载CentOS 镜像 官网下载&#xff1a;https://www.centos.org/download/ Centos Linux 和 CentOS Stream 的区别&#xff1a;https://www.centos.org/cl-vs-cs…

设计模式(2) - 创建型模式

创建型模式指的是 创建对象 或是 获取实例 的方式。 1、工厂模式 平时写一些简单的代码可能会直接用 new 创建出一个对象&#xff0c;但是实际在阅读一些功能比较多、规模比较庞大的工程时&#xff0c;可能会发现有多个类继承于同一个基类的情况&#xff0c;它们拥有同样的接口…

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac) Mac mini操作系统&#xff0c;安装完 Google Chrome 浏览器以后&#xff0c;单击 启动台 桌面左下角的“显示应用程序”&#xff0c;我们发现捆绑安装了 Goo…

ArcGis10.8安装教程!

1、找到arcgis10.8中文安装包和Crack破解文件夹 2、运行"ArcGIS.exe"程序&#xff0c;进入安装向导&#xff1b;默认路径点下一步 3、注意&#xff0c;需要Python 2.7、Numpy、Matplotlib的支持 4、建议取消此处的勾选&#xff0c;开始进行安装 5、安装完成 6、…

【npm】npm私有库的使用-绑定

注册npm账户 输入基本信息 验证 收一次性验证码 登录 本地绑定 全局绑定了其他的私有库 若要在专门发包的项目中&#xff0c;发包到自己的私有库&#xff0c;需要在项目文件夹中创建一个.npmrc文件 创建文件 可以直接在项目目录下输入touch .npmrc创建文件 文件内容 regi…

C++之保存编译全部中间文件(二百一十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

JavaScript学习笔记03

JavaScript笔记03 流程控制 if 判断 和 Java 中if语句的使用方法相同。例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script>"use strict"…

OPCAE扫盲

目录 1 基本概念 1.1 服务器/客户端 1.2 区域 1.3 报警/条件 1.4 事件 2 条件概念 2.1 子条件 2.2 OPCConditions属性 2.3 Condition质量 2.4 OPCSubConditions属性 2.5 Condition定义 2.6 严重性 2.7 Condition启用/禁用 2.8 Area启用/禁用 2.9 Condition状态集…

域控操作一:更换域用户桌面背景

1,创建背景图片文件夹并设置共享文件夹&#xff1a; 创建文件夹&#xff0c;将图片放进去&#xff0c;设置共享&#xff0c;权限改为Everyone 2&#xff0c;打开域控服务器设置组策略 在需要的组织单位OU内创建GPO设置名字为统一桌面背景 用户配置–管理模板–桌面–桌面 Act…

期权怎样的加仓才是合理的加仓?

期权加仓的手法是期权投资中常见的一种操作的手段,一般是在行情有大涨趋势的时候,投资者通过追加仓位来扩大收益和缩小持仓成本的策略&#xff0c;下文为大家介绍期权怎样的加仓才是合理的加仓&#xff1f;本文来自&#xff1a;期权酱 一、期权交易怎么加仓最合适&#xff1f;期…