Redis 数据类型 Zset(有序集合)

Redis 常用命令,思维导图 >>>

zsetRedis提供的一个非常特别的数据结构,常用作排行榜等功能,以用户idvalue,关注时间或者分数作为score进行排序。与其他数据结构相似,zset也有两种不同的实现,分别是zipListskipList

底层实现

zset 存储示意图:每个 value 后面都携带一个分数,然后用作排序

跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)。简单说来跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能,正是这个跳跃的功能,使得在查找元素时,跳表能够提供O(logN)的时间复杂度。

看一个有序链表,如下图(最左侧的灰色节点表示一个空的头结点):

在这样一个链表中,如果我们要查找某个数据,那么需要从头开始逐个进行比较,直到找到包含数据的那个节点,或者找到第一个比给定数据大的节点为止(没找到)。也就是说,时间复杂度为O(n)。同样,当我们要插入新数据的时候,也要经历同样的查找过程,从而确定插入位置。

假如我们每相邻两个节点增加一个指针,让指针指向下下个节点,如下图:

这样所有新增加的指针连成了一个新的链表,但它包含的节点个数只有原来的一半。现在当我们想查找数据的时候,可以先沿着这个新链表进行查找。当碰到比待查数据大的节点时,再回到原来的链表中进行查找。比如,我们想查找23,查找的路径是沿着下图中标红的指针所指向的方向进行的:

  • 23首先和7比较,再和19比较,比它们都大,继续向后比较。
  • 但23和26比较的时候,比26要小,因此回到下面的链表(原链表),与22比较。
  • 23比22要大,沿下面的指针继续向后和26比较。23比26小,说明待查数据23在原链表中不存在,而且它的插入位置应该在22和26之间。

将压缩链表和跳跃链表作一个对比吧

List Set Zset 对比

数据结果 是否允许重复元素 是否有序 有序实现方式 应用场景
列表 List 索引下标 时间轴、消息队列
集合 Set 标签、社交
有序集合 Zset 分值 排行榜,社交

应用场景 & 学习总结

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

使用场景:

1、根据时间排序的新闻列表等,

2、 阅读排行榜

常用命令

zadd key score member[{score member}...]
--- 创建或设置指定key对应的有序集合,根据每个值对应的score来排名,升序。例如有命令 zadd key1 10 A 20 B 30 D 40 C;那么真实排名是 A B D C zrem key member
--- 删除指定key对应的集合中的member元素 zcard key
--- 返回指定key对应的有序集合的元素数量 zincrby key increment member
--- 将指定key对应的集合中的member元素对应的分值递增加 increment zcount key min max
--- 返回指定key对应的有序集合中,分值在min~max之间的元素个数 zrank key member
--- 返回指定key对应的有序集合中,指定元素member在集合中排名,从0开始切分值是从小到大升序 zscore key member
--- 返回指定key中的集合中指定member元素对应的分值 zrange key min max [withscores]
--- 返回指定key对应的有序集合中,索引在min~max之间的元素信息,如果带上 withscores 属性的话,可以将分值也带出来 zrevrank key member
--- 返回指定key对应的集合中,指定member在其中的排名,注意排名从0开始且按照分值从大到小降序 zrevrange key start end [withscores]
--- 指定key对应的集合中,分值在 start~end之间的降序,加上 withscores 的话可以将分值以及value都显示出来 zrangebyscore key start end [withscores]
--- 同 zrange命令不同的是,zrange命令是索引在startend范围的查询,而zrangebyscore命令是根据分值在startend之间的查询且升序展示 zrevrangebyscore key max min [withscores] --- 同zrangebyscore命令不同的是,zrangebyscores是根据分值从小到大升序展示,而zrevrangebyscore命令是从max到min降序展示 zremrangebyrank key start end
--- 移除指定key对应集合中索引在start~end之间(包括start和end本身)的元素 zremrangebyscore by min max
--- 同zremrangebyrank命令类似,不同的该命令是删除分值在min~max之间的元素 zinterstore desk-key key-count key...
--- 获取指定数量的key的交集。例如有 key1:{10:A,20:B,30:C},key2{40:B,50:C,60:D},那么命令 zinterstore key3 2 key1 key2 意思就是 将key1 key2这两个集合的交集 赋给key3,如何获取key1与key2的交集呢。 key1中存在 A B C,key2中存在 B C D,那么交集就是 B 和 C,且 B与C对应的score也会叠加,即 key3{B:20+40=60,C:30+50=80} zunionstore desk-key key-count key...
--- 获取指定数量key的并集,例如有 key1{10:A,20:B,30:C},key2{40:B,50:C,60:D},可以看出 A和D不是key1与key2共有的,但是并集中只要存在就会记录进去,然后B与C是共有的,即 并集的结果就是 key3{10:A,B:60,D:60,C:80}

Redis 数据类型 Zset的更多相关文章

  1. redis数据类型--zset

    数据结构: zset是有序的,不运行重复的,带有分值score的 数据结构对比: 操作命令: zadd myzset 10 java 20 python 20 ruby 40 mysql 50 php ...

  2. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  3. Redis数据类型介绍

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  4. redis数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  5. redis笔记总结之redis数据类型及常用命令

    三.常用命令 3.1 字符串类型(string) 字符串类型是Redis中最基本的数据类型,一个字符串类型的键允许存储的数据的最大容量为512MB. 3.1.1 赋值与取值: SET key valu ...

  6. redis底层设计(三)——redis数据类型

    今天我们来看一下redis的数据类型.既然redis的键值对可以保存不同类型的值,那么很自然就需要对键值对的类型进行检查以及多态处理.下面我们将对redis所使用的对象系统进行了解,并分别观察字符串. ...

  7. Redis笔记(二):Redis数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  8. Redis 基础:Redis 数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  9. Redis数据类型及常用命名总结

    Redis数据类型: Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合).  1.String(字符串) ...

  10. Redis(三):Redis数据类型

    Redis数据类型目录导航: Redis五大数据类型 哪里去获取Redis常见数据类型操作命令 Redis键(Key) Redis字符串(String) Redis列表(List) Redis集合(S ...

随机推荐

  1. HBuilder uniapp手机定位

    // 获取当前位置 getPosition: function() { this.GetLocation(function(res) { if (res) { this.longitude = res ...

  2. C语言程序设计基础 实验3 函数

    C语言程序设计基础 实验3 函数   一.实验目的 1. 理解函数的本质:模块化,实现代码复用 2. 掌握函数定义.声明.调用的语法 3. 理解并掌握函数的形参.实参,以及函数调用和返回的过程 4. ...

  3. spacy

    官方文档: https://spacy.io/api Spacy功能简介 可以用于进行分词,命名实体识别,词性识别等等,但是首先需要下载预训练模型 pip install --user spacy p ...

  4. SQL Server 2014 启动时提示:无效的许可证数据,需要重新安装

    路径:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE 双击运行DDConfigCA.exe后,Sql Server 20 ...

  5. h5移动端开发经验积累篇

    h5键盘控制 const el = document.documentElement || document.body const originHeight = el.clientHeight win ...

  6. JDMasking v0.1.0-beta 发布

    JDMasking 全称是jdbc data masking,是一款零代码修改.无重启.基于JDBC的动态数据脱敏软件. JDMasking 主要对实现jdbc的驱动进行字节码的增强,支持对运行中的程 ...

  7. python实现简单猜数字游戏

    #!/usr/bin/env python import os import random import sys import time def yanse(s): print('\033[25;31 ...

  8. 【Leetcode】 剑指offer:链表(简单)--Day02

    剑指Offer 06. 从尾到头打印链表 可借助栈. 或先遍历列表得到元素数,开辟数组空间倒序填入. 剑指 Offer 24. 反转链表 可借助栈: class Solution { public L ...

  9. Konga-Kong网关的权限控制指定消费者

    刚开始陷入了误区了,网上很多参考例子都是如何实现身份证验证,而且看到konga上面配置身份插件的地方基本都有consumer一个配置项,一直纠结在这个如何通过key-auth实现指定的route或者s ...

  10. vue2+element表格拖拽

    1.定义好拖拽元素 ref标识,以及 row-key="id"  (row-key拖拽标识,拖拽后数据不会乱, id为tableDataNew数据对象id) 2.下载cnpm in ...