redis 有sort set数据结构,但仅仅只能安装score排序,
我想实现不仅按照score排序,还需要按照其他字段排序,
比如按照热度,发布时间排序,应该怎样实现?
就是类似实现mysql中的 select * from topic order by hot desc ,createtime desc这种排序
环境: mysql(数据库) + redis(缓存)
场景: 论坛帖子列表
带分页
需要按照时间/热度/等排序
需要在列表就显示标题跟内容
并发量: 峰值可能会到几万,但持续时间可能也就一天,并且读写都可能比较频繁
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只能存一天的数据