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个数据类型。

相关文章:
Redis --- 第三讲 --- 通用命令
一、get和set命令 Redis中最核心的两个命令 get 根据key来取value set 把key和value存储进去 redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。 语法 set key value : key和value都是字符串。 对于上述这里的key value 不需要加上引号&#…...
【Linux】进程间关系与守护进程
超出能力之外的事, 如果永远不去做, 那你就永远无法进步。 --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组2 会话3 控制终端4 作业控制5 守护进程 1 进程组 之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(P…...
【可视化大屏】将柱状图引入到html页面中
到这里还是用的死数据,先将柱状图引入html页面测试一下 根据上一步echarts的使用步骤,引入echarts.js后需要初始化一个实例对象,所以新建一个index.js文件来进行创建实例化对象和配置数据信息等。 //在index.html引入<script src"j…...
gm/ID设计方法学习笔记(一)
前言:为什么需要gm/id (一)主流设计方法往往侧重于强反型区(过驱>0.2V),低功耗设计则侧重于弱反型区(<0),但现在缺乏对中反型区的简单和准确的手算模型。 1.对于…...
高度细化的SAGA模式实现:基于Spring Boot与RabbitMQ的跨服务事务
场景与技术栈 场景:电商系统中的订单创建流程,涉及订单服务(Order Service)、库存服务(Inventory Service)、支付服务(Payment Service)。 技术栈: Java 11 Spring Bo…...
Vue工程化开发
Vue工程化开发 一、工程化开发和脚手架 1.开发Vue的两种方式 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具(例如:webpack)的环境中开…...
Ray_Tracing_The_Next_Week下
5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性,但其实并没有使用,而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片,通过std_image库stbi_load(path)…...
ES索引生命周期管理
基于如何 定时删除ES索引过期数据 而引发的一系列关于ES索引生命周期管理ILM(Index Lifecycle Management)的学习 快速上手 :定时删除ES索引中的过期数据 1. ILM解决什么问题? ES从6.7版本引入ILM,通过ILM可以解决哪些问题呢? 自动新建…...
Oracle数据库体系结构基础
关于Oracle体系结构 基于Oracle11g体系结构 目标: 了解Oracle体系结构掌握逻辑存储结构掌握物理存储结构熟悉Oracle服务器结构熟悉常用的数据字典 Oracle数据库管理中的重要的三个概念 实例(instance):实例是指一组Oracle后台进程以及在服务器中分配…...
QT学习笔记4.5(文件、参数文件)
QT学习笔记4.5(文件、参数文件) 1.保存配置参数 1.使用QSettings保存到注册表,ini文件 2.文件存储:使用 QFile 和其他类将参数保存到文本文件、二进制文件、XMLWENJIAN、JSON 文件等。 文本文件:以简单的键值对格式…...
服务器虚拟化的详细学习要点
服务器虚拟化的详细学习要点可以归纳为以下几个方面: 1. 基本概念与原理 定义与原理:了解服务器虚拟化是一种将物理服务器资源转化为虚拟服务器资源的技术,允许在一台物理服务器上运行多个虚拟服务器。 虚拟化层次:理解虚拟化的不同层次,如裸机虚拟化(Type 1)和托管虚…...
创建一个Java Web API项目
创建一个Java Web API涉及多个步骤和技术栈,包括项目设置、依赖管理、数据访问层实现、业务逻辑实现、控制层开发以及测试和部署。在这篇详解中,我将带领你通过一个完整的Java Web API实现流程,采用Spring Boot和MyBatis-Plus作为主要技术工具…...
对称加密算法的使用Java和C#
1. JAVA中的使用 1.1.原生使用 Main函数代码 import symmetric_encryption.AESExample; import symmetric_encryption.BlowfishExample; import symmetric_encryption.DESExample; import symmetric_encryption.TripleDESExample; public class App { public static…...
10款好用的开源 HarmonyOS 工具库
大家好,我是 V 哥,今天给大家分享10款好用的 HarmonyOS的工具库,在开发鸿蒙应用时可以用下,好用的工具可以简化代码,让你写出优雅的应用来。废话不多说,马上开整。 1. efTool efTool是一个功能丰富且易用…...
ubuntu22.04中备份Iptables的设置
在 Ubuntu 22.04 中备份 iptables 的设置,您可以采用以下几种方法: 使用 iptables-save 命令: 您可以使用 iptables-save 命令将当前的 iptables 规则保存到文件中。例如,要将规则保存到 /etc/iptables/rules.v4 文件中࿰…...
(PyTorch) 深度学习框架-介绍篇
前言 在当今科技飞速发展的时代,人工智能尤其是深度学习领域正以惊人的速度改变着我们的世界。从图像识别、语音处理到自然语言处理,深度学习技术在各个领域都取得了显著的成就,为解决复杂的现实问题提供了强大的工具和方法。 PyTorch 是一个…...
若依从redis中获取用户列表
因为若依放入用户的时候,会在减值中添加随机串,所以用户的key会在redis中变成: login_tokens:6af07052-b76d-44dd-a296-1335af03b2a6 这样的样子。 如果用 Set<Object> items redisService.redisTemplate.keys("login_tokens&…...
文件上传之%00截断(00截断)以及pikachu靶场
pikachu的文件上传和upload-lab的文件上传 目录 mime type类型 getimagesize 第12关%00截断, 第13关0x00截断 差不多了,今天先学文件上传白名单,在网上看了资料,差不多看懂了,但是还有几个地方需要实验一下&#…...
Chainlit集成LlamaIndex并使用通义千问实现和数据库交互的网页对话应用(text2sql)
前言 我在之前的几篇文章中写了如何使用Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用,但是发现Langchain的几种和数据库交互的组件都不够让我满意,虽然已经满足了大部分场景的需求,但是问题还是很多,比如…...
计组复习笔记
计组笔记 汇编部分 通用寄存器(General Registers): AX (Accumulator): 用于累加运算,也是乘法和除法的默认寄存器。BX (Base Register): 可以用作一个基址寄存器,通常用于存放数据的基地址。CX (Counter Register): 通常用于循环…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
