redis php list排序,redis如何实现多字段排序

这篇博客介绍了如何在Redis的SortSet数据结构中,通过组合热度和发布时间,创建复合score进行排序,以满足论坛帖子列表按照热度和时间排序的需求,同时兼顾高并发和一天内的数据更新。作者提出使用分数形式存储排序字段,以及结合数据库查询和缓存策略优化性能。
摘要由CSDN通过智能技术生成

redis 有sort set数据结构,但仅仅只能安装score排序,

我想实现不仅按照score排序,还需要按照其他字段排序,

比如按照热度,发布时间排序,应该怎样实现?

就是类似实现mysql中的 select * from topic order by hot desc ,createtime desc这种排序

环境: mysql(数据库) + redis(缓存)

场景: 论坛帖子列表

带分页

需要按照时间/热度/等排序

需要在列表就显示标题跟内容

并发量: 峰值可能会到几万,但持续时间可能也就一天,并且读写都可能比较频繁

回复内容:

redis 有sort set数据结构,但仅仅只能安装score排序,

我想实现不仅按照score排序,还需要按照其他字段排序,

比如按照热度,发布时间排序,应该怎样实现?

就是类似实现mysql中的 select * from topic order by hot desc ,createtime desc这种排序

环境: mysql(数据库) + redis(缓存)

场景: 论坛帖子列表

带分页

需要按照时间/热度/等排序

需要在列表就显示标题跟内容

并发量: 峰值可能会到几万,但持续时间可能也就一天,并且读写都可能比较频繁

redis本身 机制 并不是热衷于 比较复杂的排序,

不过 可以 先做好排序工作,然后存放在 redis列表中,将列表裁剪为指定长度,比如 1000条,Redis只需要保存最新的1000条,每次需要获取最新帖子或者评论的项目范围时,再查库获取放到缓存中

可不可以多个有序集,每个有序集实现一种排序

每天凌晨跑一个脚本让排序好的数据存进redis

每个东西都有他擅长的,要相互结合使用

可以把热度$a,发布时间$b做一个比重当做score,热度占30%

zadd $a*0.3 $user_id zadd $b*0.7 $user_id,然后zrangebyscore

按每种排序方式都排一次序,并将排序结果缓存起来,将排序这种复杂的操作交给DB,或者应用程序,而redis只负责缓存,不负责业务逻辑。毕竟redis只是一个简单的缓存,不能完成像DB那样负责的操作。

Redis用一个Sorted Set解决按两个字段排序的问题,也就是按照热度+时间作为排序字段,关键在于怎么拼接score的问题。这种特点的场景,解决方法是组装一个浮点数,整数部分是热度的值,小数部分是时间。这里要注意的是,redis里面精度应该是小数6位,所以不能把整个日期作为小数部分。例如有这样一组数据:

| 热度 | 时间 |

| 2 | 2016-03-31 13:41:01 |

| 5 | 2016-03-31 13:41:01 |

| 2 | 2016-03-31 13:42:01 |

| 1 | 2016-03-31 13:41:01 |

那么score的值可以组装成:

| 热度 | 时间 | score

| 2 | 2016-03-31 13:41:01 | 2.134101

| 5 | 2016-03-31 13:41:01 | 5.134101

| 2 | 2016-03-31 13:42:01 | 2.134201

| 1 | 2016-03-31 13:41:01 | 1.134101

这样的局限性是每个zset只能存一天的数据

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值