Redis --- 第三讲 --- 通用命令

一、get和set命令

Redis中最核心的两个命令

get 根据key来取value

set 把key和value存储进去

redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。

语法 set key value  : key和value都是字符串。

对于上述这里的key value 不需要加上引号,就是表示字符串,加上引号也无伤大雅。redis中的命令不区分大小写。

使用get得到key对应的value值。

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

redis使用简单,学习成本很低。

二、全局命令

Redis全局命令

Redis是支持很多种数据结构的,整体上来说,Redis是键值对结构,key固定都是字符串,value实际上会有多种类型。比如字符串,哈希表,列表,集合,有序集合等等。每种数据结构都会对应着不同的命令,而全局命令就是能够搭配任意一个数据结构来使用的命令。

1)keys命令 用来查询当前服务器上匹配的key

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

语法:keys pattern 

pattern 包含特殊符号的字符串,有的地方翻译成样式或者模式。重点去认识这个英文术语。存在的意义,是去描述另外的字符串长啥样。

pattern具体咋写,支持哪些通配符呢

?匹配任意一个字符

*匹配0个任意多个字符

[ae] 只能匹配到ae,别的不行,相当于给出固定选项了

[^e] 排除e,只有e匹配不了,其他的都能匹配。

[a - e] 匹配a - e这个范围内的字符,包含两侧边界。

设置这样的key,通过上述的匹配方法进行查询

上述的匹配规则不需要去背。要查询文档。

keys命令的时间复杂度是O(N)。所以在生产环境上,一般都会禁止使用keys命令,尤其是大杀器keys * 。查询redis中所有的key!生产环境上的key可能会非常多!而redis是一个单线程的服务器,执行keys * 的时间非常长,就是redis服务器被阻塞了。无法给其他客户端提供服务。这样的后果可能是灾难性的。redis经常会用于做缓存,挡在mysql前面。替mysql负重前行。万一redis被一个keys * 阻塞住了,此时其他的查询redis操作就超时了。此时这些请求就会直接查数据库。突然一大波请求到来,mysql措手不及,会把它给搞挂了。这个操作非常危险,容易把工作给搞丢。那你就得让你的媳妇吃土或者喝西北风了,很可能你的媳妇就跟别人跑了。(开个小玩笑)。

穿插一个概念,叫做生产环境(线上环境):

未来的工作中会涉及到几个环境:

1、办公环境(入职之后,公司给你发个电脑)

笔记本电脑/台式机。

2、开发环境:有的时候,开发环境和办公环境是一个,有的时候,开发环境是单独的服务器,做前端/客户端,一般来说开发环境就是办公环境了。后端来说,很可能是单独的服务器,有的后端程序,会比较复杂。

1)一次时间特别久。

2)有的程序,启动要消耗很多的cpu和内存资源。办公电脑难以支撑。

3)有的程序比较依赖linux,在windows环境搭不起来。

3、测试环境(测试工程师用的)

4、线上环境/生产环境

(办公环境,开发环境,测试环境,统称为线下环境,外界用户无法访问到的)。线上环境则是外界用户能够访问到的。一旦生产环境出问题,一定会对于用户的使用产生影响!直接的影响到公司营收。

未来咱们去操作线上环境的任何一个设备/程序都要怀着12分的谨慎。

2)exists命令

exists判定key是否存在

语法:

返回值:key存在的个数。键值对存储的体系中(类似于哈希表)key得是唯一的呀。

这里的个数对于多个key来说是非常有用的 。他的查询复杂度为O(1),redis组织这些key就是按照哈希表的方式来组织的。

redis支持很多数据结构 =》指的是一个value可以是一些复杂的数据结构,redis自身的这些键值对,是通过哈希表的方式来组织的。redis具体的某个值,又可以是一些数据结构。

分开查询和一起查询会有什么区别吗。

我们要知道,redis是一个客户端,服务器结构的程序。客户端和服务器之间通过网络来进行通信!我们所敲的命令都会构建一个请求发送给服务器,服务器返回回复报文。要进行网络通信,它是相对于内存来说,效率比较低,成本比较高。

进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层,到物理层,层层封装。势必会导致传输速度慢。所以我们要尽量少发请求。能用一个命令不用两个命令。

3)del(delete)删除指定的key

语法,返回值:删除掉的key的个数。

redis主要的应用场景,就是作为缓存,此时redis里存的只是一个热点数据,全量数据是在mysql数据库中。此时如果把redis中的key删除了几个,一般来说,问题不大。但是如果把所有的数据或者一大半数据一下都干没了,这种影响会很大。相比之下,如果是mysql这样的数据,哪怕误删了一个数据,都可能影响很大的。如果把redis作为数据库,此时误删数据的影响就大了。如果把redis作为消息队列,这种情况误删数据就得按情况来具体分析了。所以我们不能乱删数据。自己挖坑自己跳,得不偿失。

4)expire命令

作用是给指定的key设置过期时间,key存活时间超出这个指定的值,就会被自动删除。设置的时间单位是秒。基于redis实现分布式锁,为了避免出现不能正确解锁的情况,通常都会在加锁的时候设置一下过期时间(所谓的使用redis作为分布式锁,就是给redis里写一个特殊的key value)。

语法:

pexpire key mseconds 毫秒级

返回值:1成功,0失败

此处的设定的过期时间,必须是针对已经存在的key设置,设置成功返回1,设置失败返回0。时间复杂度也是O(1)。

过期后get不到value。

5)ttl命令

ttl time to live 存活时间。网络原理IP协议报头中,有一个字段TTL。IP中的TTL不是用时间衡量过期的,而是用次数。

ttl是一个时间。查看当前key的过期时间还剩多少

pttl查询毫秒级的key的过期时间。

时间复杂度也是O(1)。

redis的key的过期策略 【经典面试题】

redis的key的过期策略是怎么实现的?

一个redis中可能同时存在很多很多key,这些key中可能有很大一部分都有过期时间,此时,redis服务器咋知道哪些key已经过期要被删除,哪些key还没过期?

如果直接遍历所有的key,显然是行不通的,效率非常低。

redis整体的策略是:

1、定期删除:此处也需要结合定期删除的操作,每次抽出一部分验证过期时间,保证这个抽取检查的过程足够快。对于定期删除的时间,有明确的要求:因为redis是单线程的程序。主要的任务(处理每个命令的任务,刚才扫描过期的key)如果扫描过期key消耗的时间太多了,就可能导致正常处理请求命令就被阻塞了,产生了类似key *这样的效果。

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

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

1)redis中并没有采取定时器的方式来实现过期key删除

2)如果有多个key过期,也可以通过一个定时器来高效/节省cpu的前提下来处理多个key。

为啥redis没有采取这种定时器的方式呢?

很难考证为啥,个人的猜测:基于定时器实现,势必就要引入多线程了。redis早期版本就是奠定了单线程的基调,引入多线程打破了作者的初衷。

定时器的实现原理:

定时器:在某个时间到达之后,执行指定的任务

1、基于优先级队列/堆

正常的队列是先进先出。而优先级队列则是按照指定的优先级,先出。啥叫优先级高?自定义的。在redis过期key的场景中,就可以通过“过期时间越早,就是优先级越高”。现在假定有很多key设置了过期时间,就可以把这些key加入到优先级队列中,指定优先级规则是过期时间早的先出队列。队首元素就是最早要过期的key!此时定时器中只要分配分配一个线程,让这个线程取检查队首元素,看是否过期即可!如果队首元素没有过期,后续元素一定没过期。此时扫描线程不需要遍历所有key只盯住这一个队首元素即可!另外在扫描线程检查队首元素过期时间的时候,也不能检查太频繁。此时做法就是可以根据当前时刻和队首元素的过期时间设置一个等待。当时间差不多到了,系统再唤醒这个线程。此时扫描线程,不需要高频扫描队首元素,把CPU的开销也节省下来了。

万一在线程休眠的时候,来了一个新的任务是11:30要执行。可以在新任务添加的时候,唤醒一下刚才的线程,重新检查一下队首元素,再根据时间差距重新调整阻塞时间即可。

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

把时间划分成很多小段(划分的粒度,看实际需求)。

每一个小段上都挂着一个链表,每个链表都代表一个要执行的任务,(相当于一个函数指针,以及对应的参数。有点像jiava中也可以通过对象来实现类似的效果)。 

假设需要添加一个key,这个key在300ms之后过期。添加到第三个格子,每个格子是100毫秒所以是第三个格子,此时这个指针,就会每隔固定的间隔每次走到一个格子,就会把这个格子上链表的任务尝试执行一下。对于时间轮来说,每个各自是多长时间,一共多少个格子都是需要根据实际的场景,灵活调配的。

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

6)type命令

返回key对应的value的类型。此处redis所有的key都是string,key对应的value可能会存在多种类型。

stream是redis作为消息队列的时候,使用这个类型的value。

在redis中上述类型操作方式差别很大,使用的命令,都是完全不同的。时间复杂度也是O(1)

小结

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

set:设置一个kv值

get:通过key得到value

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

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

del:删除指定的key

expire:给key设置过期时间

ttl:查询key的过期时间

type:查询key对应的value的类型。

接下来就是围绕每个数据结构来介绍相关命令了。

当前版本的redis支持10个数据类型。

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

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

相关文章

数据库概述(1)

课程主页:Guoliang Li Tsinghua 数据库在计算机系统中的位置 首先,数据库是在设计有大量数据存储需求的软件时必不可少可的基础。 最常见的是:我们通过app或者是浏览器来实现一些特定需求——比如转账、订车票。即引出背后的CS和BS两种网…

重学SpringBoot3-集成Redis(三)

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(三) 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码:自定义过期策略 3. 配置…

如何使用ssm实现民族大学创新学分管理系统分析与设计+vue

TOC ssm763民族大学创新学分管理系统分析与设计vue 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不…

【rCore OS 开源操作系统】Rust 字符串(可变字符串String与字符串切片str)

【rCore OS 开源操作系统】Rust 语法详解: Strings 前言 这次涉及到的题目相对来说比较有深度,涉及到 Rust 新手们容易困惑的点。 这一次在直接开始做题之前,先来学习下字符串相关的知识。 Rust 的字符串 Rust中“字符串”这个概念涉及多种类型&…

【EXCEL数据处理】000017 案例 Match和Index函数。

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000016 案例 Match和Index函数。使用的软件&#xff…

DenseNet算法:口腔癌识别

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 DenseNet算法结构 其基本思路与ResNet一致,但是它建立的是前面所有层和后面层的密集连接,它的另一大特色是通过特征在channel上的连接来实现特征重用。 二 设计理念 三…

成都跃享未来教育咨询有限公司抖音小店:引领教育咨询新风尚

在数字化浪潮席卷全球的今天,教育咨询行业正经历着前所未有的变革。成都跃享未来教育咨询有限公司,作为教育行业的一颗璀璨新星,凭借其前瞻性的教育理念与创新的运营模式,在抖音平台上开设了小店,不仅为广大学子及家长…

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…

C++多态、虚函数以及抽象类

目录 1.多态的概念 2.多态的定义及实现 2.1多态的构成条件 2.1.1实现多态还有两个必要条件 2.1.2虚函数 2.1.3虚函数的重写/覆盖 2.1.4多态场景的题目 2.1.5虚函数重写的一些其他问题 2.1.5.1协变(了解) 2.1.5.2析构函数的重写 2.1.6override和final关键字 2.…

【Springer上传手稿记录】《Signal, Image and Video Processing》

Springer上传手稿记录 以signal,image and video proecessing为例上传手稿或图片时提示上传失败无法编译成pdf错误1:出现Unknown theoremstyle相关错误错误2:command Illegal错误3:command I found no style file 通用问题问题1&a…

CORE MVC 过滤器 (筛选器)《2》 TypeFilter、ServiceFilter

TypeFilter、ServiceFilter ServiceFilter vs TypeFilter ServiceFilter和TypeFilter都实现了IFilterFactory ServiceFilter需要对自定义的Filter进行注册,TypeFilter不需要 ServiceFilter的Filter生命周期源自于您如何注册(全局、区域)&…

【AI学习】Mamba学习(二):线性注意力

上一篇《Mamba学习(一):总体架构》提到,Transformer 模型的主要缺点是:自注意力机制的计算量会随着上下文长度的增加呈平方级增长。所以,许多次二次时间架构(指一个函数或算法的增长速度小于二次…

SpringBoot框架下校园资料库的构建与优化

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

10.5今日错题解析(软考)

目录 前言面向对象技术——设计模式的应用场景计算机组成与体系结构——逻辑运算 前言 这是用来记录我备考软考设计师的错题的,今天知识点为设计模式的应用场景、逻辑运算,大部分错题摘自希赛中的题目,但相关解析是原创,有自己的…

【Python】Dejavu:Python 音频指纹识别库详解

Dejavu 是一个基于 Python 实现的开源音频指纹识别库,主要用于音频文件的识别和匹配。它通过生成音频文件的唯一“指纹”并将其存储在数据库中,来实现音频的快速匹配。Dejavu 的主要应用场景包括识别音乐、歌曲匹配、版权管理等。 ⭕️宇宙起点 &#x1…

class 004 选择 冒泡 插入排序

我感觉这个真是没有什么好讲的, 这个是比较简单的, 感觉没有什么必要写一篇博客, 而且这个这么简单的排序问题肯定有人已经有写好的帖子了, 肯定写的比我好, 所以我推荐大家直接去看“左程云”老师的讲解就很好了, 一定是能看懂的, 要是用文字形式再写一遍, 反而有点画蛇添足了…

windows下安装rabbitMQ并开通管理界面和允许远程访问

如题,在windows下安装一个rabbitMQ server;然后用浏览器访问其管理界面;由于rabbitMQ的默认账号guest默认只能本机访问,因此需要设置允许其他机器远程访问。这跟mysql的思路很像,默认只能本地访问,要远程访…

Oracle架构之表空间详解

文章目录 1 表空间介绍1.1 简介1.2 表空间分类1.2.1 SYSTEM 表空间1.2.2 SYSAUX 表空间1.2.3 UNDO 表空间1.2.4 USERS 表空间 1.3 表空间字典与本地管理1.3.1 字典管理表空间(Dictionary Management Tablespace,DMT)1.3.2 本地管理方式的表空…

计算机网络(十) —— IP协议详解,理解运营商和全球网络

目录 一,关于IP 1.1 什么是IP协议 1.2 前置认识 二,IP报头字段详解 三,网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四,公网IP和私有IP 五,理解运营商和全球网络 六&#xff…

基于大数据技术的颈椎病预防交流与数据分析及可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…