zset
是redis
中常用的数据结构,一般使用场景是有序集合,排行榜等有序的需求我们会考虑使用。
背景: 最近也是做了相关的需求,用户发动态,将最新动态中的图片,视频或音频资源收集起来,列表中会展示用户最新4条动态的资源缩略图。因为动态还有个审核,所以 一般采集的时候会按审核的时间点采集,但展示却得按照创建时间展示。因此采用了zset的方案,score的值为创建时间,当审核完成时,会将该动态的资源信息以member存储至 zset中,取的时候,按照score(创建时间)由大到小读取
方案实施
- 存储,简单使用
zadd
命令,将动态资源信息(一个结构体,json格式化后以字符串形式)存储至zset
中,createdAt
为score
|
|
- 维持
zset
大小,因为只需要取最新4条动态的资源,因此,对于旧的资源信息,可以删除4名开外的动态信息
|
|
- 获取从大到小顺序的最新4条动态
|
|
不足之处
因为member的值中有url,有类型等信息,zset的member的长度是过大的,这就导致了并不能用上quickList,只能使用上skipList
|
|
当不满足以上的任何一个条件时,会采用skipList,显然,我们的存储是超过64字节的。跳表的相对成本来说,是高于quickList不少的。
数据结构
zset
的底层数据结构有两种,一种是ziplist(压缩列表)
,一种是skiplist(跳表)
ziplist(压缩列表)
skiplist(跳表)
常用命令
ZADD
向有序集合添加一个或多个成员,或者更新已存在成员的分数
|
|
- ZCARD key