Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

2023-11-20

列表List

单键多值

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

常用命令

lpush/rpush <key><value1><value2><value3> … 从左边/右边插入一个或多个值。
lpop/rpop <key>从左边/右边吐出一个值。值在键在,值无键无
rpoplpush <key1><key2>从<key1>列表右边吐出一个值,插到列表左边。
lrange <key><start><stop>按照索引下标获得元素(从左到右)
lrange mylist 0 -1 0 左边第一个,-1 右边第一个,(0-1 表示获取所有)
lindex <key><index>按照索引下标获得元素(从左到右)
llen <key>获得列表长度
linsert <key> before <value><newvalue>在的后面插入<newvalue>插入值
lrem <key><n><value>从左边删除 n 个 value(从左到右)
lset<key><index><value>将列表 key 下标为 index 的值替换成 value

数据结构

List 的数据结构为快速链表 quickList
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表
它将所有的元素紧挨着一起存储,分配的是一块连续的内存
当数据量比较多的时候才会改成 quicklist
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next
Redis 将链表和 ziplist 结合起来组成了 quicklist
也就是将多个 ziplist 使用双向指针串起来使用
这样既满足了快速的插入删除性能,又不会出现太大的空间冗余

Redis 集合(Set)

Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个set 集合内的重要接口,这个也是 list 所不能提供的
Redis 的 Set 是 string 类型的无序集合。它底层其实是一个 value 为 null 的 hash 表,所以添加,删除,查找的复杂度都是 O(1)

常用命令

sadd <key><value1><value2> ..... 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers <key>取出该集合的所有值。
sismember <key><value>判断集合<key>是否为含有该<value>值,有 1,没有 0
scard<key>返回该集合的元素个数。
srem <key><value1><value2> .... 删除集合中的某个元素。
spop <key>随机从该集合中吐出一个值。
srandmember <key><n>随机从该集合中取出 n 个值。不会从集合中删除 。
smove <source><destination>value 把集合中一个值从一个集合移动到另一个集合
sinter <key1><key2>返回两个集合的交集元素。
sunion <key1><key2>返回两个集合的并集元素。
sdiff <key1><key2>返回两个集合的差集元素(key1 中的,不包含 key2 中的)

数据结构

Set 数据结构是 dict 字典,字典是用哈希表实现的。
Java 中 HashSet 的内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。
Redis 的 set 结构也是一样,它的内部也使用 hash 结构,所有的 value 都指向同一个内部值

Redis 哈希(Hash)

Redis hash 是一个键值对集合
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象类似 Java
里面的 Map<String,Object> 用户 ID 为查找的 key,存储的 value
用户对象包含姓名,年龄,生日等信息,如果用普通的 key/value 结构来存储 主要有以下 2 种存储方式:
每次修改用户的某个属性需要,先反序列化 改好后再序列化回去。开销较大。 用户 ID 数据冗余 通过 key(用户 ID) +
field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

常用命令

hset <key><field><value><key>集合中的 <field>键赋值<value>
hget<key1>集合<field>取出 value
hmset <key1><field1><value1><field2><value2>... 批量设置 hash 的值
hexists<key1><field>查看哈希表 key 中,给定域 field 是否存在。
hkeys <key>列出该 hash 集合的所有 field
hvals <key>列出该 hash 集合的所有 value
hincrby <key><field><increment>为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx <key><field><value>将哈希表 key 中的域 field 的值设置为 value ,当且仅当域field 不存在 .

数据结构

Hash 类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)
当field-value长度较短且个数较少时,使用 ziplist,否则使用hashtable

Redis 有序集合 Zset(sorted set)

Redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表

常用命令

zadd <key><score1><value1><score2><value2>…将一个或多个 member 元素及其 score 值加入到有序集 key 当中

zrange <key><start><stop> [WITHSCORES] 返回有序集 key 中,下标在 之间的元素带 WITHSCORES,可以让分数一起和值返回到结果集

zrangebyscore key minmax [withscores] [limit offset count]返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrevrangebyscore key maxmin [withscores] [limit offset count] 同上,改为从大到小排列。

zincrby <key><increment><value> 为元素的 score 加上增量
zrem <key><value>删除该集合下,指定值的元素
zcount <key><min><max>统计该集合,分数区间内的元素个数
zrank <key><value>返回该值在集合中的排名,从 0 开始。
案例:如何利用 zset 实现一个文章访问量的排行榜?

数据结构

SortedSet(zset)是 Redis 提供的一个非常特别的数据结构,一方面它等价于 Java的数据结构 Map<String,
Double>,可以给每一个元素 value 赋予一个权重 score,另一方面它又类似于 TreeSet,内部的元素会按照权重 score
进行排序,可以得到每个元素的名次,还可以通过 score 的范围来获取元素的列表
zset 底层使用了两个数据结构
(1)hash,hash 的作用就是关联元素 value 和权重 score,保障元素 value 的唯一性,可以通过元素 value 找到相应的 score 值。
(2)跳跃表,跳跃表的目的在于给元素 value 排序,根据 score 的范围获取元素列表

跳跃表(跳表)

有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset 的相关文章

  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • 将列表沿元素拆分为子列表

    我有这个清单 List
  • R 数据框到嵌套列表

    我想将这种格式的数据帧 tbl 转换为以下嵌套列表 tbllst library tidyr tbl lt tribble Col1 Col2 Col3 Var1 Var1 1 Var1 1 1 Var1 Var1 1 Var1 1 2 V
  • 如何在 Python 中从平面列表构建嵌套列表? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个简单的列表 例如 flat 1 1 1 1 1 1 1 2 2 2 1 2 2 3 我需要转换为嵌套列表 其中每个级别 破折号后跟数
  • Pandas DataFrame 中多列的映射方法

    我有一个 Pandas 数据框 其中的值是列表 import pandas as pd DF pd DataFrame X 1 5 1 2 Y 1 2 5 1 3 5 DF X Y 0 1 5 1 2 5 1 1 2 1 3 5 我想检查
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • Android 动态添加联系表单

    Hi 我想实现如图所示的表单 不知道他们如何动态添加字段 这是列表视图吗 可扩展列表 用户可以在运行时添加和删除 我已经检查了包含子项目的可扩展列表 但我们在数组中定义子元素 在图像中它们动态添加 任何指南 链接 Thanks Custom
  • 合并多个列表

    鉴于我有一个列表列表 List
  • 如何从字典列表中查找键的值?

    如何从字典列表中获取给定键的值 mylist powerpoint color blue client name Sport Parents Regrouped sort order ascending chart layout 1 cha
  • 如何在python中合并具有相同键的嵌套字典

    我有一个这样的数据结构 SNAPSHOT SnapshotVersion 304 SNAPSHOT SnapshotCreationDate 2015 06 21 17 33 41 CafeData CafeVersion 2807 Caf
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • 在Python中创建N*N*N列表时出现问题

    我正在尝试创建一个 3 维 NNPython 中的 N 列表 如下所示 n 3 l 0 n n n 不幸的是 这似乎没有正确地 克隆 列表 正如我所想的那样 gt gt gt l 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • Python选择列表中最长字符串的最有效方法?

    我有一个可变长度的列表 并且正在尝试找到一种方法来测试当前正在评估的列表项是否是列表中包含的最长字符串 我正在使用Python 2 6 1 例如 mylist abc abcdef abcd for each in mylist if co
  • 如何在 LINQ 中执行 String.Replace?

    这是我正在尝试做的事情 但没有成功 我想打电话from x in list1 and join y in list2 where regex Match x Value Success 完成这些步骤后我需要打电话String Replace
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • Python 3 中的递归搜索 JSON/DICT

    我在 Python 3 中实现了一些 API 这些 API 允许我根据班级代码接收有关学校的信息 但我想知道如何通过类代码获取信息 例子 我输入代码GF528S我希望程序告诉我班级 3C INF 地址 Address 1 Milan 如果可
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符

随机推荐

  • Python 基于BP神经网络的鸢尾花分类

    本文用Python实现了BP神经网络分类算法 根据鸢尾花的4个特征 实现3种鸢尾花的分类 算法参考文章 纯Python实现鸢尾属植物数据集神经网络模型 2020 07 21更新 增加了分类结果可视化result visualization
  • Elasticsearch 索引模板:优化大数据搜索与分析

    Elasticsearch 是一个强大的分布式搜索和分析引擎 广泛应用于处理大数据量的搜索和分析任务 为了提高搜索效率和数据组织结构的一致性 Elasticsearch 提供了索引模板 template 的功能 索引模板允许我们在创建索引时
  • 《python语言程序设计》第5章 第23题 贷款计算

    LOAN AMOUNT 10000 number years 5 NUMBER OF YEAR number years 12 interest rate 5 month rate interest rate 1200 print f Lo
  • springboot跳转页面

    SpringBoot里面只有src目录 在src main resources下面有两个文件夹 static 和 templates springboot默认static中放静态页面 而templates中放动态页面 themleaf和fr
  • Egret游戏通用开发框架

    地址 https github com yicaoyimuys EgretGameEngine 简介 现在这套代码已经有几个项目都在使用了 主要用于各项目组间统一开发规范 便于开发人员调整 以及新手快速熟悉项目 支持Egret2 0 x和2
  • C#写的34401A串口232数据读取程序

    首先呢 请先设置惠普表为Talk only模式 也就是31 还不明白的自己查手册去 另外 各个表设置不一样 比如我这里2块表就不一样 一块是7位数据位 even校验 另一块是8位数据位 none校验 具体的可以看看表里的i o那里的设置 数
  • GPIO的两种引脚规则:BCM与BOARD

    树莓派 raspberry 针脚在python中BCM与BOARD模式的区别 在python程序中定义的GPI针脚有两种模式 BCM模式 BOARD模式 BCM模式 例如 GPIO setmode GPIO BCM 测试结果如下 物理针脚1
  • pycharm注释快捷键Ctrl+/

    行注释 取消行注释 Ctrl 块注释 Ctrl Shift
  • ArcGIS部分问题解决办法

    ArcGIS部分常见问题解决办法 最近在学习ArcGIS过程中 进行某些操作选项总是会会发生错误 不仅仅我自己一个人是这样 周围好多同学也是经常在操作的过程中报错 所以就很突发奇想把这段时间遇到的问题统一写下来 也是为了自己以后忘掉可以直接
  • 系统调用:用户级函数如何通过INT 80中断进入操作系统内核

    以printf 打印内核中的一段字符串为例 printf 是用户函数无法进入内核 因此需要进行系统调用 进入内核的方式是使用int 0x80中断 printf 函数想要进入系统内核是通过系统调用write 实现 位置 linux lib w
  • Usbkey原理介绍

    不好意思 百度来的 大家一起学习吧 文库中竟然收费5个币 Usbkey原理介绍 一 usbkey实现身份认证原理 采用冲击响应的认证方法 登录时在服务器端和客户端同时进行计算 客户端计算前要先验证USER PIN 通过后在硬件中使用HMAC
  • OD华为机试 23

    篮球比赛 描述 篮球 5V5 比赛中 每个球员拥有一个战斗力 每个队伍的所有球员战斗力之和为该队伍的总体战斗力 现有10个球员准备分为两队进行训练赛 教练希望2个队伍的战斗力差值能够尽可能的小 以达到最佳训练效果 给出10个球员的战斗力 如
  • docker搭建hadoop hdfs完全分布式集群

    1 制作hadoop镜像 参见 https www cnblogs com rmxd p 12051866 html 该博客中只参考制作镜像部分 固定IP及启动集群的部分应该跳过 这里注意 在做好的镜像里 要安装 which 工具 否则在执
  • DFS的个人理解和测试例题

    深度优先搜索 DFS 是一种搜索手段 可以理解为 它从某个位置 起点 开始 沿着一条路不断地向前走直到尽头 然后退后一步 去走其它没走过的路 没有的话 再退后一步 再去选择 直到找到目的地 终点 例如下图 从A 起点 开始走 先走ABD 在
  • 【MySQL】Ubuntu22.04安装MySQL8数据库详解

    00 目录 文章目录 00 目录 01 安装MySQL 02 配置MySQL 03 查看MySQL状态 04 登录MySQL数据库 05 问题讨论 06 附录 01 安装MySQL 1 1 更新软件源 deng local code 3li
  • MQTT.fx连接、订阅、发布OneNet平台(新版)

    第一步 打开MQTT fx 点击设置按钮 第二步 命名的话随便起 中文英文皆可以 token的下载地址 https open iot 10086 cn doc v5 develop detail 242 第三步 token生成密码 时间戳转
  • 数据结构之链表增删查改(最详细注释和最清晰思路,附完整代码)

    PZK学数据结构之链表 史上最详细思路和代码注释 完整代码我放在最后面了 可以直接跑 方便大家cv编程 文章目录 PZK学数据结构之链表 史上最详细思路和代码注释 完整代码我放在最后面了 可以直接跑 方便大家cv编程 前言 一 链表是什么
  • target属性里_blank _self _top _parent区别

    blank 是指超链接连接的网页 是通过一个新的网页窗口打开 self的话 是指在本身这个网页窗口来打开新的网页链接 top与 self差不很大 但是如果你用了时 就会知道两者的差别了 因为如果你的超链接是 做在 上时 如果用 self 点
  • broken pipe

    1 broken pipe的字面意思是 管道破裂 broken pip的原因是该管道的读端被关闭 2 broken pipe经常发生socket关闭之后 或者其他的描述符关闭之后 的write操作中 3 发生broken pipe错误时 进
  • Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

    Redis 列表List 集合Set 哈希Hash 有序集合 Zset 列表List 单键多值 常用命令 数据结构 Redis 集合 Set 常用命令 数据结构 Redis 哈希 Hash 常用命令 数据结构 Redis 有序集合 Zset