Redis的通用命令

在这里插入图片描述
⭐️前言⭐️

本文主要介绍Redis的通用命令

🍉欢迎点赞 👍 收藏留言评论

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅通用命令
    • 🍅1.启动和停止服务器
    • 🍅2.get和set
    • 🍅3.全局命令
      • keys
      • exists
      • del
      • expire
      • ttl
      • type
      • 小结
    • 🍅4.key的过期策略【经典面试题】
    • 🍅5.定时器的实现原理

🍅通用命令

🍅1.启动和停止服务器

启动redis服务器

redis-server /etc/redis/redis.conf

停止redis服务器

先通过netstat或者ps查询redis服务器的pid

netstat -anp | grep redis
ps aux | grep redis

再根据pid进行kill即可

kill 进程id

连接Redis服务器

在输入Redis命令之前,需要先连接上Redis服务器

redis-cli

断开连接

ctrl+D

🍅2.get和set

Redis是按照键值对的方式来存储数据的,通过get和set这两个核心的命令来存储键值对和取值

set key value	 	 //key和value都是字符串

Redis中的命令不区分大小写,而且对于上述这里的key和value,不需要加上引号,就是表示字符串的类型。

get key      		 //根据key获取value

get命令直接输入key就能得到value,如果当前key不存在,会返回nil(nil和null/NULL是一个意思)

示例:

img

🍅3.全局命令

Redis支持很多种数据结构,整体上来说,Redis是键值对结构,key固定就是字符串,value实际上会有很多种类型(包括字符串、哈希表、列表、集合、有序集合等),操作不同的数据结构,就会有不同的命令;

全局命令,就是能够搭配任意一个数据结构来使用的命令。

keys

通过一些特殊符号(通配符)来描述key的模样,匹配上述模样的key就能被查询出来

语法:

keys pattern

返回所有满足样式(pattern)的key,支持如下统配样式。

  • h?llo匹配hello、hallo等?匹配任意一个字符
  • h*llo匹配hllo、heeeello等?匹配任意个任意字符
  • h[abe]llo匹配hallo、hbllo、hello等[abe]只能匹配到a、b、e,相当于给了固定选项
  • h[^e]llo匹配除hello以外的,[^e]排除e,只有e匹配不了,其他的都能匹配
  • h[a-c]llo匹配hallo、hbllo、hcllo[a-c]匹配a-c这个范围内的字符,包含两侧边界

示例:

img

注意事项:

keys命令的时间复杂度是O(N),所以在生产环境上,一般都会禁止使用keys命令,尤其是keys *(该命令会查询redis中的所有key)

生产环境上的key可能会非常多,而Redis是一个单线程的服务器,执行keys *的时间非常长,就会使redis服务器被阻塞了,无法给其他客户端提供服务。

Redis经常会用于做缓存,挡在MySQL前面,万一redis被一个keys *阻塞住了,此时其他的查询redis操作就超时了,此时这些请求就会直接查数据库。如果一大波请求直接过来,就会导致MySQL措手不及,很容易就挂了,这样整个系统基本就瘫痪了。

exists

判断key是否存在

语法:

exists key [此处key可以是一个或者多个,用空格隔开]

时间复杂度:O(1)

返回值:key存在的个数

示例:

img


exists key1 key2 和分开写exists key1;exists key2有什么区别呢?

redis是一个客户端-服务器结构的程序,客户端和服务器之间通过网络来进行通信,如果分开的话,会产生更多轮次的网络通信,效率更低。

提到网络通信,就得提一下封装和分用

封装:进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层到物理层层层封装,每一层协议都要加上报头或者尾,类似于我们发一个快递,需要包装一下,要包装好几层

**分用:**接收方收到一个数据,这个数据就要从物理层到应用层层层分用,把每一层协议中的报头或者尾给拆掉,类似于我们收到快递,要拆快递,拆很多层

del

删除指定的key

语法:

del key [此处key可以是一个或者多个]

时间复杂度:O(1)

返回值:删除掉的key的个数

示例:

img


在MySQL中,删除类的操作比如drop database、drop table、delete from...都是非常危险的操作,一旦删除了之后,数据就没了;

而redis主要的应用场景,就是作为缓存,此时redis里存的只是热点数据,全量数据是在MySQL数据库中,此时如果把redis中的key删除了几个,一般来说,问题都不大;

但是当然如果把所有的数据或者一大半数据都删除了,这种影响会很大;本来redis是帮MySQL负重前行的,redis没数据了,大部分的请求就直接打给MySQL了,然后很容易把MySQL搞挂

相比之下,如果是MySQL这样的数据,哪怕误删了一个数据,都可能是影响很大的

如果是把redis作为数据库,此时误删数据的影响就很大了;

如果是把redis作为消息队列(mq),这种情况误删数据影响大不大,就需要具体问题具体分析了

expire

指定的key添加秒级的过期时间(Time To Live ;TTL)

这里的key必须是针对已经存在的key设置

key存活时间超出这个指定的值,就会被自动删除

语法:

expire key seconds
pexpire key 毫秒

时间复杂度:O(1)

返回值:1表示设置成功,0表示设置失败

示例见ttl


过期时间这个实现,有很多的业务场景:

1、在进行登录时,经常会用到手机验证码,该验证码5分钟内有效;

2、点外卖,有优惠券在指定时间内有效;

3、基于redis实现分布式锁,为了避免出现不能正确解锁的情况,通常都会在加锁的时候设置一下过期时间(所谓的使用redis作为分布式锁,就是给redis里写一个特殊的key value)

ttl

获取指定key的过期时间,秒级 Time To Live TTL

语法:

ttl key

pttl key毫秒级

时间复杂度:O(1)

返回值:查询当前key的剩余过期时间,-1表示没有关联过期时间,-2表示key不存在(时间到被自动删除了)

示例:

img

type

返回key对应value的数据类型

语法:

type key

时间复杂度:O(1)

返回值:none,string,list,set,zset,hash and stream.

示例:

img

小结

当前已经学习了redis中几个基本的全局命令:

keys:用来查看匹配规则的key

exists:用来判定指定key是否存在

del:删除指定的key

expire:给key设置过期时间

ttl:查询key的过期时间

type:查询key对应的value类型

🍅4.key的过期策略【经典面试题】

一个redis中可能同时存在很多很多的key,这些key中可能有很大一部分都有过期时间,此时redis服务器咋知道哪些key已经过期要被删除,哪些key还没过期呢?如果直接遍历所有的key,效率很低显然是行不通的。

Redis整体的策略是定期删除和惰性删除相结合:

定期删除:

每次抽取一部分,进行验证过期时间,需要保证这个抽取检查的过程足够快。

为什么这里对于定期删除的时间有明确的要求呢,这是因为redis是单线程的程序,主要的任务是处理每个命令,还有包括扫描过期的key等,如果扫描过期的key消耗的时间太多了,就可能导致正常处理请求的命令就被阻塞了(产生了类似于执行keys *这样的效果)

惰性删除:

假设key已经到过期时间了,但是暂时还没删它,key还存在,紧接着后面又一次访问,正好用到了这个key,这次访问就会让redis服务器触发删除key的操作,同时再返回一个nil

这个过程就类似于我们去超市买一瓶饮料的场景,我拿到了饮料,在正要付钱的时候看了一眼生产日期,发现过期了,于是老板就没卖这瓶饮料;因为超市里面商品很多,老板也不知道哪些商品已经过期了,而在客户付款的时候发现商品过期了,老板再进行物品删除,这个场景和惰性删除类似。

虽然有了上述两种策略结合,但是整体的效果一般,仍然可能会有很多过期的key被残留了,没有被及时删除掉,redis为了对上述进行补充,还提供了一系列的内存淘汰策略。

🍅5.定时器的实现原理

定时器就类似于一个闹钟,在某个时间到达之后,会执行指定的任务;

定时器的实现方式有以下两种(redis不是基于以下两种,但和第二种的实现有相像之处):

1、基于优先级队列/堆

正常的队列是先进先出,而优先级队列则是按照指定的优先级先出

这里的优先级是可以自定义的,在redis过期key的场景中,就可以通过“过期时间越早,优先级越高”来进行优先级定义。

现在假定有很多key设置了过期时间,就可以把这些key加入到一个优先级队列中,指定优先级规则是过期时间早的先出队列,那么队首元素就是最早的要过期的key。

定时器中只要分配一个线程,让这个线程去检查队首元素,看是否过期即可,如果队首元素还没过期,后续元素一定没过期。(此时扫描线程不需要遍历所有key,就只盯住这一个队首元素即可)

另外在扫描线程检查队首元素过期时间的时候,也不能检查的太频繁,此时的做法就是可以根据当前时刻和队首元素的过期时间,设置一个等待,当时间差不多到了,系统再唤醒这个线程。(此时扫描线程也不需要高频扫描队首元素,把CPU的开销也节省下来了)

万一线程在休眠的时候,来了一个新的任务,这时候需要唤醒一下刚才的线程,重新检查一下队首元素,再根据时间差距重新调整阻塞时间即可。

2、基于时间轮实现的定时器

这种方式是把时间划分成很多小段(划分的粒度要看实际需求),每个小段上都挂着一个链表,链表的每个节点都代表一个要执行的任务。

假设需要添加一个key,这个key在300ms之后过期,就会放在第三个小段中;

img

此时这个指针,就会每隔固定的时间间隔(此处约定是100ms)走到下一个格子,每次走到一个格子,就会把这个格子上链表的任务尝试执行一下。

对于时间轮来说,每个格子是多少时间,一共多少个格子,都是需要根据实际场景,灵活调配的。

此处需要注意,Redis并没有采取上述的方案,但是要了解这两种方案,都是属于高效的定时器的实现方式,很多场景可能都会用到;

在Redis源码中,有一个比较核心的机制,叫做事件循环,其实现就和时间轮的实现比较相似


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

Elasticsearch:如何搜索含有复合词的语言

作者:来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战,因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名:Rindfleischetik…

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图) 文章目录 1、通信协议通信协议REST API 对比 GraphQL(前端-web服务)grpc如何工作&#x…

Spark--如何理解RDD

1、概念 rdd是对数据集的逻辑表示,本身并不存储数据,只是封装了计算逻辑,并构建执行计划,通过保存血缘关系来记录rdd的执行过程和历史(当一个rdd需要重算时,系统会根据血缘关系追溯到最初的数据源&#xff…

0205算法:最长连续序列、三数之和、排序链表

力扣128:最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 class Solution {public int longestConsecutive(in…

gitea - fatal: Authentication failed

文章目录 gitea - fatal: Authentication failed概述run_gitea_on_my_pkm.bat 笔记删除windows凭证管理器中对应的url认证凭证启动gitea服务端的命令行正常用 TortoiseGit 提交代码备注END gitea - fatal: Authentication failed 概述 本地的git归档服务端使用gitea. 原来的用…

【数学】矩阵、向量(内含矩阵乘法C++)

目录 一、前置知识:向量(一列或一行的矩阵)、矩阵1. 行向量2. 列向量3. 向量其余基本概念4. 矩阵基本概念5. 关于它们的细节 二、运算1. 转置(1)定义(2)性质 2. 矩阵(向量&#xff0…

算法与数据结构(合并K个升序链表)

思路 有了合并两个链表的基础后,这个的一种方法就是可以进行顺序合并,我们可以先写一个函数用来合并两个链表,再在合并K个链表的的函数中循环调用它。 解题过程 解析这个函数 首先,可以先判断,如果a为空&#xff0c…

Google C++ Style / 谷歌C++开源风格

文章目录 前言1. 头文件1.1 自给自足的头文件1.2 #define 防护符1.3 导入你的依赖1.4 前向声明1.5 内联函数1.6 #include 的路径及顺序 2. 作用域2.1 命名空间2.2 内部链接2.3 非成员函数、静态成员函数和全局函数2.4 局部变量2.5 静态和全局变量2.6 thread_local 变量 3. 类3.…

leetcode_双指针 160.相交链表

160.相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 思路: 本题中,交点不是数值相等,而是指针相等 双指针遍历两遍后必定相遇&#xff0c…

Oracle Primavera P6 最新版 v24.12 更新 2/2

目录 一. 引言 二. P6 EPPM 更新内容 1. 用户管理改进 2. 更轻松地标准化用户设置 3. 摘要栏标签汇总数据字段 4. 将里程碑和剩余最早开始日期拖到甘特图上 5. 轻松访问审计数据 6. 粘贴数据时排除安全代码 7. 改进了状态更新卡片视图中的筛选功能 8. 直接从活动电子…

2024年Web前端最新Java进阶(五十五)-Java Lambda表达式入门_eclipse lambda(1),面试必备

对象篇 模块化编程-自研模块加载器 开源分享:【大厂前端面试题解析核心总结学习笔记真实项目实战最新讲解视频】 Arrays.sort(players, sortByName); // 1.3 也可以采用如下形式: Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2))); ??其…

网络原理(5)—— 数据链路层详解

目录 一. 以太网 1.1 认识以太网 1.2 网卡与以太网 1.3 以太网帧格式 二. 认识MAC地址 三. MAC地址 与 IP地址 的区别 4.1 定义 4.2 分配方式 4.3 工作层次 4.4 地址格式 4.5 寻址方式 四. ARP协议 4.1 引入 4.2 ARP的概念 4.3 ARP工作原理 五. MTU 与 MSS …

DeepSeek R1 模型解读与微调

DeepSeek R1 模型是 DeepSeek 团队推出的一款重要的大语言模型,旨在通过强化学习提升大型语言模型的推理能力。 模型架构 DeepSeek-R1-Zero DeepSeek-R1-Zero 是 DeepSeek 团队推出的第一代推理模型,完全依靠强化学习(RL)训练&…

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师,我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机: 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…

Linux 压缩打包

Linux压缩打包 文章目录 Linux压缩打包压缩的意义和原理压缩的意义压缩的原理压缩与解压缩的好处压缩打包命令.zipzip 命令用法unzip 的用法.gzgzip 的用法gunzip 的用法.bz2bzip2 的用法bunzip2 的用法.xzxz 命令用法tar04-Linux压缩打包课后习题压缩的意义和原理 压缩的意义…

Apache HttpClient

HttpClient是apache组织下面的一个用于处理HTTP请求和响应的来源工具,是一个在JDK基础类库是做了更好的封装的类库。 HttpClient 使用了连接池技术来管理 TCP 连接,这有助于提高性能并减少资源消耗。连接池允许 HttpClient 复用已经建立的连接&#xff0…

【C++】STL——list底层实现

目录 💕1.list的三个类介绍 💕2.list——节点类 (ListNode) 💕3.list——链表类 (List) 💕4.list——迭代器类(重点思考)(ListIterator) 💕5…

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合,旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍: 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…

02、NodeJS学习笔记,第二节:express与中间件

express与中间件 中文官网:https://www.expressjs.com.cn/nodemon工具 nodemon这个工具,能够监听项目文件的变动。 当代码被修改后,nodemon会帮我们自动重启项目,极大的方便了开发和调试##安装 npm i -g nodemon##使用 之前启动…