List, Set, Ordered-SetHash

前言

本文小结Redis中List,Set,ZSet和Hash四种数据类型的,基本特点,使用场景和实现方式。

一、List

1. 基本特点

a. 作为数组,基于下标索引操作, 但支持正向索引和反向索引;
b. 作为链表, 支持高效插入;
c. 约定FIFO, 作为队列使用; 结合阻塞操作,形成一个单播阻塞队列;
d. 约定FILO, 作为栈使用;

2. 使用场景

a. 静态Top N问题: 其中N中的每个1是一个List,比如保留一个人最近三天的消息,每1天的消息是一个List,然后删除最早的List;
b. 消息队列: 给每个用户创建一个消息队列作为收件箱, 后续从该队列中消费消息。

3. 底层实现

a. 基于双向链表实现, 支持双向遍历, 快速插入和删除;
b. 增加长度属性, llen时间复杂度为O(1);
c. 关于阻塞的具体规则:

  1. 如果client 尝试阻塞多个key, a, b, c, d, 此时b中存在元素, 则立刻返回b中的元素;
  2. 如果多个client尝试阻塞同一个key, 当该key中存在数据时, 会将数据喂给阻塞最久的那个client。一旦client得到数据就会失去优先级。当该client再次阻塞时, 则进入该key相关的阻塞队列中;
  3. 如果client已经在多个key上阻塞, 当其中的第一个key存在数据时, 则直接提供给该client;
  4. Redis执行完每条command之后, 会返回有新数据进入并且存在至少一个block client的List,其中的key按照数据到达时间排序。针对每个key, Redis会根据排队的client, FIFO去服务, 直到key中没有数据,然后继续处理下一个key;

二、Set

1. 基本特点

  1. 不维护插入和删除顺序, 随机读取, 但支持去重;
  2. 集合的基本操作, 并交差补;

2. 使用场景

  1. 去重,保持唯一性场景;
  2. 随机,比如抽奖的细粒度支持,比如奖品和人员数量的匹配度,以及是否允许重复;

3. 实现方式

HashTable
a. 基于hash function对应一个带bucket的数组。读取时的随机性, 基于随机数+数组索引完成; 写入时先通过hash函数定位到bucket,然后通过拉链法解决冲突;
b. 当链表变得很长时,会影响 Redis 的查找性能,为了减小 链表的长度,Redis 采用了 rehash 操作,也就是把扩大当前哈希表的长度。Redis 在 rehash 是不是一次性rehash ,而是采用了渐进式方式,这样可以解决长时间阻塞,在渐进式 rehash 的同时,Redis 在空闲时间也会进行 1Ms 的定时 rehash。

三、Ordered-Set

1. 基本特点

  1. 具备Set的基本特点;
  2. 插入时需要提供score,并基于score排序;
  3. 支持并交差补, 但需要基于score提供聚合方式, 如最大, 最小, 权重, 默认方式为求和;
  4. 更新score时联动更新排序结果;

2. 使用场景

动态topN问题, 比如排行榜,举办比赛时随着赛程的推进每个team的得分在不断更新,影响当时的即时排名。当然这里的动态通常指的是动态score。

3. 实现方式

Dictionary+SkipList
其中Dictionary记录key,SkipList则维护了1个按照score排序的索引,索引指向的目标与Dictionary的目标相同。

四、Hash

1. 基本特点

a. 可以提供类似于对象一样的多字段存储;
b. 对Key-Value的操作,同样可使用于Hash的key;

2. 使用场景

a. 多字段组织管理,部分字段读取;如果是全字段读取, 直接序列化为string再完全读到client即可;
b. 部分字段更新: 比如一篇博客的点赞,评论,转发数量;

3. 实现方式

基于HashTable,与set的不同之处在于set中每个Item只有key,而hash中的item包括key和value。

总结

这里对每种数据类型使用的数据结构做一个小结,其中每种数据结构在数据量比较小时还有些特别的优化,文中暂未涉及(图片中斜体部分)。
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx安装、卸载教程(含Window、Linux版、Docker版)

目录 一、下载 二、Linux版安装 2.1 编译安装之前 2.2 编译安装 2.3 启动Nginx 2.4 关于防火墙 2.5 安装成系统服务 三、Linux版卸载(彻底) 3.1 检查一下Nginx服务是否在运行 3.2 停止Nginx服务 3.3 查找、删除Nginx相关文件 3.4 再使用yum清…

设计模式学习之模板方法模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式设计模式学习之抽象工厂模式设计模式学习之策略模式和简单工厂模式的对比设计模式学习之观察者模式 模板方法模式是行为型设计模式的一…

基于深度学习的目标检测的介绍(Introduction to object detection with deep learning)

物体检测的应用已经深入到我们的日常生活中,包括安全、自动车辆系统等。对象检测模型输入视觉效果(图像或视频),并在每个相应对象周围输出带有标记的版本。这说起来容易做起来难,因为目标检测模型需要考虑复杂的算法和数据集,这些…

回顾分类决策树相关知识并利用python实现

大家好,我是带我去滑雪! 决策树(Decision Tree)是一种基本的分类与回归方法,呈树形结构,在分类问题中,表示预计特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为…

深入了解Promise机制并使用JS实现一个Promise(一)

前言 关于为什么会有Promise以及Promise的一些用法和基本机制可以参考之前的文章JS中的异步与Promise使用整体来说,Promise可以帮助我们很好的解决异步的问题,号称是异步的终极解决方案。在浏览器中Promise是使用C实现的,今天就使用js来实现…

win10系统下安装qt5.12.0软件

一、软件下载 1、Qt开源社区下载 下载地址:https://download.qt.io/archive/qt/5.12/5.12.10/qt-opensource-windows-x86-5.12.10.exe 社区地址: Index of /archive/qt/5.12/5.12.10 2、百度网盘下载 链接:https://pan.baidu.com/s/1Sqi…

四.流程控制语句

1、条件语句 Go 编程语言中 if 条件语句的语法如下: 1、基本形式 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果false 则不执行。 package main import "fmt" fu…

Elasticsearch和Kibana的安装

Elasticsearch和Lucene的关系 Elasticsearch是一个高度可扩展的、开源的、基于 Lucene 的全文搜索和分析引擎。它允许您快速,近实时地存储,搜索和分析大量数据,并支持多租户。 Elasticsearch也使用Java开发并使用 Lucene 作为其核心来实现所…

汽车远程启动程序APP的设计与实现(源码+文档+报告+任务书)

以 CAN (Controller Local Network,简称 CAN)为基础的车辆遥控起动技术,通过将车辆的 PBD接口与车辆的 CAN总线相连,并与相应的控制系统相连,实现对车辆遥控启动。 此系统主要使用了Java、Android Studio、 MySQL数据…

蓝桥杯专题-试题版-【完美的代价】【芯片测试】【序列求和】【杨辉三角形】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

如何查看阿里云https账号密码

克隆git上的项目时出现身份验证,此时需要阿里云https密码 查看阿里云https密码:

MATLAB | 如何使用MATLAB获取顶刊《Nature》全部绘图(附带近3年全部图像)

我出了如何使用MATLAB获取期刊《Cell》全部绘图,立马就有粉丝问《Nature》、《Sience》、《PNAS》啥的会不会安排,这期就给大家安排《Nature》全部绘图获取,之后其他期刊也会慢慢安排,但是不会一次性全出完(毕竟不能抓住一个主题就…