【Redis】Redis键值存储

news2024/9/25 3:27:07

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪

在这里插入图片描述

文章目录

  • Redis键值概述
    • 一、Redis数据类型概述
      • 常用数据类型
        • String
        • List
        • Hash
        • Set
        • Zset
      • 扩展数据类型
        • BitMap
        • HyperLogLog
        • GEO
        • BitField
        • Stream
    • 二、Redis键(key)操作
      • 常用操作及示例
        • keys *
        • exists key
        • type key
        • del key
        • unlink key
        • ttl key
        • expire key seconds
        • move key dbindex
        • select dbindex
        • dbsize
        • flushdb
        • flushall
      • 常用操作汇总
  • 总结

Redis键值概述


一、Redis数据类型概述


首先要强调一点:Redis是key value类型的数据库,Redis所说的数据类型都是key value中的value的数据结构,key都是字符串。

常用数据类型

Redis中有经常使用的有五大数据类型,分别是——String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)

image-20240510193727202
String

String是redis最基本的类型,一个key对应一个value。

String类型是二进制安全的,意思是Redis的String可以包含任何数据,比如jpg图片或者序列化的对象 。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。

image-20240514151952654

List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

List中最多可以最多可以包含 2 32 − 1 2^{32} - 1 2321 个元素 (4294967295, 每个列表超过40亿个元素)。

image-20240514152644796

Hash

Redis Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,Hash 特别适合用于存储对象。

Redis 中每个 Hash 可以存储 2 32 − 1 2^{32} - 1 2321 键值对 (4294967295, 每个哈希结构可存储40多亿个元素)。

image-20240514153315227

Set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中Set集合是通过哈希表实现的(这里先这样认为),所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 2 32 − 1 2^{32} - 1 2321​ (4294967295, 每个集合可存储40多亿个成员)。

image-20240514153617056

Zset

Redis Zset 和 Set 一样也是String类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序

Zset的成员是唯一的,但分数(score)却可以重复。

Zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2 32 − 1 2^{32} - 1 2321

image-20240514153641446

扩展数据类型

随着 Redis 版本的更新,后面又支持了五种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8.9 版本新增)、GEO(3.2 版新增)、BitField(3.2 版新增)、Stream(5.0 版新增)

BitMap

Redis中的BitMap不是一个独立的数据类型,而是基于String类型实现的一种特殊的数据结构。BitMap主要用于存储大量二进制位(0或1)的数据,这些位可以代表不同的状态或标志。

BitMap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行 0|1 的设置,表示某个元素的值或者状态,时间复杂度为O (1)。由于bit是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。

示例如下图:

image-20240514165831743

Redis的BitMap实际上是利用String类型的最大容量(512 MB)存储一个连续的二进制序列,其中每个字节的8位可以分别代表8个独立的状态。这意味着你可以用一个BitMap来跟踪多达数百万甚至数十亿的状态,只要状态总数不超过,即大约 2 32 2^{32} 232

image-20240514165524982

HyperLogLog

HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2 64 2^{64} 264 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

image-20240514170440732

GEO

Redis的GEO类型主要用于存储地理位置信息,并对存储的信息进行操作。GEO实际上是一种有序集合(zset),它的每个元素都包含三个属性:经度(longitude)、纬度(latitude)和位置名称(member)。通过这些属性,我们可以在Redis中存储地理位置的坐标,并对它们进行一些有用的操作。

image-20240514170802582

BitField

Redis的BITFIELD命令可以将一个Redis字符串看作是一个由二进制位组成的数组,并对这个数组中任意偏移进行访问。BITFIELD命令的作用在于它能够将很多小的整数储存到一个长度较大的位图中,又或者将一个非常庞大的键分割为多个较小的键来进行储存,从而非常高效地使用内存,使得Redis能够得到更多不同的应用,特别是在实时分析领域。

说白了就是通过BITFIELD命令我们可以一次性对多个比特位域进行操作。

image-20240514170821429

Stream

Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。

而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失

image-20240514170841776


二、Redis键(key)操作


常用操作及示例

keys *

查看当前库的所有key

示例如下:

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"

exists key

检查key是否存在,存在返回1,不存在返回0

示例如下:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k3
(integer) 0

type key

返回key的类型

示例如下:

127.0.0.1:6379> type k1
string

del key

删除一个或多个key

示例如下:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"

unlink key

非阻塞删除一个或多个key,并异步释放和key相关的内存;返回1表示删除成功,返回0表示删除失败

示例如下:

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> unlink k1 
(integer) 1
127.0.0.1:6379> keys *
1) "k2"

ttl key

获取key的剩余过期时间,单位为秒;-1表示永不过期,-2表示已过期

示例如下:

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 设置过期时间为10s
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2

expire key seconds

设置key的过期时间,单位为秒;返回1表示设置成功,返回0表示设置失败

自Redis 7.0,expire支持如下参数:

  • NX:只有当key没有设置过期时间,才会执行命令(已经设置过的,不能再设置)
  • XX :只有当key有过期时间,才会执行命令设置(没有设置过的,不能设置)
  • GT :只有当新的过期时间大于当前过期时间时,才会设置(只会增加过期时间)
  • LT :只有当新的过期时间大于当前过期时间时,才会设置(只会减少过期时间)

可选参数这里先不做演示,有兴趣的小伙伴可以自己去尝试。

示例如下:

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 设置过期时间为10s
(integer) 1 # 1表示成功,0表示失败
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2

Redis 的过期时间设置有四种形式:

  • EXPIRE 秒——设置指定的过期时间(秒),表示的是时间间隔。

  • PEXPIRE 毫秒——设置指定的过期时间,以毫秒为单位,表示的是时间间隔。

  • EXPIREAT 时间戳-秒——设置指定的 Key 过期的 Unix 时间,单位为秒,表示的是时间/时刻。

  • PEXPIREAT 时间戳-毫秒——设置指定的 Key 到期的 Unix 时间,以毫秒为单位,表示的是时间/时刻。


move key dbindex

将当前数据库的key移动到给定的数据库dbindex(0~15)。

Redis支持多个数据库,每个数据库都是一个独立的键值空间,这意味着同一个Redis实例中的不同数据库可以拥有相同的key。在某些情况下,我们可能需要将一个key从一个数据库移动到另一个数据库。

示例如下:

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> move k1 13
(integer) 1

select dbindex

切换到指定的数据库dbindex(0~15),默认为0。

示例如下:

127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k2"

dbsize

返回当前数据库的key的总数

示例如下:

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> dbsize
(integer) 1

flushdb

删除当前数据库中的所有Key,不会影响其他库

示例如下:

127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> flushdb
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 不影响其他库
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

flushall

删除所有数据库中的所有Key

示例如下:

127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k3"
2) "k4"
127.0.0.1:6379[13]> flushall
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 0和13号数据库中的数据都被清除了
OK
127.0.0.1:6379> keys *
(empty array)

常用操作汇总

命令描述
keys *查看当前库的所有key
exists key检查key是否存在,存在返回1,不存在返回0
type key返回key的类型
del key删除一个或多个key
unlink key删除一个或多个key,并异步释放和key相关的内存
ttl key获取key的剩余过期时间,单位为秒;-1表示永不过期,-2表示已过期。
expire key seconds设置key的过期时间,单位为秒
move key dbindex将当前数据库的key移动到给定的数据库dbindex
select dbindex切换到指定的数据库dbindex
dbsize返回当前数据库的key的总数
flushdb删除当前数据库中的所有Key
flushall删除所有数据库中的所有Key

这里补充一点,Redis中的操作一般是1代表操作执行成功,0代表操作执行失败。


总结


在本文中,我们对Redis的键值存储进行了全面的概述和介绍。首先,我们了解了Redis的五大基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和Zset(有序集合),并探讨了它们各自的特点和用法。随后,我们介绍了五种扩展数据类型:BitMap、HyperLogLog、GEO、BitField和Stream,以及它们在实际应用中的用途和优势。

在键(key)操作方面,我们涵盖了常用的操作,包括查看、检查、删除、移动、切换数据库以及设置过期时间等。这些操作丰富了我们对Redis数据管理的理解,使我们能够更有效地管理和操作Redis中的数据。

通过本文的学习,读者可以更加深入地了解Redis的键值存储特性,为其在实际应用中的使用提供了更多的参考和指导。Redis作为一款高性能的键值存储数据库,在各种场景下都具有广泛的应用前景,希望本文能为读者在Redis的学习和应用上提供一些帮助和启发。


如果讲解有不对之处还请指正,我会尽快修改,多谢大家的包容。

如果大家喜欢这个系列,还请大家多多支持啦😋!

如果这篇文章有帮到你,还请给我一个大拇指 👍和小星星 ⭐️支持一下白晨吧!喜欢白晨【Redis】系列的话,不如关注👀白晨,以便看到最新更新哟!!!

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

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

相关文章

网络安全从业者“行话”

目录 ​编辑 一、攻击篇 1.攻击工具 2.攻击方法 3.攻击者 二、防守篇 1.软硬件 2.技术与服务 网络安全学习资源分享: 特别声明 一、攻击篇 1.攻击工具 肉鸡 所谓“肉鸡”是一种很形象的比喻&…

地平线旭日X3开发板基于MIPI Camera的目标检测 web 端展示调试记录

终于将MIPI Camera在web端显示出来了, 其实很简单的事情,但是因为一个网络的问题,自己研究了好几天, 查遍了论坛所有帖子,最后还是在地平线专家们的指导下,发现问题所在。 言归正传,将自己的…

python --Anaconda下载、安装

下载镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/安装 等待安装完成,时间有点长,等了差不多5分钟左右。 验证conda是否安装成功 打开命令行窗口,输入conda --version 很遗憾,命令行回显是’conda’不是内部或…

Malbers Inventory System

Inventory插件为Malbers动物管理员生态系统带来了强大的库存系统,具有以下功能:通知系统、库存集、自定义物品反应等 ✔️特征 项目管理 收集和存储项目 库存显示 通知系统 物品所有者 库存集合 项目操作 保存和加载(基于JSON.Net&#xff0c…

酒店刷脸设备遭批量扔进「垃圾桶」,为啥所有人都叫好……

最近,不知道柴油们有没有关注到这么一个热点,就是大量酒店曾经动辄几千上万买来的刷脸设备,大批量的被挂在二手平台1折甩卖了…… 昔日花大几千,甚至上万买来的设备,如今年低至三四百?打折打到脚底板&#…

AI图书推荐:使用FastAPI框架构建AI服务

《使用FastAPI构建生成式AI服务》(Building Generative AI Services with FastAPI (Early Release) )是一本由Ali Parandeh编写的书籍,计划于2025年3月首次出版,该书以实践为导向,指导读者如何开发具备丰富上下文信息的…

Rust Web开发框架actix-web入门案例

概述 在看书的时候,用到了actix-web这个框架的案例。 书里面的版本是1.0,但是我看官网最新都4.4了。 为了抹平这种信息差,所以我决定把官方提供的示例代码过一遍。 核心代码 Cargo.toml [package] name "hello" version &q…

(教程)gpt-4o如何使用,怎么体验?gpt-4o和gpt-4-turbo的区别

今天OpenAI发布了gpt-4o,我体验之后,gpt-4o简直逆天了。中文能力也挺别强。速度比现在的gpt4还要快。 早在 5 月 11 日,Sam 就在推文中表示:OpenAI 并没有推出 GPT-5,或搜索引擎,但团队一直在努力研发一些…

重启服务器后node节点显示NotReady

场景:夜间进行了断电维护,重启后发现业务无法使用,检查发现一个node节点显示NotReady. 去到目标服务器查看kubelet服务未成功启动 journalctl -u kubelet 执行journalctl -u kubelet 查看日志发现提示: ailed to run Kubelet: run…

IRENE:医学图像、文本、基因数据 + 多模态融合 + 疾病诊断模型

IRENE:医学图像、文本、基因数据 多模态融合 疾病诊断模型 多模态融合方法分析与分类1. 早期融合方法2. 晚期融合方法3. 混合融合方法 传统非统一的多模态融合方法的局限性IRENE 解法子解法1:多模态表征学习子解法2:双向多模态注意力机制IR…

AC/DC电源模块的故障诊断与维修技巧

BOSHIDA AC/DC电源模块的故障诊断与维修技巧 AC/DC电源模块是一种常用的电力转换设备,用于将交流电转换为直流电供给电子设备。然而,由于使用环境和操作不当等原因,电源模块可能会出现故障。本文将介绍AC/DC电源模块的故障诊断与维修技巧。…

【稀疏三维重建】pixelSplat:仅需两张图像的3D Gaussian Splats重建

文章目录 一.摘要二、相关工作 , 背景(gs)三、基于图像的三维高斯预测3.1 双视图图像编码器(解决尺度模糊性)3.2 (像素对齐的)高斯参数预测 四、实验效果 论文:《pixelSplat: 3D Gaussian Splats from Image Pairs for…

【脚本】使用脚本备份docker中部署的mysql数据库

v1版本明文密码方式: #!/bin/bash# 定义 MySQL 容器名称和数据库信息 container_name"mysql_container" db_user"root" db_password"your_password"# 定义要备份的数据库列表 databases("database1" "database2"…

pyenv 之 python 多版本管理(win11)

1. 背景 常常会用到Python的多个版本,因此可以使用Pyenv来对Python版本进行管理。 2. win11下载 pyenv 在终端执行下载语句: pip install pyenv-win --target D:\software\pyenv 其中 D:\software\pyenv 为你想要下载到的文件目录,建议在 …

数据中台管理系统原型

数据中台是一个通用性的基础平台,适用于各类行业场景,数据中台包含多元数据汇聚、数据标准化、数据开发、数据共享、数据智能、数据资产管理等功能,助力企业数字化转型。 数据汇聚 数据汇聚是将不同系统、不同类型的多元源数据汇聚至目标数据…

动态规划-两个数组的dp问题3

文章目录 1. 两个字符串的最小ASCII删除和(712)2. 最长重复子数组(718) 1. 两个字符串的最小ASCII删除和(712) 题目描述: 状态表示: 根据经验以及题目要求,建立二维数…

深度解析YOLOV9,目标检测算法(附论文和源码)|

目录 一、YOLOV9 1、概述: 2,论文摘要: 输入数据在前馈过程中可能会有不可忽略的信息丢失。这种信息丢失会导致梯度流出现偏差,而梯度流又被用于更新模型。上述问题会导致深度网络在目标和输入之间建立不正确的关联&#xff0c…

【千帆AppBuidler】零代码构建AI人工智能应用,全网都在喊话歌手谁能应战,一键AI制作歌手信息查询应用

欢迎来到《小5讲堂》 这是《千帆平台》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景创建应用平台地址随机生成快速创建应用头像应用名称应用描述…

Python自动化神器:如何用PyAutoGUI模拟滚轮动一次

哈喽,大家好,我是木头左! 一、PyAutoGUI简介 PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序控制鼠标和键盘操作。它主要在三个方面发挥作用:1)对屏幕上的图像进行识别;2&#xf…

8.11 矢量图层线要素单一符号使用二

文章目录 前言箭头(Arrow)QGis设置线符号为箭头(Arrow)二次开发代码实现 总结 前言 本章介绍矢量图层线要素单一符号中箭头(Arrow)的使用说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps 箭头(Arr…