Hash与ZSet的常用命令以及其底层数据结构

news2024/11/22 16:51:49

目录

  • hash类型命令
    • hset
    • hget
    • hmset
    • hmget
    • hgetall
    • hsetnx
    • hdel
    • hexits
    • hincrby与hincrbyfloat
    • hkeys与hvals
    • hlen
    • hstrlen
  • 有序set型命令
    • zadd
    • zrange 与zrevrange
    • zrangebyscore与zrevrangebyscore
    • zcard
    • zcount
    • zscore
    • zincrby
    • zrank 与 zrevrank
    • zrem
    • zremrangebyrank
    • zremrangebyscore
    • zrangebylex
    • zlexcount
    • zremrangebylex
  • Hash与ZSet的底层数据结构
    • 压缩列表zipList与redis7.0的listPack
      • ziplist
        • head
        • entries
          • entry
        • end
      • listPack
        • head
        • entries
          • entry
        • end
    • 跳跃列表skipList

hash类型命令

hset

格式:HSET key field value

功能:将哈希表 key 中的域 field 的值设为 value 。

说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已

经存在于哈希表中,旧值将被覆盖。如果 field 是哈希表中的一个新建域,并且值设置

成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回0。

hget

格式:HGET key field

功能:返回哈希表 key 中给定域 field 的值。

说明:当给定域不存在或是给定 key 不存在时,返回 nil 。

hmset

格式:HMSET key field value [field value …]

功能:同时将多个 field-value (域-值)对设置到哈希表 key 中。

说明:此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。

hmget

格式:HMGET key field [field …]

功能:按照给出顺序返回哈希表 key 中一个或多个域的值。

说明:如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

hgetall

格式:HGETALL key

功能:返回哈希表 key 中所有的域和值。

说明:在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。若 key 不存在,返回空列表。若 key 中包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中一般不使用该命令,而使用 hscan 命令代替。

hsetnx

格式:HSETNX key field value

功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。

说明:若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

hdel

格式:HDEL key field [field …]

功能:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

说明:返回被成功移除的域的数量,不包括被忽略的域。

hexits

格式:HEXISTS key field

功能:查看哈希表 key 中给定域 field 是否存在。

说明:如果哈希表含有给定域,返回 1 。如果不含有给定域,或 key 不存在,返回 0 。

hincrby与hincrbyfloat

格式:HINCRBY key field increment

功能:为哈希表 key 中的域 field 的值加上增量 increment 。hincrby 命令只能增加整数值,而 hincrbyfloat 可以增加小数值。

说明:增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0。对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。

hkeys与hvals

格式:HKEYS key 或 HVALS key

功能:返回哈希表 key 中的所有域/值。

说明:当 key 不存在时,返回一个空表。

hlen

格式:HLEN key

功能:返回哈希表 key 中域的数量。

说明:当 key 不存在时,返回 0 。

hstrlen

格式:HSTRLEN key field

功能:返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。

说明:如果给定的键或者域不存在, 那么命令返回 0 。

有序set型命令

zadd

格式:ZADD key score member [[score member] [score member] …]

功能:将一个或多个 member 元素及其 score 值加入到有序集 key 中的适当位置。

说明:score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。如果命令执行成功,则返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。若写入的 member 值已经存在,但 score 值不同,则新的 score 值将覆盖老 score。

zrange 与zrevrange

格式:ZRANGE key start stop [WITHSCORES] 或 ZREVRANGE key start stop [WITHSCORES]

功能:返回有序集 key 中,指定区间内的成员。zrange 命令会按 score 值递增排序,zrevrange命令会按score递减排序。具有相同 score 值的成员按字典序/逆字典序排列。可以通过使用WITHSCORES 选项,来让成员和它的 score 值一并返回。

说明:下标参数从 0 开始,即 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。也可以使用负数下标,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。超出范围的下标并不会引起错误。例如,当 start 的值比有序集的最大下标还要大,或是 start > stop 时,ZRANGE 命令只是简单地返回一个空列表。再比如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。

​ 若 key 中指定范围内包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用 zscan 命令代替。

zrangebyscore与zrevrangebyscore

格式:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

​ ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

功能:返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或max )的成员。有序集成员按 score 值递增/递减次序排列。具有相同 score 值的成员按字典序/逆字典序排列。可选的 LIMIT 参数指定返回结果的数量及区间(就像 SQL 中的SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

说明:min 和 max 的取值是正负无穷大的。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),也可以通过给参数前增加左括号“(”来使用可选的开区间 (小于或大于)。

zcard

格式:ZCARD key

功能:返回集合的长度

说明:当 key 不存在时,返回 0 。

zcount

格式:ZCOUNT key min max

功能:返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。

zscore

格式:ZSCORE key member

功能:返回有序集 key 中,成员 member 的 score 值。

说明:如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

zincrby

格式:ZINCRBY key increment member

功能:为有序集 key 的成员 member 的 score 值加上增量 increment 。increment 值可以是整数值或双精度浮点数。

说明:可以通过传递一个负数值 increment ,让 score 减去相应的值。当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。当 key 不是有序集类型时,返回一个错误。命令执行成功,则返回 member 成员的新 score 值。

zrank 与 zrevrank

格式:ZRANK key member 或 ZREVRANK key member

功能:返回有序集 key 中成员 member 的排名。zrank 命令会按 score 值递增排序,zrevrank 命令会按 score 递减排序。

说明:score 值最小的成员排名为 0 。如果 member 不是有序集 key 的成员,返回 nil 。

zrem

格式:ZREM key member [member …]

功能:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

说明:当 key 存在但不是有序集类型时,返回一个错误。执行成功,则返回被成功移除的成员的数量,不包括被忽略的成员。

zremrangebyrank

格式:ZREMRANGEBYRANK key start stop

功能:移除有序集 key 中,指定排名(rank)区间内的所有成员。

说明:排名区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。排名区间参数从 0 开始,即 0 表示排名第一的成员, 1 表示排名第二的成员,以此类推。也可以使用负数表示,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。命令执行成功,则返回被移除成员的数量。

zremrangebyscore

格式:ZREMRANGEBYSCORE key min max

功能:移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或max )的成员。

说明:命令执行成功,则返回被移除成员的数量。

zrangebylex

格式:ZRANGEBYLEX key min max [LIMIT offset count]

功能:该命令仅适用于集合中所有成员都具有相同分值的情况。当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序。即这个命令返回给定集合中元素值介于 min 和 max 之间的成员。如果有序集合里面的成员带有不同的分值, 那么命令的执行结果与 zrange key 效果相同。

说明:合法的 min 和 max 参数必须包含左小括号“(”或左中括号“[”,其中左小括号“(”表示开区间, 而左中括号“[”则表示闭区间。min 或 max 也可使用特殊字符“+”和“-”,分别表示正无穷大与负无穷大。

zlexcount

格式:ZLEXCOUNT key min max

功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令返回该集合中元素值本身(而非 score 值)介于 min 和 max 范围内的元素数量。

zremrangebylex

格式:ZREMRANGEBYLEX key min max

功能:该命令仅适用于集合中所有成员都具有相同分值的情况。该命令会移除该集合中元素值本身介于 min 和 max 范围内的所有元素。

Hash与ZSet的底层数据结构

​ 用户写入不同的数据,系统会自动使用不同的实现。只有同时满足以配置文件 redis.conf 中相关集合元素数量阈值与元素大小阈值两个条件,使用的就是压缩列表 zipList,只要有一个条件不满足使用的就是跳跃列表 skipList。

例如,对于ZSet 集合中这两个条件如下:

  • 集合元素个数小于 redis.conf 中 zset-max-ziplist-entries 属性的值,其默认值为 128

  • 每个集合元素大小都小于 redis.conf 中 zset-max-ziplist-value 属性的值,其默认值为 64字节

​ 这些值可以设置,如果设置超过ziplist两字节,表示元素个数的变量就失去了意义。只能通过遍历来确定元素个数了。

压缩列表zipList与redis7.0的listPack

ziplist

​ zipList,通常称为压缩列表,是一个经过特殊编码的用于存储字符串或整数的双向链表。其底层数据结构由三部分构成:head、entries 与 end。这三部分在内存上是连续存放的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLumo2OU-1670316760581)(redis.assets/image-20221206155303071.png)]

head

head 又由三部分构成:

  • zlbytes:占 4 个字节,用于存放 zipList 列表整体数据结构所占的字节数,包括 zlbytes本身的长度。

  • zltail:占 4 个字节,用于存放 zipList 中最后一个 entry 在整个数据结构中的偏移量(字节)。该数据的存在可以快速定位列表的尾 entry 位置,以方便操作。

  • zllen:占 2 字节,用于存放列表包含的 entry 个数。由于其只有 16 位,所以 zipList 最多可以含有的 entry 个数为 2 16 -1 = 65535 个。

entries

​ entries 是真正的列表,由很多的列表元素 entry 构成。由于不同的元素类型、数值的不同,从而导致每个 entry 的长度不同。

entry

entry 由三部分构成:

  • prevlength:该部分用于记录上一个 entry 的长度,以实现逆序遍历。默认长度为 1 字节,只要上一个 entry 的长度<254 字节,prevlength 就占 1 字节,否则其会自动扩展为 3 字节长度。

  • encoding:该部分用于标志后面的 data 的具体类型。如果 data 为整数类型,encoding固定长度为 1 字节。如果 data 为字符串类型,则 encoding 长度可能会是 1 字节、2 字节或 5 字节。data 字符串不同的长度,对应着不同的 encoding 长度。(固定长度的1字节前两位用来表示是整型还是字符串类型,后六位表示多少字节的整型)

  • data:真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字节长度不同。

end

​ end 只包含一部分,称为 zlend。占 1 个字节,值固定为 255,即二进制位为全 1,表示一个 zipList 列表的结束。

listPack

​ ziplist每个 entry 中包含前一个 entry 的长度,这样会导致在 ziplist 中间修改或者插入 entry 时需要进行级联更新,也就是类似连锁反应其他值跟着变,影响效率。

​ 在 Redis 7.0 中,已经将 zipList 全部替换为了 listPack,但为了兼容性,在配置中也保留了 zipList 的相关属性。

​ listPack 也是一个经过特殊编码的用于存储字符串或整数的双向链表。其底层数据结构也由三部分构成:head、entries 与 end,且这三部分在内存上也是连续存放的。

​ listPack与zipList的重大区别在head与每个entry的结构上,表示列表结束的end与zipList的 zlend 是相同的,占一个字节,且 8 位全为 1。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3L8ryoq-1670316760582)(redis.assets/image-20221206161231252.png)]

head

head 由两部分构成:

  • totalBytes:占 4 个字节,用于存放 listPack 列表整体数据结构所占的字节数,包括totalBytes 本身的长度。

  • elemNum:占 2 字节,用于存放列表包含的 entry 个数。其意义与 zipList 中 zllen 的相同。

entries

​ 与 zipList 的 entry 结构相比,listPack的 entry 结构发生了较大变化。最大的变化就是没有了记录前一个 entry 长度的 prevlength,而增加了记录当前entry 长度的 element-total-len。而这个改变仍然可以实现逆序遍历,但却避免了由于在列表中间修改或插入 entry 时引发的级联更新。

entry

entry 仍由三部分构成:

  • encoding:该部分用于标志后面的 data 的具体类型。如果 data 为整数类型,encoding长度可能会是 1、2、3、4、5 或 9 字节。不同的字节长度,其标识位不同。如果 data为字符串类型,则 encoding 长度可能会是 1、2 或 5 字节。data 字符串不同的长度,对应着不同的 encoding 长度。

  • data:真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字节长度不同。

  • element-total-len:该部分用于记录当前 entry 的长度,用于实现逆序遍历。由于其特殊的记录方式,使其本身占有的字节数据可能会是 1、2、3、4 或 5 字节。

end

​ end 只包含一部分,称为 zlend。占 1 个字节,值固定为 255,即二进制位为全 1,表示一个 zipList 列表的结束。

跳跃列表skipList

​ skipList,跳跃列表,简称跳表,是一种随机化的数据结构,基于并联的链表,实现简单,查找效率较高。简单来说跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能。也正是这个跳跃功能,使得在查找元素时,能够提供较高的效率。

​ skipList 采用了随机分配层级方式。即在确定了总层级后,每添加一个新的元素时会自动为其随机分配一个层级。这种随机性就解决了节点序号与层级间的固定关系问题。

img

​ skipList 指的就是除了最下面第 1 层链表之外,它会产生若干层稀疏的链表,这些链表里面的指针跳过了一些节点,并且越高层级的链表跳过的节点越多。在查找数据的时先在高层级链表中进行查找,然后逐层降低,最终可能会降到第 1 层链表来精确地确定数据位置。在这个过程中由于跳过了一些节点,从而加快了查找速度。

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

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

相关文章

MySQL学习笔记(十四)索引失效有哪些情况?

1.表和数据 CREATE TABLE t_user (id bigint(32) NOT NULL AUTO_INCREMENT,user_name varchar(40) DEFAULT NULL COMMENT 用户名,user_code varchar(40) DEFAULT NULL COMMENT 用户编号,phone varchar(11) DEFAULT NULL COMMENT 电话,age tinyint(3) DEFAULT NULL COMMENT 年龄…

微机----------------中断技术

目录 中断概述中断处理过程中断请求中断响应中断处理8086/8088中断中断类型中断优先级顺序⭐中断向量表中断处理过程中断概述 中断: 当CPU执行程序时,由于随机的事件引起CPU暂时停止正在执行的程序,而转去执行中断服务程序,处理完后又返回被终止的程序断点处继续执行,这个…

Bug系列路径规划算法原理介绍(四)——I-BUG 算法

本系列文章主要对Bug类路径规划算法的原理进行介绍&#xff0c;在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展&#xff0c;整理了13种BUG系列中的典型算法&#xff0c;从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

数学基础从高一开始2、集合间的基本关系

高中数学人教 A 版必修一 集合间的基本关系 学习目标&#xff1a; (1)初步理解集合之间的包含与相等的含义; (2)能识别给定集合的子集和真子案&#xff0c;了解空集含义: (3)能进行自然语言、图形语言(Venn 图)、符号语言闻的转换&#xff0c;积萦抽象思维的经验&#xff0c; …

递归算法(及其衍生算法:缓存,分治,回溯)

文章目录一、初识递归二、缓存三、分治四、回溯一、初识递归 递归函数 终止条件 递归关系 终止条件&#xff1a; 当大问题被拆解成能轻松解决的小问题时&#xff0c;运行终止条件中的逻辑 递归关系&#xff1a; 定义如何将大问题拆解为小问题 例子&#xff1a;小名跑步。 …

这十一个副业在家就可以完成,疫情在家也有收入,建议收藏

2022年&#xff0c;谁还没有副业&#xff1f; 经过两年的疫情&#xff0c;我们都知道没有钱是一件非常不舒服的事情。现在的做法是&#xff1a;主营业务要求稳定&#xff0c;副业要求发展&#xff1b;好好发展副业是硬道理。 在过去的两年里&#xff0c;我一直在探索副业项目…

(六)Vue之数据代理

文章目录回顾Object.defineProperty方法数据属性valueenumerablewritableconfigurable访问器属性get()set(v: any)何为数据代理Vue中的数据代理Vue学习目录上一篇&#xff1a;&#xff08;六&#xff09;Vue之MVVC 回顾Object.defineProperty方法 Object.defineProperty方法的…

Chain Surfase Test - java 链表经典 OJ 面试题 - 巨细

效果图 LeetCode - 206. 反转链表 代码如下&#xff1a; /** Definition for singly-linked list. public class ListNode { int val;ListNode next;ListNode() {}ListNode(int val) { this.val val; }ListNode(int val, ListNode next) { this.val val; this.next next; …

K-Means++代码实现

K-Means代码实现 数据集 https://download.csdn.net/download/qq_43629083/87246495 import pandas as pd import numpy as np import random import math %matplotlib inline from matplotlib import pyplot as plt# 按文件名读取整个文件 data pd.read_csv(data.csv)class…

Minikube – 配置 Jenkins Kubernetes plugin

文章目录1. 配置 kubernetes credentials2. 安装 kubernets plugin3. 安装 docker 插件4. 连接 minikube 集群5. Pod template 参数6. Container template 参数7. 实例7.1 创建一个简单 pod7.2 pod name 变化7.3 指定 namespace7.4 volumes 挂载7.5 Liveness Probe 探针7.6 创建…

关于l2实时接口的功能分析

因为国内外股价的上涨都可以在界面上去查询&#xff0c;所以公司能准确地判断股价上涨&#xff0c;并适时买入、卖出&#xff0c;以此获得一定的利润。 l2实时接口还可以把以往的数据表示成一条折线&#xff0c;让公司在进行分析时更形象、更有参考意义。在连接界面后&#xf…

[附源码]Python计算机毕业设计Django校园订餐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

星环科技TDS 2.4.0 发布: 数据开发、数据治理、数据运营套件能力再次升级

近日&#xff0c;星环科技大数据开发工具 Transwarp Data Studio 2.4.0版本重磅发布&#xff0c;新版本中数据开发、数据治理、数据运营三大套件能力全部升级&#xff0c;让数据开发更便捷、数据治理更高效、数据运营更智能。本次升级的核心能力如下&#xff1a; 数据开发套件…

【Opencv实战】高手勿入,Python使用Opencv+Canny实现边缘检测以及轮廓检测(详细步骤+源码分享)

前言 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 在这次的案例实战中&#xff0c;我们将使用Python 3和OpenCV。我们将使用OpenCV&#xff0c;因为它是…

谷歌牛人发布小说式《算法图解》,竟被人扒下来,在GitHub开源了

今天给大家带来了一本算法方向的好书&#xff1a;巴尔加瓦&#xff08;Aditya Bhargava&#xff09;老师 著&#xff0c;袁国忠老师译的 《算法图解&#xff1a;像小说一样有趣的算法入门书》&#xff0c;网上有没有开源版本我不知道&#xff0c;我就看他内容不错所以推荐给大家…

蓄电池建模、分析与优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

[附源码]Python计算机毕业设计Django校园运动会管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数据存储,详细讲解

✨数据存储&#xff0c;详细讲解&#x1f49c;数据类型的介绍&#xff1a;&#x1f499;整形的内存存储大小端介绍&#xff1a;&#x1f49b;浮点数的存储&#x1f49c;数据类型的介绍&#xff1a; 1.内置类型&#xff1a; char //字符数据类型&#xff08;1&#xff…

SpringBoot 之 AOP

前言&#xff1a; Spring 三大核心思想是啥&#xff0c;还记得不&#xff1f;IOC&#xff08;控制反转&#xff09;&#xff0c;DI&#xff08;依赖注入&#xff09;&#xff0c;AOP&#xff08;面向切面编程&#xff09;。回顾一下这三个东西&#xff1a; IOC&#xff1a;不考…

Dash初探:如何将Label和Dropdown放在一行

Use Dash! How to display html.Lable and dcc.Dropdown on the same line? 1、目标 下图展示了我想要实现的效果。 数据筛选部分包含了三个筛选条件&#xff1a;日期区间选择器&#xff1b;区域选择器&#xff1b;地市选择器。其中&#xff0c;地市选择器的取值和已选区域…