05-ZSet数据类型

01、操作命令

添加元素

zadd key1 10 java 20 mysql 30 redis

获取全部元素

zrange key1 0 -1 withscores

zrerange key1 0 -1 withscores

根据分值区间获取元素

zrangebyscore key1 20 30

移除元素

也可以根据score rank删除

zrem key1 php  cpp

统计元素个数

zcard key1

分值递增

zincrby key1 5 python

根据分值统计个数

zcount key1 20 60

获取元素rank

zrank key1  java

获取元素score

zscore key1 java

02、存储(实现)原理

【1】、同时满足以下条件时使用ziplist编码

  • 元素数量小于128个
  • 所有member的长度都小于64字节

在ziplist的内部,按照score排序递增来存储。插入的时候要移动之后的数据。

超过阈值之后,使用skiplist+dict存储。

【2】、skiplist(跳表)

我们每相邻两个节点增加一个指针,让指针指向下下个节点。这样所有新增加的指针连成了一个新的链表,但它包含的节点个数只有原来的一半(下图中是7,19,26)。在插入一个数据的时候,决定要放到那一层,取决于一个算法(在redis中t_zset.c有一个zslRandomLevel这个方法)。

【3】、案例

当我们想查找数据的时候,可以先沿着这个新链表进行查找。当碰到比待查数据大的节点时,再回到原来的链表中的下一层进行查找。

我们想查找23,查找的路径是沿着下图中标红的指针所指向的方向进行的:

  1. 23首先和7比较,再和19比较,比它们都大,继续向后比较。
  2. 但23和26比较的时候,比26要小,因此回到下面的链表(原链表),与22比较。
  3. 23比22要大,沿下面的指针继续向后和26比较。23比26小,说明待查数据23在原链表中不存在 

【4】、 为什么不用AVL树或者红黑树

因为skiplist更加简洁。

03、应用场景

排行榜

id为6001的新闻点击数加1:zincrby hotNews:20190926 1 n6001

获取今天点击最多的15条:zrevrange hotNews:20190926 0 15 withscores

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值