返回顶部
首页 > 资讯 > 精选 >Redis中有序集合的内部如何实现
  • 304
分享到

Redis中有序集合的内部如何实现

2023-06-29 11:06:58 304人浏览 安东尼
摘要

这篇“Redis中有序集合的内部如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Redis中有序集合的内部如何实现”文

这篇“Redis中有序集合的内部如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Redis中有序集合的内部如何实现”文章吧。

有序集合的内部实现

有序集合的内部实现有两种,分别是:压缩列表(ziplist)和跳跃表(skiplist)。接下来,我们分别进行详细的了解。

以压缩列表作为内部实现

当有序集合的元素个数小于zset-max-ziplist-entries(默认为128个),并且每个元素成员的长度小于zset-max-ziplist-value(默认为64字节)的时候,使用压缩列表作为有序集合的内部实现。

每个集合元素由两个紧挨在一起的两个压缩列表结点组成,其中第一个结点保存元素的成员,第二个结点保存元素的分支。压缩列表中的元素按照分数从小到大依次紧挨着排列,有效减少了内存空间的使用。

举个例子,我们使用zadd命令创建一个以压缩列表为实现的有序集合:

127.0.0.1:6379> zadd one-more-zset 1 one 2 two 3 three(integer) 3127.0.0.1:6379> zrange one-more-zset 0 -11) "one"2) "two"3) "three"127.0.0.1:6379> object encoding one-more-zset"ziplist"

以跳跃表作为内部实现

当有序集合的元素个数大于等于zset-max-ziplist-entries(默认为128个),或者每个元素成员的长度大于等于zset-max-ziplist-value(默认为64字节)的时候,使用跳跃表作为有序集合的内部实现。

此时,在有序集合中其实包含了两个结构,一个是跳跃表,另一个是哈希表。

在跳跃表中,所有元素按照从小到大的顺序排列。跳跃表的结点中的object指针指向元素成员的字符串对象,score保存了元素的分数。通过跳跃表,Redis可以快速地对有序集合进行分数范围、排名等操作。

在哈希表中,为有序集合创建了一个从元素成员到元素分数的映射。键值对中的键指向元素成员的字符串对象,键值对中的值保存了元素的分数。通过哈希表,Redis可以快速查找指定元素的分数。

虽然有序集合同时使用跳跃表和哈希表,但是这两种数据结构都使用指针共享元素中的成员和分数,不会额外的内存浪费。

举个例子,我们使用zadd命令创建一个以跳跃表为实现的有序集合:

127.0.0.1:6379> zadd one-more-zset 1 long-long-long-long-long-long-long-long-long-long-long-long-long-long(integer) 1127.0.0.1:6379> zrange one-more-zset 0 -11) "long-long-long-long-long-long-long-long-long-long-long-long-long-long"127.0.0.1:6379> object encoding one-more-zset"skiplist"

内部实现的转换

当一个有序集合是以压缩列表作为内部实现时,再向这个有序集合添加较长的元素成员,或向这个有序集合的元素个数过多时,那么这个有序集合就会转换为以跳跃表作为内部实现。但是,以跳跃表作为内部实现的有序集合不会转换为以压缩列表作为内部实现。

举个例子,我们先创建一个以压缩列表作为内部实现的有序集合:

127.0.0.1:6379> zadd one-more-zset 1 one 2 two 3 three(integer) 3127.0.0.1:6379> zrange one-more-zset 0 -11) "one"2) "two"3) "three"127.0.0.1:6379> object encoding one-more-zset"ziplist"

然后,再向它添加一个较长成员的元素,它就是转换为以跳跃表作为内部实现:

127.0.0.1:6379> zadd one-more-zset 4 long-long-long-long-long-long-long-long-long-long-long-long-long-long(integer) 1127.0.0.1:6379> zrange one-more-zset 0 -11) "one"2) "two"3) "three"4) "long-long-long-long-long-long-long-long-long-long-long-long-long-long"127.0.0.1:6379> object encoding one-more-zset"skiplist"

然后,再把那一个较长成员的元素从有序集合中移除,有序集合依然是以跳跃表作为内部实现:

127.0.0.1:6379> zrem one-more-zset long-long-long-long-long-long-long-long-long-long-long-long-long-long(integer) 1127.0.0.1:6379> zrange one-more-zset 0 -11) "one"2) "two"3) "three"127.0.0.1:6379> object encoding one-more-zset"skiplist"

以上就是关于“Redis中有序集合的内部如何实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Redis中有序集合的内部如何实现

本文链接: https://lsjlt.com/news/324676.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis中有序集合的内部如何实现
    这篇“Redis中有序集合的内部如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Redis中有序集合的内部如何实现”文...
    99+
    2023-06-29
  • Redis中有序集合的内部实现方式的详细介绍
    目录有序集合的内部实现以压缩列表作为内部实现以跳跃表作为内部实现内部实现的转换总结面试官:Redis中基本的数据类型有哪些? 我:Redis的基本数据类型有:字符串(string)、...
    99+
    2024-04-02
  • redis有序集合怎么实现
    redis有序集合(zset)通过哈希表和跳跃表实现,哈希表存储元素和分数映射,而跳跃表按分数排序元素并维护快速导航的指针,支持多种操作,包括添加、删除、更新分数、查找元素和获取排名,优...
    99+
    2024-05-21
    redis
  • Redis有序集合是怎么实现排序的
    Redis有序集合是通过使用有序集合中的分数(score)来实现排序的。在有序集合中,每个成员都会关联一个分数,可以通过这个分数来对...
    99+
    2024-05-07
    Redis
  • Redis有序集合如何使用
    这篇文章主要介绍“Redis有序集合如何使用”,在日常操作中,相信很多人在Redis有序集合如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis有序集合如何使用”...
    99+
    2024-04-02
  • java基于redis有序集合如何实现排行榜
    小编给大家分享一下java基于redis有序集合如何实现排行榜,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言排行榜作为互联网...
    99+
    2024-04-02
  • 如何使用Redis的有序集合实现排行榜功能
    这篇文章给大家分享的是有关如何使用Redis的有序集合实现排行榜功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一个典型的游戏排行榜包括以下常见功能:能够记录每个玩家的分数;能...
    99+
    2024-04-02
  • Python利用redis-py实现集合与有序集合的常用指令操作
    目录集合数据类型的添加操作集合数据类型的删除元素操作获取集合数据类型的所有元素有序集合数据类型的添加操作有序集合数据类型的分数值增加操作有序集合数据类型的排序指令(降序)集合与有序集合相关指令演示小案例集合数据类型的添加...
    99+
    2024-04-02
  • java集合排序如何实现
    Java集合的排序可以通过以下几种方式实现: 使用Collections.sort()方法:对List集合进行排序时,可以使用Co...
    99+
    2023-10-26
    java
  • Yii redis zset有序集合的使用
      和散列存储着键与值之间的映射关系类似,有序集合也存储着成员与分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序地获取(fetch)和扫描(scan)成员和分值的命令。这里介绍一些常用命令,以及在 Yii 中的使用。 ...
    99+
    2015-07-18
    Yii redis zset有序集合的使用
  • redis有序集合命令的介绍
    本篇文章给大家分享的是有关redis有序集合命令的介绍,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Redis 有序集合和集合一样也是stri...
    99+
    2024-04-02
  • k8s中如何部署redis集群
    在Kubernetes中部署Redis集群通常可以通过以下步骤进行: 创建Redis的ConfigMap:在Kubernetes中...
    99+
    2024-04-09
    redis
  • 使用Redis有序集合实现IP归属地查询详解
    工作中经常遇到一类需求,根据 IP 地址段来查找 IP 对应的归属地信息。如果把查询过程放到关系型数据库中,会带来很大的 IO 消耗,速度也不能满足,显然是不合适的。 那有哪些更好的办法呢?为此做了一些尝试...
    99+
    2024-04-02
  • redis如何实现集群
    这篇文章给大家分享的是有关redis如何实现集群的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1.主从复制主从复制原理:从服务器连接主服务器,发送SYNC命令;主服务器接收到SY...
    99+
    2024-04-02
  • k8s部署redis cluster集群的实现
    目录Redis 介绍为什么要用Redis什么是Redis Cluster集群k8s以StatefulSet方式部署redis cluster集群:部署nfs创建pv部署redis初始...
    99+
    2024-04-02
  • jquery中集合如何排序
    在jquery中对集合进行排序的方法:1.新建html项目,引入jquery;2.创建集合,并赋值;3.使用sort()函数对集合排序;具体步骤如下:首先,在新建一个html项目,在项目中引入jquery;<script type=&...
    99+
    2024-04-02
  • redis集群是如何实现的
    redis集群是一种分布式部署模式,允许水平扩展redis实例,通过节点间通信、哈希槽划分键空间、节点选举、主从复制和命令重定向来实现:节点间通信:通过集群总线实现虚拟网络通信。哈希槽:...
    99+
    2024-06-12
    redis 分布式部署
  • Java中逆序遍历List集合的实现
    目录1 问题2 方法3 结语1 问题 手写一个程序,完成List集合对象的逆序遍历 2 方法 创建List接口的多态对象 向创建好list集合添加元素 使用hasPreviou...
    99+
    2023-01-28
    Java 逆序遍历List Java 逆序遍历
  • Redis有序集合类型的常用命令小结
    一、有序集合类型 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序而已。Redis中的有序集合类型,实际上是在集合类型上,为每个元素都关联一个分数,有序实际上说的是分数有序,我们根...
    99+
    2022-06-04
    小结 类型 常用命令
  • php中什么是集群部署?如何实现集群部署?
    随着互联网进入快速发展的时代,各种网站、应用如雨后春笋般出现,人们对于服务的需求越来越高。而随着用户量增加,单一服务器已经无法满足需求,集群部署PHP项目成为解决方案之一。一、什么是集群部署?集群部署是将多台服务器组合在一起,按照特定的方式...
    99+
    2023-05-14
    集群部署 php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作