Redis 数据结构

String 字符串

基本命令表

命令执行效果时间复杂度
set key value [key value…]设置 key 的值是 valueO(k), k 是键个数
get key获取 key 的值O(1)
del key [key …]删除指定的 keyO(k), k 是键个数
mset key value [key value …]批量设置指定的 key 和 valueO(k), k 是键个数
mget key [key …]批量获取 key 的值O(k), k 是键个数
incr key指定的 key 的值 +1O(1)
decr key指定的 key 的值 -1O(1)
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +n(浮点数)O(1)
append key value指定的 key 的值追加 valueO(1)
strlen key获取指定 key 的值的长度O(1)
setrange key offset value覆盖指定 key 的从 offset 开始的部分值O(n),n 是字符串长度,通常视为 O(1)
getrange key start end获取指定 key 的从 start 到 end 的部分值O(n),n 是字符串长度,通常视为 O(1)

SET 命令

将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。

SET 命令支持多种选项来影响它的行为:

  • EX seconds——使用秒作为单位设置 key 的过期时间。
  • PX milliseconds——使用毫秒作为单位设置 key 的过期时间。
  • NX——只在 key 不存在时才进行设置,即如果 key 之前已经存在,设置不执行。
  • XX——只在 key 存在时才进行设置,即如果 key 之前不存在,设置不执行。

注意:由于带选项的 SET 命令可以被 SETNX、SETEX、PSETEX 等命令代替,所以之后的版本中,Redis 可能进行合并。

Hash 哈希

几乎所有的主流编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中,哈希类型是指值本身又是一个键值对结构,形如 key = “key”,value = { {field1, value1 }, …, {fieldN, valueN } }。

哈希类型中的映射关系通常称为 field-value,用于区分 Redis 整体的键值对(key-value),注意这里的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下文的作用。

在这里插入图片描述

基本命令表

命令执行效果时间复杂度
hset key field value设置值O(1)
hget key field获取值O(1)
hdel key field [field …]删除 fieldO(k), k 是 field 个数
hlen key计算 field 个数O(1)
hgetall key获取所有的 field-valueO(k), k 是 field 个数
hmget key field [field …]批量获取 field-valueO(k), k 是 field 个数
hmset key field value [field value …]批量设置 field-valueO(k), k 是 field 个数
hexists key field判断 field 是否存在O(1)
hkeys key获取所有的 fieldO(k), k 是 field 个数
hvals key获取所有的 valueO(k), k 是 field 个数
hsetnx key field value设置值,但必须在 field 不存在时才能设置成功O(1)
hincrby key field n对应 field-value +nO(1)
hincrbyfloat key field n对应 field-value +n(浮点数)O(1)
hstrlen key field计算 value 的字符串长度O(1)

注意:

在使用 HGETALL 时,如果哈希元素个数比较多,会存在阻塞 Redis 的可能。如果开发人员只需要获取部分 field,可以使用 HMGET,如果一定要获取全部 field,可以尝试使用 HSCAN 命令,该命令采用渐进式遍历哈希类型。

List 列表

列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。
在这里插入图片描述

特点:

  • 第一、列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要获取第 5 个元素,可以执行 lindex user:1:messages 4;获取倒数第 1 个元素,lindex user:1:messages -1 即可。
  • 第二、区分获取和删除的区别,例如 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除,这个操作会导致列表的长度变化;但执行 lindex 4 只会获取元素,列表长度不变。
  • 第三、列表中的元素是允许重复的。

阻塞版本命令

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本一致,除了:

  • 在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但如果列表中没有元素,非阻塞版本会立即返回 nil,但阻塞版本会根据 timeout 阻塞一段时间,期间 Redis 可以执行其他命令,但执行该命令的客户端会表现为阻塞状态。
  • 命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回。
  • 如果多个客户端同时对一个键执行 pop,则最先执行命令的客户端会得到弹出的元素。

列表不为空时:
lpop user:1:messages 得到 x 元素
blpop user:1:messages 得到 x 元素
两者行为一致

列表为空时,且 5 秒内没有新元素加入:
lpop user:1:messages 立即得到 nil
blpop user:1:messages 5 执行命令 5 秒后得到 nil
两者行为不一致

列表为空时,且 5 秒内有新元素加入:
lpop user:1:messages 立即得到 nil
blpop user:1:messages 5 执行命令,直到新元素加入,得到新元素
两者行为不一致

基本列表命令

操作类型命令时间复杂度
添加rpush key value [value …]O(k),k 是元素个数
lpush key value [value …]O(k),k 是元素个数
linsert key before/after pivot valueO(n),n 是 pivot 距离头尾的距离
查找lrange key start endO(s+n),s 是 start 偏移量,n 是 start 到 end 的范围
lindex key indexO(n),n 是索引的偏移量
llen keyO(1)
删除lpop keyO(1)
rpop keyO(1)
lrem key count valueO(k),k 是元素个数
ltrim key start endO(k),k 是元素个数
修改lset key index valueO(n),n 是索引的偏移量
阻塞操作blpop key [key …] timeoutO(1)
brpop key [key …] timeoutO(1)

Set 集合

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中:1)元素之间是无序的;2)元素不允许重复。一个集合中最多可以存储 2^32 - 1 个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。
在这里插入图片描述

SPOP

从 set 中删除并返回一个或者多个元素。注意,由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。

基本命令表

命令描述时间复杂度
SADD key member [member …]向集合添加一个或多个成员O(1)(单个元素),批量添加时为 O(k),k 是成员个数
SCARD key获取集合的成员数O(1)
SISMEMBER key member判断 member 元素是否是集合 key 的成员O(1)
SMEMBERS key返回集合中的所有成员O(N),其中 N 为集合中的成员数量
SPOP key [count]移除并返回集合中的一个随机成员;如果指定了 count,则返回多个随机成员O(1)(单个元素),指定 count 时为 O(count)
SREM key member [member …]从集合中移除一个或多个成员O(N),其中 N 为被删除的成员数量
SMOVE source destination member将 member 元素从 source 集合移动到 destination 集合O(1)
SDIFF key [key …]返回第一个集合与其他集合之间的差异(差集)O(N),其中 N 为所有集合中成员的总数量
SDIFFSTORE destination key [key …]返回给定所有集合的差集并存储在 destination 中O(N),其中 N 为所有集合中成员的总数量
SINTER key [key …]返回所有给定集合的交集O(N*M),其中 N 为最小集合中元素的数量,M 为参数中集合的数量
SINTERSTORE destination key [key …]返回所有给定集合的交集并存储在 destination 中O(N*M),其中 N 为最小集合中元素的数量,M 为参数中集合的数量
SUNION key [key …]返回所有给定集合的并集O(N),其中 N 为所有集合中成员的总数量
SUNIONSTORE destination key [key …]返回所有给定集合的并集并存储在 destination 中O(N),其中 N 为所有集合中成员的总数量
SSCAN key cursor [MATCH pattern] [COUNT count]迭代集合中的元素O(1)(每次调用),完整迭代为 O(N)

Zset 有序集合

有序集合保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,这使得有序集合中的元素是可以维护有序性的,但这个有序不是用下标作为排序依据而是用这个分数。
在这里插入图片描述

有序集合中的元素是不能重复的,但分数允许重复。类比于一次考试之后,每个人一定有一个唯一的分数,但分数允许相同。

ZADD 命令

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。

ZADD 的相关选项:

  • XX:仅仅用于更新已经存在的元素,不会添加新元素。
  • NX:仅用于添加新元素,不会更新已经存在的元素。
  • CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
  • INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定一个元素和分数。

基本命令表

命令描述时间复杂度
ZADD key score member [score member …]添加一个或多个成员到有序集合,或者更新已存在成员的分数。O(k * log(n)),其中 k 是添加的成员个数,n 是当前有序集合的元素个数。
ZCARD key获取有序集合的成员数。O(1)
ZSCORE key member返回有序集中,成员的分数值。O(1)
ZRANK key member返回有序集中指定成员的排名(从 0 开始,按分数升序)。O(log(n)),其中 n 是当前有序集合的元素个数。
ZREVRANK key member返回有序集中指定成员的排名(从 0 开始,按分数降序)。O(log(n)),其中 n 是当前有序集合的元素个数。
ZREM key member [member …]移除有序集合中的一个或多个成员。O(k * log(n)),其中 k 是删除的成员个数,n 是当前有序集合的元素个数。
ZINCRBY key increment member为有序集中成员的分数加上增量 increment。O(log(n)),其中 n 是当前有序集合的元素个数。
ZRANGE key start end [WITHSCORES]返回有序集中指定区间内的成员,按分数从低到高排序。O(k + log(n)),其中 k 是获取的成员个数,n 是当前有序集合的元素个数。
ZREVRANGE key start end [WITHSCORES]返回有序集中指定区间内的成员,按分数从高到低排序。O(k + log(n)),其中 k 是获取的成员个数,n 是当前有序集合的元素个数。
ZRANGEBYSCORE key min max [WITHSCORES]返回所有成员的分数在 [min, max] 范围内的成员,按分数从低到高排序。O(k + log(n)),其中 k 是获取的成员个数,n 是当前有序集合的元素个数。
ZREVRANGEBYSCORE key max min [WITHSCORES]返回所有成员的分数在 [max, min] 范围内的成员,按分数从高到低排序。O(k + log(n)),其中 k 是获取的成员个数,n 是当前有序集合的元素个数。
ZCOUNT key min max计算分数在 [min, max] 范围内的成员数量。O(log(n)),其中 n 是当前有序集合的元素个数。
ZREMRANGEBYRANK key start end移除有序集合中给定的排名区间的所有成员。O(k + log(n)),其中 k 是移除的成员个数,n 是当前有序集合的元素个数。
ZREMRANGEBYSCORE key min max移除有序集合中所有分数在 [min, max] 范围内的成员。O(k + log(n)),其中 k 是移除的成员个数,n 是当前有序集合的元素个数。
ZINTERSTORE destination numkeys key [key …]计算给定的一个或多个有序集的交集,并将结果存储在新的有序集合中。O(n * k) + O(m * log(m)),其中 n 是输入集合中的最小元素个数,k 是集合个数,m 是目标集合元素个数。
ZUNIONSTORE destination numkeys key [key …]计算给定的一个或多个有序集的并集,并将结果存储在新的有序集合中。O(n) + O(m * log(m)),其中 n 是输入集合的总元素个数,m 是目标集合元素个数。

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

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

相关文章

开启modbus tcp模拟调试

1、新建modbus tcp服务器 ‌功能差异‌‌客户端功能‌: 生成并发送Modbus请求报文(如功能码03读取寄存器)。‌‌ 解析服务器响应数据,实现远程监控或控制。‌‌ ‌服务器端功能‌: 监听默认端口(如502&…

昇思+香橙派 AI 开发实践:DeepSeek 全流程指南(基于 openEuler)

一、 环境准备 1. 镜像烧录 镜像烧录可以在任何操作系统内执⾏,这⾥以在Windows系统为例,使用balenaEtcher⼯具,快速烧录镜像到Micro SD卡中。 本章节所需的软/硬件如下: 软件相关:balenaEtcher制卡⼯具、openEul…

AI生成邮件发送脚本(带附件/HTML排版)与定时爬取网站→邮件通知(价格监控原型)

想象一下:每天早晨咖啡还没喝完,你的邮箱就自动收到了心仪商品的最新价格;重要报告准时带着专业排版的附件发送到客户手中——这一切不需要你手动操作。本文将用不到100行代码带你实现这两个自动化神器! 一、为什么我们需要自动化…

【vLLM 学习】Encoder Decoder Multimodal

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ *在线运行 vLLM 入门教程:零基础分步指南 源码 examples/offline_inf…

【MySQL笔记】视图

目录一、什么是视图?二、使用视图的优势三、视图的创建与使用四、不能更新视图的场景五、删除视图六、总结一、什么是视图? 视图(View)是一种虚拟表,不存储实际数据,而是通过执行预定义的查询动态生成数据…

【RK3576】【Android14】分区划分

获取更多相关的【RK3576】【Android14】驱动开发,可收藏系列博文,持续更新中: 【RK3576】Android 14 驱动开发实战指南

Datawhale 25年7月组队学习coze-ai-assistant Task1学习笔记:动手实践第一个AI Agent—英伦生活口语陪练精灵

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一条流水线,把复杂的任务拆分成多个简单的步骤,每一步都有明确的目标和流程。1.2智能体和工作流的区别 智能体(AI Agent) **是什么 :**智能体是一个自动化的“助手”…

Webpack插件开发深度指南:从原理到实战

Webpack插件是前端工程化的核心引擎,本文将带你深入插件开发全流程,实现一个功能完整的资源清单插件,并揭示Tapable事件系统的核心原理。 一、Webpack插件机制解析 1.1 插件架构核心:Tapable事件系统 Webpack基于Tapable构建了…

2、Redis持久化详解

Redis持久化详解 文章目录 Redis持久化详解 前言 RDB和AOF的区别 RDB和AOF的优缺点 Redis 持久化配置 1、RDB持久化配置 2、AOF持久化配置(尝试修复会删除aof文件内容) 3、AOF 重写功能 新增知识点: 新增知识点: 前言 Redis是一种高级 key-value 型的NoSQL数据库。它跟mem…

curl 命令详解

curl 命令的 -d/–data 和 --data-urlencode 的区别 curl 命令的 -d/–data 和 --data-urlencode 都用于发送 HTTP POST 请求的数据,但关键区别在于 是否自动对数据进行 URL 编码。以下是详细对比: curl 命令的 -d/--data 和 --data-urlencode 都用于发送…

ubuntu下好用的录屏工具

以下是 vokoscreen 的安装教程,适用于 Linux 系统。vokoscreen 是一款简单易用的屏幕录制工具,支持录制屏幕、摄像头和音频。 安装 vokoscreen vokoscreen 提供了多种安装方式,包括通过包管理器、Deb 包或 AppImage 文件。 方法 1&#xf…

笔试大题20分值(用两个栈实现队列)

目录前言一、原题二、解题思路三、代码实现(c/c)C语言代码C代码实现结语前言 目前博主在处于秋招求职的关键时期,在暑假这段时间会频繁更新博客,想在暑假期间把一些常考的面试和笔试题过一下,利用这两个月沉淀一下技术…

【知识扫盲】tokenizer.json中的vocab和merges是什么?

在自然语言处理里,tokenizer.json 文件一般是由 Hugging Face 的 Tokenizers 库生成的,它是分词器配置的核心文件。这里面的 vocab 和 merges 是子词分词算法(像 BPE 这种)的重要构成要素。下面为你详细解释它们的作用和工作原理&…

【安卓笔记】RxJava的Hook机制,整体拦截器

0. 环境: 电脑:Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version:8.11.1 Compile Sdk Version:35 Java 版本:Java11 1. 使用场景 整个项目都是用了RxJava,需要对 整个/部分 项目…

NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化

再做项目时相信大家都会用到坐标转化,例如,我之前写的案例分享中的博客都用到过,之前总是找借口进行if else判断,虽然可以实现,但是比起坐标变换无论代码复杂程度还是运行速度都比较差,之前参加过曹大师的教学训练营,但是明显感觉到大佬写代码的逻辑性以及模块化能力都比…

数据库防止数组字符串序列化

请求接到数组["aa","bb"]后,后端需要转换成字符串Java 8 使用 String.join()String[] arr {"aa", "bb"}; String str String.join(",", arr); // "aa,bb"如果采用其他转换,在字段存入数据库后会["\"a…

若依框架文件上传返回路径端口错误 - Nginx代理环境下serverConfig.getUrl()获取端口异常

目录一 、问题描述二、问题现象三、问题根本原因3.1 代码分析3.2 问题核心四、解决方案五、总结一 、问题描述 在使用若依框架进行项目开发时,遇到了一个令人困扰的问题:文件上传功能在本地开发环境运行正常,但部署到服务器后,上…

使用PyInstaller打包 Python 工程

引言:大模型是个好工具,尽管好多内容都是拼凑的,但是整理学到的就是自己的。因工作需要隐藏python源代码,方法有PyInstaller 、Cpython等多种方法,PyInstaller更为常用,PyInstaller打包 Python 工程步骤整理如下: 一、确保系统环境准备就绪 安装 Python 和 pip 确认版本…

Python 程序设计讲义(1):PyCharm 安装教程

Python 程序设计讲义(1):PyCharm 安装教程 一、安装 Python 解释器 1、下载 Python 安装文件 点击如下链接进入 Python 官网: https://www.python.org/ 在弹出的页面中单击【Downloads】,然后单击下面的【Download Pyt…

uniapp云打包安卓

1、基础云打包 2、修改logo3、怎么实现下拉菜单4、修改启动页启动页默认这样 5、URL Scheme页面跳转