redis基本数据结构-有序集合zset

特性

  • 使用哈希表+跳表数据结构存储
  • 每个元素由 分数和字段名 两部分组成

  • 增加元素
zadd  key  score1  member1    [score2  member2   score3  member3 ...]
zadd scores 90 zhangsan   99  lisi  95  wangwu

返回3 (返回写入有序集合中的元素个数)

scores = {90 zhangsan,  99  lisi,  95  wangwu}

  • 修改元素的分数(与增加类似)
zadd  key score  member
zadd  socres   92 zhangsan

scores = {92 zhangsan, 99 lisi,  95 wangwu}

  • 获取元素的分数
zscore   key  member
zscore   scores lisi

返回99

  • 获取排名在某个范围内的元素列表(从小到大的升序)
zrange  key   startRank   endRank   [WITHSCORES]
zrange  scores  0   1   withscores

返回{92  zhangsan,   95  wangwu}

  • 获取排名在某个范围内的元素列表(从大到小降序)
zrevrange  key  startRank  endRank  [WITHSCORES]
zrevrange  scores  0  1  withscores

返回{99  lisi,    95  wangwu}

zrevrange   scores  0   -1  withscores

返回{99  lisi,  95 wangwu, 92 zhangsan}

说明:以上排序中,当score相同时,按照 '0' < '9' < 'A' < 'Z' < 'a' < 'z' 的顺序排序。

  • 获取指定分数范围内的元素
ZRangeByScore   key  min   max  [WITHSCORES]   [LIMIT   offset  count]
zrangebyscore   scores 93  100  withscores   

返回 {99  lisi,  95 wangwu}

zrangebyscore   scores (95  +inf  withscores

返回 {99  lisi}

zrangebyscore  scores 90 100 LIMIT 1  10000

返回 {99  lisi,   95 wangwu}, 跳过了1个(92 zhangsan),返回10000个,但是不足10000个所以只返回了实际个数的元素

  • 增加某个元素的分数
ZIncrBy   key   increment    member
zincrby   scores   5   zhangsan

返回 97 (张三的92 + 5 == 97)

scores =  {97 zhangsan, 99 lisi,  95 wangwu}

  • 获取集合中的元素数量
ZCard   key
zcard  scores

返回3

  • 获取指定分数范围内的元素个数
ZCount   key   min  max
zcount  scores  (95   +inf

返回2 ( (95, +inf)共有2个)

  • 删除一个或多个元素
ZRem   key  member1  [member2   member3 ...]
zrem scores  zhangsan   wagnwu

返回2 (实际删除的元素个数)

scores = {99   lisi}

zrem scores 

返回1,删除scores的所有元素(删除前还剩一个)

  • 按照排名范围删除元素
ZRemRangeByRank   key   startRank   endRank
zadd scores 97  zhangsan   99  lisi   95  wangwu    90  liuwu

scores = { 97 zhangsan, 99 lisi, 95 wangwu, 90 liuwu}

zremrangebyrank   scores   0   2

返回3 (删除了3个)

scores = { 99 lisi}

  • 按照分数范围删除元素
ZRemRangeByScore  key  minScore  maxScore
zadd scores 97  zhangsan  95  wangwu    90  liuwu

scores = { 97 zhangsan, 99 lisi, 95 wangwu, 90 liuwu}

zremrangebyscore  scores   90   96

返回2(实际删除了2个元素)

scores = { 97 zhangsan, 99 lisi}

  • 获得元素的排名(升序)
ZRank   key  member
zrank  scores  lisi

返回1,排名1

zrank  scors  zhangsan

返回0,排名0

  • 获得元素的排名(降序)
ZRevRank   key  member
zrevrank   scores  lisi

返回0,排名0

zrevrank  scores  zhangsan

返回1,排名1

  • 有序集合的交集运算
ZInterStore    destSet   setCounts  zset1  zset2 [zset3 ...]    [WEIGHTS   weight1  weight2 [weight3 ...]]   [AGGREGATE  SUM | MAX | MIN]

参数说明:

destSet: 交集运算结果存放到destSet 有序集合

setCounts:参与运算的集合数量

zset1  zset2 ... :参与运算的集合,setCounts 要与实际参与运算的集合数量一致

WEIGHTS:命令选型,后面接每个set的在进行 SUM 或 MAX  或 MIN 之前先使用weight值对自身的score进行乘法运算,然后再进行SUM | MAX | MIN 运算

AGGRATE:命令选型,后接SUM 集合中相同元素的分数经过weight*score后相加  或  MAX 集合中相同元素的分数经过weight * score后取分数大的那个 或  MIN 集合中相同元素的分数经过weight * score 后取分数小的;

zadd zset1  100 first  200 second

zset1 = {100  first,  200 second}

zadd zset2 10 first  20 second

zset2 = {10 first,  20 second}

zinterstore zset3 2 zset1 zset2  ===  zinterstore  zset3   zset1   zset2   AGGREGATE SUM ===  zinterstore  zset3  WEIGHTS  1  1  AGGREGATE  SUM

zset3 = {110  first,   220  second}

zinterstore  zset3   2   zset1  zset2  WEIGHTS  0.01   1   AGGREGATE  MAX

zset3 = {max(100 * 0.01, 10 * 1) first,    max(200 * 0.01,  20 * 1)  second} ===  {1  first,   2 second}

  • 有序集合的并集运算

与 交集运算 类似,略

ZInterStore    destSet   setCounts  zset1  zset2 [zset3 ...]    [WEIGHTS   weight1  weight2 [weight3 ...]]   [AGGREGATE  SUM | MAX | MIN]

redis基本数据结构-有序集合的更多相关文章

  1. 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表

    python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...

  2. redis 系列14 有序集合对象

    一. 有序集合概述 Redis 有序集合对象和集合对象一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员 ...

  3. Redis学习---Redis操作之有序集合

    有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序. zadd(name, *args, **kw ...

  4. redis:php-redis中有序集合 zset的使用

    ZSET(stored set) 和 set 一样是字符串的集合,不同的是每个元素都会关联一个 double 类型的 score .实现使用的是 skip list 和 hash table , sk ...

  5. redis列表和有序集合

    redis中的list数据类型是可以插入重复数据的,有去重的需求的话可以用redis有序集合数据类型 Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中. 如果某个成员已经是 ...

  6. redis 入门之有序集合

    zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中.如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 ...

  7. redis:order set有序集合类型的操作(有序集合)

    1. order set有序集合类型的操作(有序集合) 有序集合是在无序集合的基础上加了一个排序的依据,这个排序依据叫score,因此声明一个集合为有序集合的时候要加上score(作为排序的依据) 1 ...

  8. (PHP)redis Zset(有序集合 sorted set)操作

    /** * * Zset操作 * sorted set操作 * 有序集合 * sorted set 它在set的基础上增加了一个顺序属性,这一属性在修改添加元素的时候可以指定,每次指定后,zset会自 ...

  9. redis: Zset有序集合类型(七)

    存值:zadd myset 1 one 取值:zrange myset 0 -1 127.0.0.1:6379> zadd myset 1 one #存值 分值为1 (integer) 1 12 ...

  10. 9、Redis五大数据类型---有序集合Zset(sorted set)

    一.简介 zset与set异同 相同之处: 都是没有重复元素的字符串集合 不同之处: 有序集合zset的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排 ...

随机推荐

  1. 腾讯、阿里、B站最新面经汇总,有的妥妥的凉经。

    除了BAT(没错我说的B是B站的B),还有网易.希音科技.美柚等中小厂的最新面经. 这次投稿的同学行文幽默风趣,处处透漏着不成功便搞笑的骚气. 祝他早日上岸,也欢迎大家在评论区讨论这些面试题,有哪些面 ...

  2. 用 C 语言开发一门编程语言 — 跨平台的可移植性

    目录 文章目录 目录 前文列表 实现跨平台的可移植性 使用预处理器指令 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器l> 实现跨平台的可移植性 理想情况下,我希望我的代码可以 ...

  3. 4G EPS 中的 PLMN 选择

    目录 文章目录 目录 前文列表 PLMN 选择 前文列表 <4G EPS 中的系统消息类型> PLMN 选择 UE 开机后的第一件事情就是完成小区搜索,即完成和 eNB 的牵手.在牵手成功 ...

  4. 常回家看看之off_by_one

    off_by_one这个漏洞比较特殊,它不像上一期的堆溢出,可以溢出很多字节,它只能溢出一个字节,在栈里面也可以通过这个漏洞修改返回地址什么的,在堆里面我们主要利用它来修改堆块的大小,形成fake_c ...

  5. DashVector + DashScope升级多模态检索

    本教程在前述教程(DashVector + ModelScope玩转多模态检索)的基础之上,基于DashScope上新推出的ONE-PEACE通用多模态表征模型结合向量检索服务DashVector来对 ...

  6. 使用SQL语句完成数据表的去重工作

    引入问题 可能大家都遇到过这样一种情况,一张表存在若干行数据,只是主键值相同,但是其它字段都是相同的,这就是我们通常所说的数据库重复数据,那我们是如何将这些数据删除呢?现在我们就介绍一种方法来实现数据 ...

  7. go 交叉编译遇到的错误, 有路由方法却找不到。

    panic: 'OrderCancel' method doesn't exist in the controller Controller今天线下能正常编译,到线上却panic了.发现是自己导入了i ...

  8. python-将多个表格的信息合并到一个表格中

    1.环境 代码运行环境:python3.7 相关的库:xlrd.xlwt 2.目的 通过xlrd库读取各个表格的数据,通过xlwt库将读取到的数据写入到一个表格中. 3.实现 在工程目录下,有一个te ...

  9. 还在拼冗长的WhereIf吗?100行代码解放这个操作

    通常我们在做一些数据过滤的操作的时候,经常需要做一些判断再进行是否要对其进行条件过滤. 普通做法 最原始的做法我们是先通过If()判断是否需要进行数据过滤,然后再对数据源使用Where来过滤数据. 示 ...

  10. 剑指Offer-57.二叉树的下一个结点(C++/Java)

    题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 二叉树的中序遍历是左根右,所以如果一个结点的右子 ...