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!!如有问题,欢迎评论区批评指正😁

请添加图片描述

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

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

相关文章

「全网最细 + 实战源码案例」设计模式——策略模式

核心思想 策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列算法或策略,将它们封装成独立的类,并使它们可以相互替换,而不影响客户端的代码,提高代码的可维护性和扩展性。 结构 …

【大模型】AI 辅助编程操作实战使用详解

目录 一、前言 二、AI 编程介绍 2.1 AI 编程是什么 2.1.1 为什么需要AI辅助编程 2.2 AI 编程主要特点 2.3 AI编程底层核心技术 2.4 AI 编程核心应用场景 三、AI 代码辅助编程解决方案 3.1 AI 大模型平台 3.1.1 AI大模型平台代码生成优缺点 3.2 AI 编码插件 3.3 AI 编…

DeepSeek辅助学术写作【对比概念】效果如何?

DeepSeek-R1在论文写作细节方面有很多好的应用。我们下面通过具体案例来逐一展示这些功能。 DeepSeek-R1在提问方面,可以简化提示词也能给出精准得答案。我们来一探究竟! 对比概念(功能指数:★★★★★) DeepSeek-R1在概念对比方面的功能也非常强大。由…

单节锂电池外部供电自动切换的电路学习

文章目录 前言一、原理分析:①当VBUS处有外部电源输入时②当VBUS处无外部电源输入时 二、器件选择1、二极管2、MOS管3、其他 总结 前言 学习一种广泛应用的锂电池供电自动切换电路 电路存在外部电源时,优先使用外部电源供电,并为电池供电&…

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量,本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”,我们会更详细讲解;理解环境变量的全局…

107,【7】buuctf web [CISCN2019 华北赛区 Day2 Web1]Hack World

这次先不进入靶场 看到红框里面的话就想先看看uuid是啥 定义与概念 UUID 是 Universally Unique Identifier 的缩写,即通用唯一识别码。它是一种由数字和字母组成的 128 位标识符,在理论上可以保证在全球范围内的唯一性。UUID 的设计目的是让分布式系…

【LeetCode】5. 贪心算法:买卖股票时机

太久没更了,抽空学习下。 看一道简单题。 class Solution:def maxProfit(self, prices: List[int]) -> int:cost -1profit 0for i in prices:if cost -1:cost icontinueprofit_ i - costif profit_ > profit:profit profit_if cost > i:cost iret…

01vue3实战-----前言

01vue3实战-----前言 1.大前端时代2.技术栈3.项目大致展示4.创建Vue项目4.1Vue CLI4.2create-vue 5.参考资料 1.大前端时代 前端移动端iOS/android开发桌面端 window/mac 常用的electron框架来开发其它平台:穿戴设备、车载系统(智能汽车)、VR、AR…web3方向 2.技术栈 开发工…

使用request库实现接口测试-笔记

目录 request库request库的安装和查验request发送请求的语法获取响应结果指定内容案例 Unittest框架集成Requests库Unittest框架语法Unittest框架基础代码案例 request库 request库是python编写的,基于urllib的HTTP库,使用方便。 request库的安装和查验 安装&…

快速傅里叶离散变换FFT (更新中)

声明:参考了 y y c yyc yyc 的 blog 和 PPT (from smwc) ,以及 w z r wzr wzr 的 blog 。 目录 Part 1 多项式Part 2 FFT概论Part 3 点值与插值Part 4 复数,单位根Part 5 Part 1 多项式 定义:对于有限数列 A 0 A_{0} A0​~ n…

【C++】STL——list的使用

目录 💕1.带头双向链表List 💕2.list用法介绍 💕3.list的初始化 💕4.size函数与resize函数 💕5.empty函数 💕6.front函数与back函数 💕7.push_front,push_back,pop_front,pop_back函数…

2021Java面试-基础篇

文章目录 前言一: Java概述 1、何为编程2、JDK1.5之后的三大版本3、JVM,JRE和JDK的关系4、什么是跨平台?原理是什么5、Java语言有哪些特点6、什么是字节码?采用字节码的最大好处是什么7、什么是Java程序的主类?应用程序和小程序的…

MapStruct工具类的使用

文章目录 1.简介2.作用2.1 属性拷贝2.2 类型安全2.3 性能高效2.4 自定义转换 3.如何使用3.1 创建一个maven工程项目并引入mapstruct的坐标依赖:3.2 源对象类3.3 目标对象类(和源对象类中的字段属性名相同)3.4 创建接口SyncMapper(…

FPGA| 使用Quartus II报错Top-level design entity ““ is undefined

1、使用FPGA准备点亮LED测试下板子,发现这个报错Error (12007): Top-level design entity "LEDLED" is undefined 工程如上图 报错如下图 2、分析到原因是因为工程名称和顶层模块里面的module名称不一样导致 解决办法:修改module名称和顶层模…

LeetCode - #198 打家劫舍

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

【DeepSeek】本地私有化部署 DeepSeek 模型教程

一、引言 DeepSeek 模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自身需求进行定制化配置。本教程将详细介绍如何在本地进行 DeepSeek 模型的私有…

【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证1 契约测试的概念2 契约测试的工作原理3 契约测试的分类4 DeepSeek 给出的契约测试相关背景5 契约测试在 Postman 中的创建方法6 API 实例的基本用法7 API 实例的类型实…

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

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

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面:简化调用复杂性2. 系统层面:屏蔽客户端调用差异3. 其他方面: 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1:同步阻塞处理2. Zuul2:异步非阻塞处理 三…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章,计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…