前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >redis入门知识第8篇-sorted_set数据类型的基本操作

redis入门知识第8篇-sorted_set数据类型的基本操作

作者头像
极客开发者
发布于 2022-01-18 06:36:48
发布于 2022-01-18 06:36:48
55600
代码可运行
举报
文章被收录于专栏:极客开发者极客开发者
运行总次数:0
代码可运行

1. 概述

假设我们现在有这样的需求:我们需要对同类数据进行排序,需要提供一种可以根据自身特征进行排序的方式。于是我们引入今天的类型:sorted_set,也叫做有序集合,通常我们也称为 zset,指的是在 redis 中,通常以 zset add 等命令操作。

有序集合可以保存可排序的数据,在set存储结构的基础之上添加可排序字段。有序集合数据结构如下图所示:

key 代表集合中的元素, score 代表元素对应的排序值。

本篇是该系列文章的第七篇,你可以通过以下链接阅读之前的内容

01-redis入门知识第1篇-redis简介

02-redis入门知识第2篇-redis的安装与测试

03-redis入门知识第3篇-redis的基本操作与数据类型

04-redis入门知识第4篇-redis中的string数据类型与基本的数据存取操作

05-redis入门知识第5篇-hash数据类型与基本操作

06-redis入门知识第6篇-list 类型以及基本操作

07-redis入门知识第7篇-set数据类型的基本操作

2. sorted_set 数据类型的基本操作

2.1. 添加数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zadd key score1 member1 [score2 member2]

2.2. 获取全部数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 顺序排列取数据
zrange key start stop [withscores]
# 倒叙排列取数据
zrevrange key start stop [withscores]

2.3. 删除数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zrem key member [member...]

2.4. 按条件获取数据

相关符号如下:

+inf: 表示大于任何数

-inf: 表示小于任何数

(: 左开区间

): 右开区间

指令格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 正序 根据score查询 
zrangebyscore key min max [withscores] [limit]
# 倒序 根据score查询
zreverangebyscore key min max [withscores] [limit]

查询示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加数据
zadd scores 60 li 85 ww 91 zl 88 lxm 82 xsd 66 cc 100 glz 79 zs
# 查询score为80到任意大的3条数据
zrangebyscore scores 80 +inf withscores limit 0 3
# 查询100602条数据
zrevrangebyscore scores 100 60  withscores limit 0 2

2.5. 按条件删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据索引删除数据
zremrangebyrank key start stop
# 根据score删除数据
zremrangebyscore key min max

2.6. 获取集合总数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取某个键的集合总数
zcard key
# 获取score范围值的集合总数
zcount key min max

2.7. 有序集合的交、并操作

指令格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 将numkey个集合 的交集保存到destination 中,合并之后的新集合中,score值被相加
zinterstore destination numkey key [key1...]     
# 将numkey个集合 的并集保存到destination 中
zunionstore destination numkey key [key1...]

交集操作指令示例

我们先执行以下指令添加测试数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加数据到s1中
zadd s1 50 aa 60 bb 70 cc
# 添加数据到s2中
zadd s2 60 aa 70 bb 90 cc
# 添加数据到s3中
zadd s3 70 aa 70 bb 100 cc

将以上是那个集合的交集保存到 ss 中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 求s1、s2、s3的交集 保存到 ss 中
zinterstore ss 3 s1 s2 s3
# 打印 ss 中的数据
zrange ss 0 -1 withscores

此时可以看到返回的数据如下图所示

此时我们可以看到每一个字段的score值被相加起来。我们还可以指定交叉的元素 取最大值(max)还是 最小值(min),而不是 求和值(sum),如下指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 求 s1、s2、s3 的交集保存到 ss1 中,取交叉元素的最大值
zinterstore ss1 3 s1 s2 s3 aggregate max
# 求 s1、s2、s3 的交集保存到 ss2 中,取交叉元素的最小值
zinterstore ss2 3 s1 s2 s3 aggregate min

分别取 ss1 和 ss2 的结果如下图所示

3. sorted_set 数据类型的扩展操作

3.1. 需求案例

假设有以下的需求

  • 各类资源网站TOP 10排行榜(电影、歌曲、文档、电商、游戏等)
  • 聊天室的活跃度统计
  • 游戏好友亲密度

3.2. 解决方案

使用 有序集合 对所有参与排名的资源建立排序依据,相关操作指令如下

指令格式

  • 获取数据对应索引的排名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据score 值从小到大正向查询 排名
zrank key member
# 根据score 值从大到小倒向查询 排名
zrevrank key member
  • score值获取与修改
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据key和member获取score值
zscore key member
# 对 key 中的 member 元素增加 increment 个单位的 score 值 
zincrby key increment member

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加测试数据
zadd movies 143 aa 97 bb 201 cc

4. sorted_set 类型数据操作的注意事项

  • score 保存的存储空间是64位,如果是整数,数值范围是 -9007199254740992 ~ 9007199254740992
  • score 保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用的时候要慎重
  • sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将会被覆盖,保留最后一次保存的结果

5. sorted_set 应用于处理定时的顺序任务

  • 对于基于时间线限定的任务处理,将处理时间记录为score 值,利用排序功能区分处理的先后顺序;
  • 记录下一个要处理的时间,当到期后处理对应的任务,任务处理完成之后移除redis中对应的记录,并记录下一个要处理的时间;
  • 当新任务加入时,判定并更新下一个要处理的任务时间;
  • 为了提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set。例如一小时内、一天内、一周内、一个月内、季度内、年度内等,操作时逐级提升,将即将操作的若干个任务纳入到1小时内处理的队列中。

redis中获取系统时间的指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
time

6. sorted_set 应用于处理有权重的队列任务

6.1. 普通权重任务的处理

当任务或者消息待处理,形成了任务队列或者消息队列时,对于高优先级的任务要保障对其优先处理。我们利用sorted_set的特征,即可解决这个问题。对于有权重的任务,优先处理权重高的任务,采用score记录权重即可。如下指令

添加测试数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加权重为 4 的id为105订单任务
zadd tasks 4 order:id:105
# 添加权重为 9 的id为425订单任务
zadd tasks 9 order:id:425
# 添加权重为 1 的id为1345订单任务
zadd tasks 1 order:id:345

根据权重从高到低查询任务列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zrevrange tasks 0 -1 withscores

在实际的场景中,我们往往挨条任务取出来处理,使用下面的指令取出第一个任务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zrevrange tasks 0 0 withscores

我们得到的任务元素是 order:id:425 ,任务处理完成之后,将对应元素移除即可,如下指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zrem tasks order:id:425

不过,以上的操作不是原子性(要么全部执行成功要么全部执行失败)的,我们这里暂且不讨论非原子性操作带来的后果,后面的章节会说明。

6.2. 多重权重任务的处理

如果权重条件过多时,需要对排序score值进行处理,保障score值能够兼容2个条件或者多个条件,例如外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单。解决方案如下:

  • 因score长度受限,需要对数据进行截断处理,尤其是时间设置为小时或分钟级别即可
  • 先设定订单列表,后设定发起角色类别,整体score长度必须是统一的,不足则补0。第一排序规则首位不得是0

示例:外贸101,国内102,经理104,员工008。那么员工下的外贸单为101008,经理下的国内订单为102004

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客开发者up 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
​ 机器学习(九) ——构建决策树(离散特征值)
机器学习(九) ——构建决策树(离散特征值) (原创内容,转载请注明来源,谢谢) 一、概述 1、概念 决策树,这个概念是一个很常见的概念,应该是机器学习中最好理解的一个算法。决策树是在已知训练结果
用户1327360
2018/03/07
2.4K0
​ 机器学习(九) ——构建决策树(离散特征值)
用python实现决策树ID3算法,对隐形眼镜类型预测
本节讲解如何预测患者需要佩戴的隐形眼镜类型。 1、使用决策树预测隐形眼镜类型的一般流程 (1)收集数据:提供的文本文件(数据来源于UCI数据库) (2)准备数据:解析tab键分隔的数据行 (3)分析数
机器学习AI算法工程
2018/03/14
1.6K0
用python实现决策树ID3算法,对隐形眼镜类型预测
决策树(二)
有了决策树,我们就可以根据样本的特征值来执行分类。遇到判断节点则递归调用,遇到叶子节点则终止,返回叶子节点的分类标签:
用户6021899
2019/08/14
4340
机器学习--决策树(ID3)算法及案例
1 基本原理 决策树是一个预测模型。它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,每个分支路径代表某个可能的属性值,每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。一般情况下,决策树由决策结点、分支路径和叶结点组成。在选择哪个属性作为结点的时候,采用信息论原理,计算信息增益,获得最大信息增益的属性就是最好的选择。信息增益是指原有数据集的熵减去按某个属性分类后数据集的熵所得的差值。然后采用递归的原则处理数据集,并得到了我们需要的决策树。 2 算法流程
机器学习AI算法工程
2018/03/12
1.8K0
机器学习--决策树(ID3)算法及案例
机器学习--决策树算法(CART)
​ 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。能不能简化模型同时也不至于完全丢失熵模型的优点呢?有!CART分类树算法使用基尼系数 来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。
Kindear
2021/11/24
1.1K0
机器学习--决策树算法(CART)
Python AI 教学 | 决策树算法及应用
决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域。其本质是一颗由多个判断节点组成的树,可以是二叉树或非二叉树。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
短短的路走走停停
2019/07/10
6650
机器学习笔记(四)——决策树的构建及可视化
本文以一个新的数据集(隐形眼镜数据集)为基础实现构建决策树、决策树的保存与加载、利用决策树分类、决策树的可视化,前文的知识不在过多概述,着重介绍这四个方面。
奶糖猫
2020/07/07
2.1K0
机器学习笔记(四)——决策树的构建及可视化
机器学习(四)—决策树
摘要:本文首先浅谈了自己对决策树的理解,进而通过Python一步步构造决策树,并通过Matplotlib更直观的绘制树形图,最后,选取相应的数据集对算法进行测试。
oYabea
2020/09/07
5040
机器学习实战教程(三):决策树实战篇之为自己配个隐形眼镜
原文链接:https://cuijiahua.com/blog/2017/11/ml_3_decision_tree_2.html
圆方圆PYTHON学院
2019/01/03
1.7K0
机器学习实战教程(三):决策树实战篇之为自己配个隐形眼镜
【白话机器学习】算法理论+实战之决策树
如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的, 常见的机器学习算法:
Datawhale
2020/03/04
7130
【白话机器学习】算法理论+实战之决策树
《机器学习实战》 - 决策树
知道如何计算信息增益,我们就可以计算 每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。
yiyun
2022/04/01
7650
《机器学习实战》 - 决策树
python机器学习实战(二)
http://www.cnblogs.com/fydeblog/p/7159775.html
努力努力再努力F
2018/09/11
1.4K0
python机器学习实战(二)
R语言与机器学习(分类算法)决策树算法
决策树定义 首先,我们来谈谈什么是决策树。我们还是以鸢尾花为例子来说明这个问题。 观察上图,我们判决鸢尾花的思考过程可以这么来描述:花瓣的长度小于2.4cm的是setos
机器学习AI算法工程
2018/03/12
2K0
R语言与机器学习(分类算法)决策树算法
机器学习--决策树算法
在生活中,“树”这一模型有很广泛的应用,事实证明,它在机器学习分类和回归领域也有着深刻而广泛的影响。在决策分析中,决策树可以明确直观的展现出决策结果和决策过程。如名所示,它使用树状决策模型。它不仅仅是在数据挖掘中用户获取特定目标解的策略,同时也被广泛的应用于机器学习。
Kindear
2021/10/26
6440
常见面试算法:决策树、随机森林和AdaBoost
决策树(Decision Tree)算法是一种基本的分类与回归方法,是最经常使用的数据挖掘算法之一。我们这章节只讨论用于分类的决策树。
机器学习AI算法工程
2019/10/28
1.3K0
常见面试算法:决策树、随机森林和AdaBoost
【Python机器学习】系列五决策树非线性回归与分类(深度详细附源码)
查看之前文章请点击右上角,关注并且查看历史消息 所有文章全部分类和整理,让您更方便查找阅读。请在页面菜单里查找。 相关内容:(点击标题可查看原文) 第1章 机器学习基础 将机器学习定义成一种通过学习经验改善工作效果的程序研究与设计过程。其他章节都以这个定义为基础,后面每一章里介绍的机器学习模型都是按照这个思路解决任务,评估效果。 第2章 线性回归 介绍线性回归模型,一种解释变量和模型参数与连续的响应变量相关的模型。本章介绍成本函数的定义,通过最小二乘法求解模型参数获得最优模型。 第3章 特征提取与
量化投资与机器学习微信公众号
2018/01/29
2K0
【机器学习实战】第3章 决策树
第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=
片刻
2018/01/05
1.1K0
【机器学习实战】第3章 决策树
【Python机器学习实战】决策树和集成学习(二)——决策树的实现
摘要:上一节对决策树的基本原理进行了梳理,本节主要根据其原理做一个逻辑的实现,然后调用sklearn的包实现决策树分类。
冬夜先生
2021/09/08
9410
【机器学习】决策树
本文介绍了 ID3,C4.5,CART三种基本的决策树模型。首先介绍了决策树的特征选择,包括信息增益,信息增益率、基尼指数、最小均方差分别对应分类树ID3、C4.5、CART、回归树CART。然后介绍了决策树建树的一般流程、对比分类树和回归树建树的区别。最后介绍了树模型中避免过拟合问题的剪枝方法,包括前剪枝和后剪枝。
yuquanle
2020/04/01
6790
【机器学习】决策树
决策树(Decision Tree)ID3算法
决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。
统计学家
2019/04/08
7830
推荐阅读
相关推荐
​ 机器学习(九) ——构建决策树(离散特征值)
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1. 概述
  • 2. sorted_set 数据类型的基本操作
    • 2.1. 添加数据
    • 2.2. 获取全部数据
    • 2.3. 删除数据
    • 2.4. 按条件获取数据
    • 2.5. 按条件删除
    • 2.6. 获取集合总数
    • 2.7. 有序集合的交、并操作
  • 3. sorted_set 数据类型的扩展操作
    • 3.1. 需求案例
    • 3.2. 解决方案
  • 4. sorted_set 类型数据操作的注意事项
  • 5. sorted_set 应用于处理定时的顺序任务
  • 6. sorted_set 应用于处理有权重的队列任务
    • 6.1. 普通权重任务的处理
    • 6.2. 多重权重任务的处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档