集合概念

Set

Set类似于Java中的HashSet 。Redis中的set类型是一种无序集合,集合中的元
素没有先后顺序,并且不可重复。

当需要存储一个列表数据,又不不能出现重复数据时,Set 是一个很好的选择,并且set提供了判断某个成员是否在一个Set集合内的接口,List是没有这种接口的

可以基于set轻易实现交集、并集、差集的操作。Redis 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。这个过程也就是求交集的过程。

Zset

和Set相比,sorted set增加了一个权重参数score, 使得集合中的元素能够按score
进行有序排列,还可以通过score的范围来获取元素的列表。有点像是Java中HashMap和TreeSet的结合体。

其有两种实现方式,分别是ziplist和skiplist

实现方式

当有序集合保存的元素数量小于128个或者有序集合保存的所有元素的长度小于64字节时,Zset选用ziplist实现,其他情况选用skiplist实现;

ziplist - 压缩列表

ziplist,顾名思义压缩列表,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的value,第二个元素保存元素的score;

skiplist - 跳表

跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为logn。

简单说来跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能,正是这个跳跃的功能,使得在查找元素时,跳表能够提供logn的时间复杂度

普通链表

在普通链表中,如果我们要查找某个元素,那么需要从头开始逐个进行比较,直到找到包含数据的那个节点,或者找完所有的节点(没找到)。

  • 这样的话,时间复杂度为O(n);
  • 当我们要插入新数据的时候,也要经历同样的查找过程,从而确定插入位置

跳表

假如我们每相邻两个节点增加一个指针,让指针指向下下个节点,如上图,比如节点是1 - 2 - 3 - 4 - 5,增加节点1 - 3 - 5

这样形成一个新的链表,但它包含的节点个数只有原来的一半1,3,5

  • 当我们想查找数据的时候,可以先沿着这个新链表进行查找。当碰到比待查数据大的节点时,再回到原来的链表中进行查找。
  • 比如查找3,之间可用从1指向3,即可跳过2,当数据量大的时候,只需要查询原有数据量的一半

利用同样的方式,我们可以在上层新产生的链表上,继续为每相邻的两个节点增加一个指针,从而产生第三层链表。

依次类推,当链表足够长的时候,这种多层链表的查找方式能让我们跳过很多下层节点,大大加快查找的速度。

skiplist正是受这种多层链表的想法的启发而设计出来的。实际上,按照上面生成链表的方式,上面每一层链表的节点个数,是下面一层的节点个数的一半,这样查找过程就非常类似于一个二分查找,使得查找的时间复杂度可以降低到O(log n)。

存在问题

这种数据结构可用加快查询速度,但是在插入删除数据是就会出现问题

  • 新插入一个节点之后,就会打乱上下相邻两层链表上节点个数严格的2:1的对应关系。
  • 如果要维持这种对应关系,就必须把新插入的节点后面的所有节点(也包括新插入的节点)重新进行调整,这会让时间复杂度重新蜕化成O(n)。
  • 删除数据也有同样的问题。

Redis-有序集合(Zset)数据结构相关推荐

  1. redis有序集合zset详解

    zset 概述 Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合. 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低 ...

  2. php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

    许多网站都有排行榜的功能,比如球员人气榜单.阅读排行榜,对于一些小网站,通过查数据库就能实现排行榜的功能,但是对于稍微有点用户量而且还是实时排名的网站,使用一些关系型数据库如(MySQL.Oracle ...

  3. redis有序集合(Zset)

    2019独角兽企业重金招聘Python工程师标准>>> Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型 ...

  4. Redis 有序集合(zset)取交集(zinterstore)操作耗时测试

    取交集的场景很多,比如公众号文章显示有多少个好友已读,又或者群聊成员列表显示有多少个好友已经入群.最近遇到一个类似场景,一开始的觉得线上数据量较大,redis 取交集操作时间复杂度在O(N),实时计算 ...

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

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

  6. Redis 为什么这么快? Redis 的有序集合 zset 的底层实现原理是什么? —— 跳跃表 skiplist

    Redis有序集合 zset 的底层实现--跳跃表skiplist Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 ...

  7. PythonRedis 无序集合set、有序集合zset操作

    1.Redis控制台操作无序集合set 无序集合 元素为string类型 元素具有唯一性,不重复 redis操作: 设置 添加元素 SADD key member [member ...] 获取 返回 ...

  8. Redis-07Redis数据结构--有序集合ZSet

    文章目录 概述 有序集合的数据结构 Redis 有序集合的部分命令 spring-data-redis 对有序集合的封装 使用 Spring 操作有序集合 注意 代码 概述 有序集合和集合类似,只是说 ...

  9. redis延迟队列 实现_php使用redis的有序集合zset实现延迟队列

    延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息. 延迟队列的应用场景: 1.新用户注册,10分钟后发送邮件或站内信. 2.用户下单后,30分钟未支付,订单自动作废. 我 ...

  10. Redis有序集合详解

    有序集合和集合类似,只是说它是有序的,和无序集合的主要区别在于每一个元素除了值之外,它还会多一个分数.分数是一个浮点数,在 Java 中是使用双精度表示的,根据分数,Redis 就可以支持对分数从小到 ...

最新文章

  1. 把握芯片科技发展趋势 促进半导体产业创新突破
  2. 13岁女孩因发布JavaScript无限循环代码被捕
  3. NSArray打印汉字的方法
  4. docker log 文件 清理
  5. 删除microsoft_如何从您的Microsoft帐户中删除设备
  6. asp.net中的加密方法
  7. 如何将 Python 的一个类方法变为多个方法?
  8. AngularJS-源码阅读(八.二)
  9. 使用Jenkins自动化部署项目
  10. 博士德霸道软件_霸道+网络版7.0
  11. 软件开发人员是一种很棒的职业选择的五大理由
  12. 阿里云-个人建网站从0到精通(二)-快速搭建网站
  13. wex5 页面跳转
  14. 基于Python的人脸识别(68个识别点)和焦点人物检测
  15. 【心理学】情感心理学-当代思想和传统思想的碰撞(本篇文章将不定期持续更新)
  16. 支付宝玉伯:从前端到体验,如何把格局做大
  17. 【第4天】尊重是最有力的征服
  18. 生产环境数据库开发规范
  19. EEPROM存储芯片24C02
  20. Linux多线程编程之pthread (多线程编程) --- (高级)---原作优秀

热门文章

  1. 实时网速监测app_实时网速安卓下载_实时网速监测安卓app下载-XP软件园
  2. Setup Factory打包注册dll
  3. 外国人申请在中国永久居留服务指南(中英文)
  4. CSS 控制边框样式
  5. 怎样将优酷独播1080P视频KUX格式转换成MP4 1
  6. ios传值给js_深入剖析 iOS 与 JS 交互
  7. 护眼台灯真的管用?全光谱led护眼灯到底值不值得入手
  8. 中资美元债这么膨胀,个人投资者怎么买?
  9. 旋转屏幕猫狗游戏java_java-猫狗继承案例
  10. 马甲线怎么画?如何画出好看的腹肌?