【Redis】Redis 通用命令、键的过期策略

文章目录

  • 一、基础命令
    • 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

例如:

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

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

相关文章

leetcode 1002. 查找共用字符

2023.9.6 个人感觉这题难度不止简单,考察到的东西还是挺多的。 首先理解题意,可以将题意转化为:求字符串数组中 各字符串共同出现的字符的最小值。 分为三步做: 构造一个哈希表hash,初始化第一个字符串的字母出现频率…

GIS:DataStore数据管理框架

1.架构设计 OGC 规范对空间矢量数据的框架进行了设计,GeoTools 对其进行了实现。其中的 DataStore 可以近似理解成关系数据库中的个数据库实例,FeatureSource 可以近似理解成关系数据库中的一张表。 DataAccess 接口主要对空间要素类型的相关信息的构建…

2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策

1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

OJ练习第164题——具有所有最深节点的最小子树

具有所有最深节点的最小子树 力扣链接:865. 具有所有最深节点的最小子树 力扣链接:1123. 最深叶节点的最近公共祖先 题目描述 给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离 。 返回包含原始树中所有 最深节点 的…

sqlserver 联表查询、子查询、窗口函数、聚合函数等概念与例子

with cte as的用法 查询的一个有用工具,允许创建临时命名结果集,可在查询中多次引用相同的子查询结果,可以提高查询的可读性和维护性 WITH cte_name (column1, column2, ...) AS (-- 这里是子查询SELECT column1, column2, ...FROM your_ta…

UE5- c++ websocket里实现调用player里的方法

# UGameInstance里直接调用 获取到引用了,就可以自然的调用。忽略 # UGameInstance里间接调用,通过代理调用 前置已经添加了websocket,具体步骤参考,链接在UWebSocketGameInstance.h里新增代理,并在链接成功后进行绑定。 #pragma…

【操作系统】自旋锁实现自旋锁原理(亲测可用)

原理 自旋锁是一种基于忙等待的锁,它在等待锁的过程中不会阻塞线程,而是通过循环不断地检查锁的状态,直到获取到锁为止。自旋锁适用于锁的持有时间很短的情况,因为在等待锁的过程中,线程会一直占用CPU资源&#xff0c…

【AI Agent】Agent的原理介绍与应用发展思考

文章目录 Agent是什么?最直观的公式Agent决策流程 Agent 大爆发人是如何做事的?如何让LLM替代人去做事?来自斯坦福的虚拟小镇架构记忆(Memory)反思(Reflection)计划(Plan) 类 LangC…

第6章 内核模块符号导出实验(iTOP-RK3568开发板驱动开发指南 )

在上一小节中,给大家讲解了驱动模块传参实验,使用insmod命令加载驱动时可以进行参数的传递,但是每一个内核模块之间是相互独立的,那模块间的符号传递要怎样进行呢,让我们带着疑问来进行本章节的学习吧! 6.…

uni-app 折叠自定义

uni-app的uni-collapse折叠组件样式修改 下面是修改后的样式 <uni-collapse accordion class"ze" v-model"isCollapse" click"toggleCollapse"><!-- 因为list默认带一条分隔线&#xff0c;所以使用 titleBorder"none" 取消…

反序列化漏洞复现(typecho)

文章目录 执行phpinfogetshell 执行phpinfo 将下面这段代码复制到一个php文件&#xff0c;命名为typecho_1.0-14.10.10_unserialize_phpinfo.php&#xff0c;代码中定义的类名与typecho中的类相同&#xff0c;是它能识别的类&#xff1a; <?php class Typecho_Feed{const…

2023国赛数学建模C题思路分析 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

day5 qt

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);timer_idthis->startTimer(100);//啓動一個定時器 每100ms發送一次信號ui->Edit1->setPlaceholderTex…

java 面试题汇总整理

java有哪四种引用类型 在Java中&#xff0c;有四种引用类型&#xff0c;用于控制对象的生命周期和垃圾回收行为。这些引用类型包括&#xff1a; 强引用&#xff08;Strong Reference&#xff09;&#xff1a; 强引用是最常见的引用类型&#xff0c;它们是默认的引用类型。当一…

ChatGPT:革命性的自然语言处理技术

自然语言处理&#xff08;NLP&#xff09;技术的快速发展已经为我们的日常生活带来了巨大的变革。在这个领域&#xff0c;ChatGPT作为一个突出的代表&#xff0c;正在为我们带来更多的便利和机会。本文将介绍ChatGPT的基本概念、应用领域以及它在未来可能带来的影响。 ChatGPT…

Python UI自动化 —— 关键字+excel表格数据驱动

步骤&#xff1a; 1. 对selenium进行二次封装&#xff0c;创建关键字的库 2. 准备一个表格文件来写入所有测试用例步骤 3. 对表格内容进行读取&#xff0c;使用映射关系来对用例进行调用执行 4. 执行用例 1. 对selenium进行二次封装&#xff0c;创建关键字的库 from time imp…

【SpingBoot】详细介绍SpringBoot项目中前端请求到数据库再返回前端的完整数据流转,并用代码实现

在SpringBoot项目中&#xff0c;前端请求到最终返回的完整数据流转一般包括以下几个步骤&#xff1a; 前端发送HTTP请求到后端Controller。 Controller接收到请求后&#xff0c;调用相关Service处理业务逻辑。 Service调用DAO层获取数据。 DAO层访问数据库获取数据。 数据库…

【51单片机实验笔记】中断篇(一) 外部中断

目录 前言中断系统概述寄存器说明中断优先级寄存器&#xff08;IP&#xff09;中断允许控制寄存器&#xff08;IE&#xff09;中断请求标志寄存器&#xff08;TCON&#xff09; 外部中断配置软件实现按键事件的外部中断实现 遇到的问题总结 前言 中断是单片机非常重要的概念&a…

2021江苏省赛热身赛 C Magic Rabbit(数形结合)

2021江苏省赛热身赛 C Magic Rabbit(数形结合) Magic Rabbit 非常好且巧妙地一道题。 大意&#xff1a;给出三种溶液 &#xff0c; 三种溶液分别含有不同浓度的 x &#xff0c;y 两种物质。 溶液x (mg/ml)y (mg/ml)溶液1x1y1溶液2x2y2溶液3x3y3 给出 Q 组询问 &#xff0c…

MySQL 8.0.34安装教程

一、下载MySQL 1.官网下载 MySQL官网下载地址&#xff1a; MySQL :: MySQL Downloads &#xff0c;选择下载社区版&#xff08;平时项目开发足够了&#xff09; 2.点击下载MySQL Installer for Windows 3.选择版本8.0.34&#xff0c;并根据自己需求&#xff0c;选择下载全社区安…