【Redis】Redis键值存储

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

在这里插入图片描述

文章目录

  • 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.hqwc.cn/news/702576.html

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

相关文章

STM32-08-串口

文章目录 STM32 串口1. 数据通信的基本概念2. 串口通信协议3. 串口4. 相关寄存器5. MSP回调机制6. HAL库中断回调机制7. USART/UART异步通信配置步骤8. IO引脚复用功能9. 代码实现 STM32 串口 1. 数据通信的基本概念 通信方式: 数据传输方向: 数据同…

六西格玛培训证书攻略2024:一站式解决方案助你快速上手

目前,企业对于员工的专业能力和综合素质要求越来越高。六西格玛作为一种先进的质量管理方法,已经成为众多企业提升运营效率、降低成本的重要手段。张驰咨询针对2024年六西格玛培训证书考取,为广大学员制定了实用的攻略,帮助学员们…

网络故障快速定位的秘诀 - 基于 AnaTraf 全流量回溯分析

网络故障是每个 IT 从业者都深有体会的头疼问题。当网络出现异常时,如何快速定位故障原因,恢复网络正常运行,是考验运维能力的关键所在。借助 AnaTraf 网络流量分析仪的全流量回溯分析功能,您可以轻松应对各种复杂的网络问题,实现快速故障定位。 1. 网络故障分析的痛点 网络故…

C++自定义脚本文件执行

FunctionCall.h&#xff1a; #include <sstream> #include <string> #include <vector> // 函数调用 class FunctionCall { public: FunctionCall(); ~FunctionCall(); std::string call(const st…

失误删除也能救回,推荐前10款手机数据恢复软件!

在手机的日常使用中&#xff0c;不可避免的会误删数据&#xff0c;这些数据可能包括照片、视频、联系人、短信等重要信息。不过好在市面上有很多优秀的手机数据恢复软件&#xff0c;可以帮助我们从各种情况下恢复丢失的数据。 本文将为您推荐十大手机数据恢复软件&#xff0c;…

Xxl-job实现定时任务视频转码

搭建XXL-JOB 调度中心 首先下载xxl-job GitHub&#xff1a;GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度平台XXL-JOB&#xff09; 码云&#xff1a;xxl-job: 一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速…

三大国密浏览器简单介绍-行云管家

国密浏览器是指支持国密算法SM2/SM3&#xff0c;支持基于国密算法的SSL协议&#xff0c;支持采用国密SSL证书实现HTTPS加密的网站正常访问的浏览器。今天我们行云管家小编就给大家简单介绍一下三大国密浏览器&#xff0c;以便大家了解。 三大国密浏览器简单介绍-行云管家 1、密…

快速上手六步教你如何进行跨境电商ERP开发

跨境电商平台开发是当前电商行业的热门话题&#xff0c;一套高效的ERP系统对跨境电商平台的发展至关重要。在本文中&#xff0c;我将为你介绍六个简单而关键的步骤&#xff0c;帮助你快速上手进行跨境电商ERP开发。 步骤一&#xff1a;需求分析 在跨境电商平台开发之初&#…

C++笔试强训day22

目录 1.添加字符 2.数组变换 3.装箱问题 常规一维优化&#xff1a; 1.添加字符 链接 因为lenA < lenB < 50&#xff0c;因此可以无脑暴力解题&#xff1a; 遍历所有符合条件的匹配方法&#xff0c;找出最小的不同的数量&#xff0c;即最大的相同的数量 #include &…

需要无广告、结构化信息的搜索引擎?秘塔AI搜索,你的新选择

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

蓝桥杯备战22.k倍区间——前缀和

目录 题目 分析 暴力求解 优化思路 AC代码 题目链接&#xff1a; P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目 分析 很明显这题是一道前缀和的题 暴力求解 只得了28分 #include<iostream> using namespace std; co…

地平线旭日X3开发板编译USB网卡驱动 AX88772B

由于使用的激光雷达是网口输出的&#xff0c; 为了不占用X3派已有的网口&#xff0c;接上去了一个绿联的usb网卡&#xff0c; 发现系统没有驱动&#xff0c;所以动手看看能不能自己编译一个 首先lsusb查看一下网卡型号 发现型号是AX88772B&#xff0c;去官网看了一下&#x…