Redis有序集合对象
一.编码
有序集合的编码可以是ziplist或者skiplist。
ziplist编码的有序集合对象使用压缩列表作为底层实现,每一个集合元素使用紧挨在一起的两个压缩列表节点来保存。第一个节点保存元素的成员(member),而第二个元素则保存元素的分值(score)。
127.0.0.1:6379> zadd price 8.5 apple 5.0 banana 6.0 cherry
(integer) 3
- 使用ziplist压缩列表编码
如果price键的值对象使用的是ziplist编码,那么这个值的对象和压缩列表如下图:
注意:Redis5.0版本后使用listpack替代了ziplist Redis哈希对象(listpack介绍)-CSDN博客
- 使用skiplist编码
skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳跃表。字典和跳跃表都会使用到。
typedef struct zset {dict *dict;zskiplist *zsl;
} zset;
zset结构中的zsl跳跃表按分值从小到大保存了所有集合元素,每一个跳跃表节点保存了一个集合元素:跳跃表的节点的object属性保存了元素的成员,而跳跃表节点的score属性则保存了元素的分值。通过这个跳跃表,程序程序可以对有序集合进行范围查询操作,比如:zrank,zrange等命令就是基于跳跃表的API实现的。
而zset结构中的dict字典为有序集合创建了一个成员到分值的映射,字典中的每一个键值对都保存了一个集合元素:字典中的键保存了元素成员,而字典中的值保存了元素的分值。通过这个字典,程序可以通过O(1)复杂度查找给定成员的分值,zscore命令就是根据这一特性实现的。而很多其他有序集合的命令都是通过这一特性实现的。
有序集合每一个成员都是一个字符串对象,而每一个元素的分值都是一个double类型的浮点数。
虽然zset结构同时使用跳跃表和字典来保存有序集合元素,但这两种数据结构都通过指针来共享相同元素的成员和分值,所以同时使用跳跃表和字典老保存有序集合元素不会产生任何重复成员和分值,也不会因此而浪费额外的内存。
为什么有序集合需要同时使用跳跃表和字典来实现?
在理论上,有序集合可以单独使用字典或者跳跃表来实现。但是,无论是单独使用跳跃表还是字典,在性能上会比同时使用字典和跳跃表有所降低。
如果只使用字典来实现有序集合,虽然可以在O(1)时间复杂度内找到对应成员的分值。但是,因为字典是无序的方式来保存元素。所以在内存执行范围型操作——比如:zrank,zrange等命令时,需要先将字典中的元素按照分值进行排序,完成排序至少需要O(NlogN)时间复杂度,以及额外的O(N)内存空间来保存排序好的元素。
如果只使用跳跃表来实现有序集合,那么跳跃表执行范围型操作的所有优点会保存下来,但是,根据成员查找分值的操作,会从O(1)的时间时间复杂度提高到O(logN)。
所以为了提高效率,有序集合同时使用了跳跃表和字典两种数据结构了实现。
如果上面price键创建使用的时skiplist编码的有序集合对象,那么这个有序结合对象和zset将会如下图所示:
注意:下图为了展示清楚,重复展示了各个成员和分值,但是实际中,字典和跳跃表会共享元素和分值。
二.编码转换
当有序集合同时满足下面两个条件时,对象使用ziplist编码,redis5.0之后使用listpack编码。
- 有序集合保存的元素个数小于128个。
- 有序集合保存的所有元素成员的长度小于64字节。
当面两个的上限值可以通过配置,zset-max-ziplist-entries选项和zset-max-ziplist-value选项来修改。
三. 有序集合命令的实现
相关文章:

Redis有序集合对象
一.编码 有序集合的编码可以是ziplist或者skiplist。 ziplist编码的有序集合对象使用压缩列表作为底层实现,每一个集合元素使用紧挨在一起的两个压缩列表节点来保存。第一个节点保存元素的成员(member),而第二个元素则保存元素的分值(score)。 127.0.0.…...

【C++数据结构 | 字符串速通】10分钟秒杀字符串相关操作 | 字符串的增删改查 | 字符串与数组相互转换
字符串 by.Qin3Yu 文中所有代码默认已使用std命名空间且已导入部分头文件: #include <iostream> #include <string> using namespace std;概念速览 字符串是一种非常好理解的数据类型,它用于存储和操作文本数据。字符串可以包含任意字符…...

运动重定向:C-3PO
C-3PO: Cyclic-Three-Phase Optimization for Human-Robot Motion Retargeting based on Reinforcement Learning解析 摘要1. 简介2. 相关工作2.1 运动重定向(Motion Retargeting)2.2 强化学习(Reinforcement Learning) 3. 预备知…...

天池SQL训练营(四)-集合运算-表的加减法和join等
-天池龙珠计划SQL训练营 4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 U…...

thinkphp lists todo
来由: 数据库的这个字段我想返回成: 新奇的写法如下: 逻辑层的代码: public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…...
【Flutter】创建应用顶级组件,应用根组件 (学习记录)
前言 在 Flutter 中,应用的顶级组件或根组件通常是在 main() 函数中通过 runApp() 方法创建的。这个组件通常是一个 MaterialApp、CupertinoApp、GetMaterialApp 或其他类似的应用框架组件。 以下是一个创建 MaterialApp 作为根组件的示例: void main()…...

AI材料专题报告:AI革命催生新需求国产替代推动新方向
今天分享的AI系列深度研究报告:《AI材料专题报告:AI革命催生新需求国产替代推动新方向》。 (报告出品方:光大证券) 报告共计:25页 1、算力需求增长催生 800G 光模块需求 算力是数字经济时代新生产力&…...

JVM 分析GC日志
GC日志参数 -verbose:gc 输出gc日志信息,默认输出到标准输出 -XX:PrintGC 输出GC日志。类似:-verbose:gc -XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况 -XX:PrintGCTimeStam…...
阿里云服务器环境配置,ssh免密登录和配置docker
此文章适合ubuntu20.04 64位和ubuntu22.04 64位版本 一.登陆服务器 租完服务器后,首选需要使用本地gitbash或者cmd进入服务器, 命令: ssh rootxxx xxx为服务器公网ip,然后yes,然后输入密码就会进入自己的服务器&am…...

【LeetCode】2621. 睡眠函数
睡眠函数 Promise异步 题目题解 题目 请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1: 输入:millis 100 输出:100 解释: 在 100ms 后此异步…...

网络入门---TCP通信实现
目录标题 前言准备工作 tcpserver.hpp构造函数初始化函数(listen)运行函数(accept) tcpserver.cctcpclient.hpp构造函数初始化函数运行函数(connect) tcpclient.cc问题测试改进一:多进程改进二:多线程改进三:线程池完整代码 前言 在前面的文…...

neuq-acm预备队训练week 8 P2661 [NOIP2015 提高组] 信息传递
题目背景 NOIP2015 Day1T2 题目描述 有 n 个同学(编号为 1 到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。 游戏开始时,每人都…...
《C++新经典设计模式》之第18章 备忘录模式
《C新经典设计模式》之第18章 备忘录模式 备忘录模式.cpp 备忘录模式.cpp #include <iostream> #include <vector> #include <memory> using namespace std;// 保存对象内部状态,必要时恢复 // 在不破坏封装性的前提下,捕获对象的内部…...

OWASP安全练习靶场juice shop-更新中
Juice Shop是用Node.js,Express和Angular编写的。这是第一个 完全用 JavaScript 编写的应用程序,列在 OWASP VWA 目录中。 该应用程序包含大量不同的黑客挑战 用户应该利用底层的困难 漏洞。黑客攻击进度在记分板上跟踪。 找到这个记分牌实际上是&#…...

当使用RSA加密,从手机前端到服务器后端的请求数据存在+
将转成了空格,导致解密出错 将空格转成了...

BUUCTF crypto做题记录(3)新手向
目录 一、Rabbit 二、篱笆墙的影子 三、丢失的MD5 四、Alice与Bob 一、Rabbit 得到的密文:U2FsdGVkX1/ydnDPowGbjjJXhZxm2MP2AgI 依旧是看不懂是什么编码,上网搜索,在侧栏发现Rabbit解码,直接搜索就能有在线解码网站 二、篱笆…...

SpringMVC修炼之旅(2)基础入门
一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…...

matlab 最小二乘拟合空间直线(方法二)
目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理...
ASPICE-汽车软件开发能力评级
Automotive SPICE(简称A-SPICE 或 ASPICE),全称是“Automotive Software Process Improvement and Capacity dEtermination”,即“汽车软件过程改进及能力评定”模型框架。 常被用于评估一家汽车软件供应商的软件开发能力&#x…...

准确!!!在 CentOS 8 上配置 PostgreSQL 14 的主从复制
在 CentOS 8 上配置 PostgreSQL 14 的主从复制,并设置 WAL 归档到特定路径 /home/postgres/archive 的步骤如下: 主服务器配置(主机) 配置 PostgreSQL: 编辑 postgresql.conf 文件: vim /data/postgres/p…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...