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

news2024/11/17 8:28:11

文章目录

  • 一、基础命令
    • 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.coloradmin.cn/o/984432.html

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

相关文章

vue插槽slot

插槽有三种&#xff1a; 目录 1.普通插槽 2.具名插槽 3.作用域插槽 1.普通插槽 sub.vue 子组件 --- 子组件写slot标签&#xff0c;父组件的Sub标签内填写的内容会显示在slot的位置&#xff0c;父组件如果不写内容就会展示默认内容。 <template><div class"…

智慧物流发展的重要推动力量:北斗卫星导航系统

随着经济的快速发展和电商的普及&#xff0c;物流行业的规模不断扩大&#xff0c;对物流运输的效率和安全性也提出了更高的要求。传统的物流运输方式存在着效率低下、信息不对称、安全隐患等问题&#xff0c;因此发展智慧物流已经成为物流行业的必然趋势。智慧物流可以通过先进…

软文发稿平台那么多,为什么选择媒介盒子

近年来随着互联网技术的发展&#xff0c;越来越多的企业开始注重软文营销&#xff0c;品牌软文推广对企业来说是至关重要的&#xff0c;也有许多企业选择和软文发稿平台合作来增强品牌曝光&#xff0c;提升宣传效果&#xff0c;那么为什么会有这么多企业选择媒介盒子合作呢&…

2023高教社杯 国赛数学建模A题思路 - 定日镜场的优化设计

1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

微服务04-Gateway网关

作用 身份认证&#xff1a;用户能不能访问 服务路由&#xff1a;用户访问到那个服务中去 负载均衡&#xff1a;一个服务可能有多个实例&#xff0c;甚至集群&#xff0c;负载均衡就是你的请求到哪一个实例上去 请求限流功能&#xff1a;对请求进行流量限制&#xff0c;对服务…

【智慧工地源码】物联网和传感器技术在智慧工地的应用

物联网&#xff08;IoT&#xff09;和传感器技术在智慧工地中扮演着至关重要的角色。这些技术的应用&#xff0c;使得智慧工地能够实现对施工过程的精确监控、数据收集和分析&#xff0c;以及设备互联&#xff0c;从而提高工程效率、减少成本并改善工人的工作环境。 一、物联网…

Faster RCNN

【简介】 Faster RCNN[7]是第一个端到端&#xff0c;最接近于实时性能的深度学习检测算法&#xff0c;该网络的主要创新点就是提出了区域选择网络用于申城候选框&#xff0c;能几大提升检测框的生成速度。该网络首先输入图像到卷积网络中&#xff0c;生成该图像的特征映射。在特…

cocos 之纹理格式和压缩纹理

Cocos2dx 版本&#xff1a; 3.10 CocosCreator 版本&#xff1a; 3.8.0 环境&#xff1a; Mac 简介 在项目开发中&#xff0c;图片资源的优化是作为性能优化和包体优化的一项重要侧露。常用的手段有&#xff1a; 使用TexturePacker将散图打包图集 JPG和PNG的使用&#xff0…

SpringMVC概述,SpringMVC是什么,有什么优势?

目录 一、MVC 模式 二、SpringMVC 是什么&#xff1f; 三、SpringMVC的优势 四、SpringMVC 的应用场景 一、MVC 模式 MVC模式是一种软件架构模式&#xff0c;它将软件的用户界面&#xff08;即前台页面&#xff09;和业务逻辑分离&#xff0c;使代码具有更高的可扩展性、可…

2023年MySQL实战核心技术第一篇

目录 四 . 基础架构&#xff1a;一条SQl查询语句是如何执行的&#xff1f; 4.1 MySQL逻辑架构图&#xff1a; 4.2 MySQL的Server层和存储引擎层 4.2.1 连接器 4.2.1.1 解释 4.2.1.2 MySQL 异常重启 解决方案&#xff1a; 4.2.1.2.1. 定期断开长连接&#xff1a; 4.2.1.2.2. 初始…

MySQL数据库的回滚rollback是怎么做到的?

MySQL的几种日志 MySQL主要有3种日志&#xff1a; 二进制日志&#xff0c;就我们都熟悉的binlog&#xff0c;它主要的作用 主从复制、PIT恢复重做日志&#xff0c;redo log&#xff0c;它主要的作用是 当突然数据库宕机了&#xff0c;它能恢复数据第三种就是 undo log&#x…

冠达管理:重拳出击!六大科技巨头被列入“看门人”名单!

当地时刻9月6日&#xff0c;美股三大股指团体收跌&#xff0c;截至收盘&#xff0c;道指跌0.57%&#xff0c;标普500指数跌0.70%&#xff0c;纳指跌1.06%。 投资者忧虑美联储的加息周期或许没有完毕。波士顿联储主席苏珊柯林斯标明&#xff0c;美联储或许需求更多的加息&#…

【广州华锐互动】3D在线展示家具的应用及优势

在数字化的世界里&#xff0c;我们的生活方式正在发生深刻的变化。其中&#xff0c;家具行业也在逐步接纳并应用这一趋势&#xff0c;创新的3D线上展览展示已经成为新的潮流。这种新型的展示方式不仅可以让顾客在家中就能全方位、立体地了解家具产品&#xff0c;还能为设计师提…

每日一题 2594. 修车的最少时间

难度&#xff1a;中等 思路源于题目标签 “二分”&#xff1a; 二分的上界应该是所有车都给修车能力值最小的人修&#xff0c;下界我设为0每次搜索时判断当前时间下&#xff0c;每位机械工总共能修 n 辆车&#xff0c;n > cars 则右边界左移&#xff0c;否则左边界右移 c…

【Miniconda】记一次从Anaconda到Miniconda的转换

文章目录 一、卸载Anaconda1 - 安装anaconda-clean2 - 彻底卸载命令3 - 再进行普通卸载4 - 手动删除文件夹5 - 使用Geek \ 火绒工具清理注册表 二、安装Miniconda三、清华源1 - 配置清华源2 - 恢复默认源&#xff08;清华源中找不到包时用&#xff09;3 - 删除镜像源4 - 查看配…

QT设计一个小闹钟

设置一个闹钟&#xff0c;左侧窗口显示当前时间&#xff0c;右侧设置时间&#xff0c;以及控制闹钟的开关&#xff0c;下方显示闹钟响时的提示语。当按启动按钮时&#xff0c;设置时间与闹钟提示语均不可再改变。当点击停止时&#xff0c;关闭闹钟并重新启用设置时间与闹钟提示…

2023高教社杯 国赛数学建模B题思路 - 多波束测线问题

1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c; 在不同界面上产生反射&#xff0c; 利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信 号&#xff0c;并记录从声波发射到信…

centos7更新podman

实验环境&#xff1a;centos7.7.1908 1.安装podman并查看版本 yum install podman podman -v 当前podman版本信息是1.6.4 2.更新podman版本 通过查看资料显示centos 7 支持最高版本为 3.4.4&#xff0c;更新podman大致有以下四步&#xff1a; golang 安装(本次使用版本: 1.…

Coremail管理员社区Q2季刊发布!

近日&#xff0c;Coremail管理员社区Q2季刊正式发布。2023年4月&#xff0c;Coremail管理员社区首次发刊&#xff0c;得到了广大客户朋友的支持和转发&#xff0c;这成为我们继续发布季刊的动力。 Coremail管理员社区Q2季刊主要盘点了2023年上半年社区的精选文章和热门活动等精…

【C++】C++面向对象编程三大特性之一——多态

❤️前言 继上篇继承的知识之后&#xff0c;本片博文主要和大家一起继续学习多态的知识。多态的实现依附于继承&#xff0c;是面向对象的重要特性。 正文 多态&#xff0c;顾名思义就是多种状态。简单来说&#xff0c;不同类型的对象进行相同的操作会产生不同的结果。举实例来…