Redis 键值对操作全攻略
文章目录
- 一 . get 和 set
- 二 . keys *
- 三 . exists
- 四 . del
- 五 . expire
- 六 . ttl
- 七 . Redis 的 key 的过期策略
- 八 . 定时器的实现
- 8.1 基于优先级队列
- 8.2 基于时间轮实现的定时器
- 九 . type
- 十 . 数据库管理相关命令
Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家带来的是 Redis 一些最基础的命令 , 那这些命令并没有涉及到 Redis 核心数据结构 , 只是简单的操作键值对 , 难度相对更简单一些 .
本专栏旨在为初学者提供一个全面的 Redis 学习路径,从基础概念到实际应用,帮助读者快速掌握 Redis 的使用和管理技巧。通过本专栏的学习,能够构建坚实的 Redis 知识基础,并能够在实际学习以及工作中灵活运用 Redis 解决问题 .
专栏地址 : Redis 入门实践
一 . get 和 set
get 和 set 是 Redis 中最核心的两个命令
Redis 是按照键值对的方式存储数据的 , 那 get 就是根据 key 去取 value , set 就是把 key 和 value 存储进去
注意 : 必须要先进入到 Redis 客户端 : redis-cli , 才能进行后续操作
set 的语法 : set key value , 其中 key 和 value 都是字符串
127.0.0.1:6379> set key1 value1 # 存储键值对
OK
127.0.0.1:6379> set "key2" "value2" # key 和 value 默认是字符串,我们也可以手动加上引号
OK
对于上面的 key 和 value , 我们并不需要手动加上引号 , 他默认表示的就是字符串 , 加上的话就多此一举了
get 的用法 : get key
127.0.0.1:6379> get key1 # get 命令直接通过 key 就可以找到 value
"value1"
127.0.0.1:6379> get error # 如果当前 key 不存在 , 会返回 nil
(nil)
二 . keys *
Redis 是一个键值对结构 , 那 key 就是固定的字符串 , value 就有很多类型
- 字符串
- 哈希表
- 列表
- 集合
- 有序集合
- …
那我们主要学习的是这几种数据结构中的命令
而 Redis 中还有一些全局命令 , 可以搭配任意一个数据结构来使用
比如 : keys , 他是用来查询当前服务器上匹配的 key
我们就可以通过一些特殊的符号 (通配符) 来描述 key 的模样 , 那如果有匹配上述模样的 key , 就能被查询出来
语法 : keys pattern
pattern 是一个包含特殊符号的字符串 , 它存在的意义就是去描述想要匹配的字符串是长什么样的 (类比正则表达式)
那 pattern 的写法有很多 , 我们来看一下

https://redis.io/commands/keys/
?表示可以匹配任意一个字符
*表示匹配任意个数的字符 (0 个 / 多个)
[ae]表示方括号里面的字母可以被匹配到
比如 : [] 这个位置只能匹配到 a / e , 写的就不行
[^e]表示排除 [] 中的内容
比如 : [^e] 只有 e 匹配不了 , 其他的都能匹配
[a-b]: 匹配 a-b 这个范围内的字符 , 包含两侧边界
那我们就来举个例子 , 了解一下每个通配符的用法
# 设置键值对
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 2
OK
127.0.0.1:6379> set hbllo 3
OK
127.0.0.1:6379> set hllo 4
OK
127.0.0.1:6379> set heeeeeeeeeeeeeeeeeeeeelo 5
OK127.0.0.1:6379> keys h?llo # ? 位置匹配任意一个字符
1) "hbllo"
2) "hallo"
3) "hello"
127.0.0.1:6379> keys h*llo # * 位置匹配任意个数个字符
1) "hbllo"
2) "hallo"
3) "hllo"
4) "hello"
127.0.0.1:6379> keys h[abe]llo # [] 位置可以匹配到 a、b、e
1) "hbllo"
2) "hallo"
3) "hello"
127.0.0.1:6379> keys h[^ae]llo # [] 位置匹配不到 a 和 e
1) "hbllo"
127.0.0.1:6379> keys h[a-e]llo # [] 位置可以匹配到 [a,e] 之间的字符
1) "hbllo"
2) "hallo"
3) "hello"
那 keys 这个命令 , 他的时间复杂度是 O(N) , 所以在生产环境中一般都会禁止使用 keys 这个命令
尤其是 keys * , keys * 直接将 Redis 中所有的 key 都会查询出来
那 Redis 通常会被用作缓存 , 也就是说他是挡在 MySQL 前面的 , 那万一 Redis 被 keys * 阻塞住了 , 此时其他的查询 Redis 操作就会超时 , 此时这些请求就会直接查数据库 , 那突然一大波请求过来了 , MySQL 也承受不住压力 , 也会崩溃掉
三 . exists
exists 的作用是判断某个 key 是否存在
语法 : exists key1 [key2 …]
可以查询多个 key 是否存在
他的返回值是给定的 key 存在的个数
他指的是针对多个 key , 判断存在的个数 .
而不是说我们在设置键值对的时候 , key 是可以重复的 , 然后统计同一个 key 对应的 value 的个数
时间复杂度 : O(1) , 但是并不绝对 , 有可能很多数据 , 那时间复杂度就变成了 O(N)
Redis 组织数据就是按照哈希表的方式来组织的 , 所以操作的时间复杂度一般都是 O(1)
127.0.0.1:6379> keys * # 查看所有键值对
1) "heeeeeeeeeeeeeeeeeeeeelo"
2) "hbllo"
3) "key2"
4) "hallo"
5) "\xac\xed\x00\x05t\x00\x132023-10-30 04_41_36"
6) "hllo"
7) "key1"
8) "hello"
127.0.0.1:6379> exists hello # 判断某个 key 是否存在
(integer) 1
127.0.0.1:6379> exists hello hbllo # 判断多个 key 是否存在
(integer) 2 # 返回值代表多个 key 存在的个数
127.0.0.1:6379> exists hello nonono # 只返回 key 存在的个数
(integer) 1
❓ 那比如这条语句 : exists hello hbllo , 我们为什么不选择写两次 exists 呢 ?
✔️ Redis 是一个 “客户端-服务器” 结构的程序 , 那客户端和服务器之间是通过网络来进行通信的 . 如果分开多次写 , 就会产生更多次数的网络通信 , 网络通信相比于操作内存效率又低、成本又高 , 所以能够一次传输的话就尽量一次进行传输
四 . del
del 的用途是删除指定的 key , 他也可以一次删除一个或者一次删除多个
语法 : del key1 [key2 …]
时间复杂度 : O(1)
删除 n 个数据 , 那时间复杂度同 exists , 都是 O(N)
返回值 : 删除掉的 key 的个数 , 如果 key 不存在返回 0
127.0.0.1:6379> keys * # 查看当前所有的键
1) "k1"
2) "k4"
3) "k3"
4) "k2"
127.0.0.1:6379> del k1 # 删除键值对
(integer) 1
127.0.0.1:6379> del k2 k3 # 返回值代表删除元素的个数
(integer) 2
127.0.0.1:6379> del notexist # 如果 key 不存在返回 0
(integer) 0
五 . expire
expire 的作用是给指定的 key 设置过期时间 , 如果 key 超过这个指定的时间就会被自动删除
使用场景比如 : 手机验证码、指定时间内有效的优惠券等
语法 : expire key 秒
还有一个命令 , 是 pexpire key 毫秒 , 这个命令将时间更加细化了
时间复杂度 : O(1)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> expire k1 3 # 设定过期时间 -> 必须针对已经存在的 key 才能设置
(integer) 1 # 设置成功返回 1
127.0.0.1:6379> expire k2 3 # 针对不存在的 key 设置过期时间就会失败
(integer) 0 # 设置失败返回 0
127.0.0.1:6379> expire k1 3 # 到达过期时间自然就会失效, 再去设置就会失败
(integer) 0
六 . ttl
ttl (time to live) 的作用是用来查询过期时间的
127.0.0.1:6379> set k1 v1 # 设置键值对
OK
127.0.0.1:6379> expire k1 10 # 设置过期时间
(integer) 1
127.0.0.1:6379> ttl k1 # 查询过期时间
(integer) 7
127.0.0.1:6379> ttl k1 # 返回值为 -2 代表已经过期
(integer) -2
七 . Redis 的 key 的过期策略
❓ 我们思考一个问题 : Redis 的 key 的过期策略是怎样实现的 ?
一个 Redis 中可能同时存在很多很多 key , 这些 key 中可能有很大一部分都有过期时间 , 此时 Redis 服务器是怎样知道哪些 key 已经过期要被删除 , 哪些 key 还没过期呢 ?
✔️
如果遍历所有的 key , 显然是行不通的 , 它的效率是非常低的 .
那 Redis 整体的策略是两点 :
- 定期删除 : 隔一段时间删除一批过期的 key
- 惰性删除 : 假设这个 key 已经到过期时间了 , 但是暂时不删除他 , 那他的 key 还存在 . 后续再一次访问 , 正好又访问到了这个 key , 于是这次 Redis 服务器就会触发删除操作 , 返回 nil
比如超市卖饮料 , 老板并不知道这个饮料过没过期 , 超市老板就有两种方案
定期删除 : 每隔一段时间就看饮料过没过期
惰性删除 : 有人买的时候再检查过没过期 , 过期了就不卖了
Redis 采取的策略是每次抽取一部分键值对验证过期时间 , 并且要保证抽查的过程足够快
那为什么要让抽查的过程足够快呢 ?
因为 Redis 是单线程的程序 , 主要任务并不是扫描过期的 key , 如果扫描过期的 key 消耗的时间太多 , 就可能导致正常处理请求的命令就被阻塞了
八 . 定时器的实现
定时器指的是在某个时间到达之后 , 执行指定的任务
那定时器的实现有两种思路
- 基于优先级队列
- 基于时间轮实现的定时器
8.1 基于优先级队列
正常的队列是符合先进先出的规则的 , 但是优先级队列则是按照指定的优先级进行先出操作的 .
那优先级一般来说是可以自定义的 , 那在 Redis 中一般就是 “越早过期 , 优先级越高” .
那现在假设有很多 key 设置了过期时间 , 就可以将这些 key 加入到优先级队列中 , 指定过期时间早的先出队列
我们只需要给定时器分配一个线程 , 让这个线程去检查队首元素 , 看一下是否过期即可 , 如果说队首元素还没过期 , 那后续元素就一定没过期 , 此时扫描线程就不需要遍历所有 key , 只需要关注队首元素即可
另外 , 在扫描队首元素过期时间的时候 , 也不能检查的太过于频繁 , 这样会消耗额外的资源 .
那我们的做法就可以在检查队首元素的时候去看一下队首元素的过期时间 , 然后设置等待时间为当前时刻和队首元素的过期时间的差 , 当过期时间到了就去唤醒队首元素这个线程
但是万一在线程休眠的时候 , 来了一个新任务 , 那我们就需要唤醒一下线程 , 重新检查一下队首元素的过期时间以及新任务的过期时间 , 如果新的线程过期时间更小了 , 那就需要将该任务添加到队首 , 并且更新线程阻塞等待的时间
8.2 基于时间轮实现的定时器

但是 Redis 并没有采取上述的两种方案 , 在这里只是给大家介绍一下
九 . type
type 的作用就是查看 key 对应的 value 的数据类型
Redis 中所有的 key 都是 String 类型 , 而 value 是不同的数据类型
127.0.0.1:6379> set k1 v1 # 设置键值对
OK
127.0.0.1:6379> type k1 # 获取 key 对应的 value 的数据类型
string
127.0.0.1:6379> lpush k2 111 222 333 # 设置列表
(integer) 3
127.0.0.1:6379> type k2 # 获取 key 对应的 value 的数据类型
list
时间复杂度 : O(1)
小结 :
set : 设置键值对
get : 获取键值对
keys : 查看匹配规则的 key
exists : 用来判定指定的 key 是否存在
del : 删除指定的 key
expire : 给 key 设置过期时间
ttl : 查询 key 的过期时间
type : 查询 key 对应的 value 的类型
十 . 数据库管理相关命令
在我们之前学习 MySQL 的时候 , 有一个概念 : database , 一个 MySQL 服务器上可以有很多个 database , 那一个 database 里面还有很多表 .
其实 Redis 中也有 database 这样的概念 , 但是不像在 MySQL 中使用那么随意 , 想创建多少个就多少个 .
在 Redis 中的 database 是现成的 , 我们不能创建新的数据库 , 也不能删除提供的数据库 .
Redis 提供给了我们 16 个数据库 , 编号从 0 到 15 , 那这 16 个数据库之间是相互隔离的 (相互之前都不会有影响) , 默认使用的是 0 号数据库 .
我们可以通过 select dbIndex 来去切换数据库
127.0.0.1:6379> set k1 v1 # 在 0 号数据库中设置键值对
OK
127.0.0.1:6379> get k1 # 在 0 号数据库中能够获取到该键值对
"v1"
127.0.0.1:6379> select 6 # 切换到 6 号数据库
OK
# [6] 表示第 6 号数据库
127.0.0.1:6379[6]> get k1 # 此时就获取不到该键值对了
(nil)
127.0.0.1:6379[6]> select 0 # 此时在切换回 0 号数据库
OK
127.0.0.1:6379> get k1 # 就又可以获取到该键值对了
"v1"
我们还可以通过 dbsize 获取当前数据库中 key 的个数
127.0.0.1:6379> set k1 v1 # 在 0 号数据库设置键值对
OK
127.0.0.1:6379> dbsize # 获取当前数据库的键值对个数
(integer) 1
127.0.0.1:6379> select 6 # 切换到 6 号数据库
OK
127.0.0.1:6379[6]> dbsize # 此时 6 号数据库没设置过任何数据
(integer) 0 # 就会检索到 0 个键值对
接下来就是两个危险又刺激的命令了 : flushdb、flushall
flushdb : 清空当前数据库
flushall : 清空所有数据库
以后在公司中千万不能使用 , 尤其是在生产环境上 , 不然会有很严重的后果 .
对于 Redis 操作键值对的常见命令就已经讲解完毕了 , 如果对你有帮助的话请一键三连~

相关文章:
Redis 键值对操作全攻略
文章目录 一 . get 和 set二 . keys *三 . exists四 . del五 . expire六 . ttl七 . Redis 的 key 的过期策略八 . 定时器的实现8.1 基于优先级队列8.2 基于时间轮实现的定时器 九 . type十 . 数据库管理相关命令 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章…...
【C语言】---- return的作用
return 是C语言中的一个关键字,用于从函数中返回值。它有以下几个作用: 1 返回值 return 用于将函数的结果返回给调用者。在函数执行过程中,当遇到 return 语句时,函数将立即停止执行,并将其后的表达式的值作为函数的…...
如何制作新生资料收集系统?
新学年伊始,学校需要高效收集学生信息和证件照。易查分提供了一个便捷的解决方案,通过创建一个集成信息和图片的收集系统,可以快速完成这项工作,并将信息导出为PDF,方便打印和存档。 制作步骤如下: 1. 准备…...
pyecharts可视化数据大屏
1. 简介 1.1. 概述 PyECharts 是一个用于生成 ECharts 图表的 Python 库。ECharts 是一款由阿里巴巴开发的开源 JavaScript 图表库,广泛应用于网页端的数据可视化。而 PyECharts 将 ECharts 的功能带到了 Python 环境中,使得 Python 开发者可以方便地在数据分析、机器学习等…...
uniapp - H5 在 UC 浏览器中返回上一页失效的解决方案
1. 前言 最近使用 uniapp 开发的 H5 在测试中遇到的问题:有A、B两个页面,反复从A页面进入B页面后,在B页面会存在返回函数失效问题。经过测试发现,如果反复进入B页面的参数相同,在第三次进入后,返回就会失效,不管是 uniapp 自带的头部导航,还是 uni.navigateBack API 都…...
利用KMeans重新计算自己数据集的anchor
在YOLOv5或YOLOv7中,anchors(锚框)是预设的一组不同大小、不同长宽比的边界框,它们用于在图像中的每个网格单元上进行偏移和缩放,以生成目标的候选框。这些anchors的设定对于提高目标检测的效率和准确性至关重要。 并…...
分类任务实现模型集成代码模版
分类任务实现模型(投票式)集成代码模版 简介 本实验使用上一博客的深度学习分类模型训练代码模板-CSDN博客,自定义投票式集成,手动实现模型集成(投票法)的代码。最后通过tensorboard进行可视化࿰…...
从Milvus迁移DashVector
本文档演示如何从Milvus将Collection数据全量导出,并适配迁移至DashVector。方案的主要流程包括: 首先,升级Milvus版本,目前Milvus只有在最新版本(v.2.3.x)中支持全量导出其次,将Milvus Collection的Schema信息和数据…...
彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)
欢迎来到雲闪世界。大家好!对于那些还不认识我的人,我叫 Francois,我是 Meta 的研究科学家。我热衷于解释先进的 AI 概念并使其更容易理解。 今天,让我们深入探讨计算机视觉领域最重要的贡献之一:Vision Transformer&…...
vue3 v-bind=“$attrs“ 的一些理解,透传 Attributes相关说明及事例说明
1、可能小伙伴们经常会在自己的项目中看到v-bind"$attrs",这个一般是在自定义组件中看到。 比如: <template><BasicModalv-bind"$attrs"register"registerModal":title"getTitle"ok"handleSubm…...
鸿蒙开发基础知识-页面布局【第四篇】
1.类型转换 2.交互点击事件 3.状态管理 4.forEch渲染和右上角图标 测试案例 Stack 层叠布局一个生肖卡 5. 动画展示图片 6. Swiper 轮播组件的基本使用 图片等比显示 aspectRatio()...
用CSS实现前端响应式布局
一、响应式布局的重要性 随着移动设备的普及,越来越多的用户通过手机、平板电脑等设备访问网页。如果网页不能适应不同的屏幕尺寸,就会出现布局混乱、内容显示不全等问题,严重影响用户体验。响应式布局可以确保网页在各种设备上都能保持美观…...
【docker】docker启动sqlserver
sqlserver-docker官方地址 # sqlserver不是从docker的中央仓库拉取的,而是从ms的仓库拉取的。 docker pull mcr.microsoft.com/mssql/server:2019-latest# 宿主机即docker程序运行的linux服务器 docker run -d \ --user root \ --name mssql2019 \ -e "ACCEPT…...
Python爬虫01
requests模块 文档 安装 pip/pip3 install requestsresponse.text 和 response.content的区别 1.response.text 等价于 response.content.decode("推测出的编码字符集")response.text 类型:str 编码类型:requests模块自动根据Http头部对…...
关于vue项目启动报错Error: error:0308010C:digital envelope routines::unsupported
周五啦,总结一下这周遇到的个别问题吧,就是关于启动项目的时候其他的东西都准备好了,执行命令后报错Error: error:0308010C:digital envelope routines::unsupported 这里看一下我标注的地方,然后总结一下就不难发现问题所在 查看…...
随笔1:数学建模与数值计算
目录 1.1 矩阵运算 1.2 基本数学函数 1.3 数值求解 数学建模与数值计算 是将实际问题通过数学公式和模型进行描述,并通过计算获得模型解的过程。这是数学建模中最基本也是最重要的环节之一。下面是详细的知识点讲解及相应的MATLAB代码示例。 1.1 矩阵运算 知识点…...
SDN架构详解
目录 1)经典的IP网络-分布式网络 2)经典网络面临的问题 3)SDN起源 4)OpenFlow基本概念 5)Flow Table简介 6)SDN的网络架构 7)华为SDN网络架构 8)传统网络 vs SDN 9…...
platform框架
platform框架 注册设备进入总线platform_device_register函数 注册驱动进入总线platform_driver_register函数 注册设备进入总线 platform_device_register函数 int platform_device_register(struct platform_device *pdev) struct platform_device {const char * name; 名…...
零成本搞定静态博客——十分钟安装hugo与主题
文章目录 hugo介绍hugo安装与使用方式一:新建站点自建主题方式二:新建站点使用系统推荐的主题 hugo介绍 通过 Hugo 你可以快速搭建你的静态网站,比如博客系统、文档介绍、公司主页、产品介绍等等。相对于其他静态网站生成器来说,…...
windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时
某些并行循环不需要执行所有迭代。 例如,搜索值的算法可以在找到值后终止。 OpenMP 不提供中断并行循环的机制。 但是,可以使用布尔值或标志来启用循环迭代,以指示已找到解决方案。 并发运行时提供允许一个任务取消其他尚未启动的任务的功能。…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

