我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用redis进行分页和排序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用redis进行分页和排序

如何使用redis进行分页和排序?针对这个问题,今天小编总结这篇有关redis的文章,希望帮助更多想学习redis的同学找到更加简单易行的办法。

每个主题下的用户的评论组装好写入Redis中,每个主题会有一个topicId,每一条评论会和topicId关联起来,大致的数据模型如下:          

{ topicId: 'xxxxxxxx', comments: [ { username: 'niuniu', createDate: 1447747334791, content: '在Redis中分页', commentId: 'xxxxxxx', reply: [ { content: 'yyyyyy' username: 'niuniu' }, ... ] }, ... ]}

将评论数据从MySQL查询出来组装好存到Redis后,以后每次就可以从Redis获取组装好的评论数据,从上面的数据模型可以看出数据都是key-value型数据,无疑要采用hash进行存储,但是每次拿取评论数据时需要分页而且还要按createDate字段进行排序,hash肯定是不能做到分页和排序的。

那么,就挨个看一下Redis所支持的数据类型:

1、String: 主要用于存储字符串,显然不支持分页和排序。

2、Hash: 主要用于存储key-value型数据,评论模型中全是key-value型数据,所以在这里Hash无疑会用到。

3、List: 主要用于存储一个列表,列表中的每一个元素按元素的插入时的顺序进行保存,如果我们将评论模型按createDate排好序后再插入List中,似乎就能做到排序了,而且再利用List中的LRANGE key start stop指令还能做到分页。

嗯,到这里List似乎满足了我们分页和排序的要求,但是评论还会被删除,就需要更新Redis中的数据,如果每次删除评论后都将Redis中的数据全部重新写入一次,显然不够优雅,效率也会大打折扣,如果能删除指定的数据无疑会更好,而List中涉及到删除数据的就只有LPOP和RPOP这两条指令,但LPOP和RPOP只能删除列表头和列表尾的数据,不能删除指定位置的数据,(备注:其实还有 LREM命令可以做到删除,但是非常不方便),而且当存在接口高并发访问时,这个list可能会无限延长,且里面的数据会存在很多重复,这就会影响到正常的业务,所以List也不太适合。

4、Set: 主要存储无序集合,无序!排除。

5、SortedSet: 主要存储有序集合,SortedSet的添加元素指令ZADD key score member [[score,member]…]会给每个添加的元素member绑定一个用于排序的值score,SortedSet就会根据score值的大小对元素进行排序,在这里就可以将createDate当作score用于排序。

SortedSet中的指令ZREVRANGE key start stop又可以返回指定区间内的成员,可以用来做分页,SortedSet的指令ZREM key member可以根据key移除指定的成员,能满足删评论的要求,所以,SortedSet在这里是最适合的(时间复杂度O(log(N)))。

所以,需要用到的数据类型有SortSet和Hash,SortSet用于做分页排序,Hash用于存储具体的键值对数据。SortSet结构中将每个主题的topicId作为set的key,将与该主题关联的评论的createDate和commentId分别作为set的score和member,commentId的顺序就根据createDate的大小进行排列。

当需要查询某个主题某一页的评论时,就可主题的topicId通过指令zrevrange topicId (page-1)×10 (page-1)×10+perPage这样就能找出某个主题下某一页的按时间排好顺序的所有评论的commintId。page为查询第几页的页码,perPage为每页显示的条数。

当找到所有评论的commentId后,就可以把这些commentId作为key去Hash结构中去查询该条评论对应的内容。

这样就利用SortSet和Hash两种结构在Redis中达到了分页和排序的目的。

当然,也可以直接只使用SrotedSet类型,而不使用Hash类型,直接将评论存放在member中。

但为什么要将评论和排序放到不同的类型里?其中的好处是,可以对评论设置不同的排序类型,比如按时间的正反序,点赞的正反序,查看次数的正反序等。而这样只需要维护不同的SrotedSet排序,不需要维护多套评论的内容了。

看完上述内容,你们掌握使用redis进行分页和排序的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用redis进行分页和排序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

spark中如何使用groupByKey进行分组排序

今天小编给大家分享一下spark中如何使用groupByKey进行分组排序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。任务
2023-07-05

如何使用Criteria进行分组求和、排序、模糊查询

这篇文章主要为大家展示了“如何使用Criteria进行分组求和、排序、模糊查询”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Criteria进行分组求和、排序、模糊查询”这篇文章吧。Cr
2023-06-29

Java使用LinkedHashMap进行分数排序

分数排序的特殊问题在java中实现排序远比C/C++简单,我们只要让集合中元素对应的类实现Comparable接口,然后调用Collections.sort();方法即可.这种方法对于排序存在许多相同元素的情况有些浪费,明显即使值相等,两个
2023-05-31

如何使用SQL语句在MySQL中进行数据排序和分组?

如何使用SQL语句在MySQL中进行数据排序和分组?在数据库中,我们经常需要对数据进行排序和分组以满足不同的需求。MySQL提供了强大的SQL语句来实现这些操作。本文将介绍如何使用SQL语句在MySQL中进行数据排序和分组,并提供具体的代码
如何使用SQL语句在MySQL中进行数据排序和分组?
2023-12-17

Laravel如何使用latest()和oldest()进行时间戳排序

这篇文章给大家分享的是有关Laravel如何使用latest()和oldest()进行时间戳排序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用 latest() 和 oldest() 进行时间戳排序使用时间戳
2023-06-27

如何在MySQL中对数据进行排序和分组

在MySQL中,可以使用ORDER BY子句对数据进行排序,使用GROUP BY子句对数据进行分组。对数据进行排序:SELECT * FROM table_name ORDER BY column_name ASC/DESC;ASC表示升序
如何在MySQL中对数据进行排序和分组
2024-03-06

如何使用网页软件进行ADO.NET分页

这篇文章主要介绍了如何使用网页软件进行ADO.NET分页,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ADO.NET分页经过长时间的发展,很多用户都很了解ADO.NET分页了
2023-06-17

如何使用 PHP 函数对数据进行排序和过滤?

php 提供了多种函数对数据排序和过滤,包括 sort()(升序)、rsort()(降序)、array_filter()(根据条件过滤)、array_map()(应用操作)和 array_reduce()(累积操作)。利用这些函数,您可以轻
如何使用 PHP 函数对数据进行排序和过滤?
2024-05-03

如何使用Redis和Ruby开发排行榜功能

如何使用Redis和Ruby开发排行榜功能引言:在很多应用中,排行榜功能是一项常见的需求。无论是游戏中的玩家排名、音乐平台的歌曲排行,还是网站的热门帖子榜单,都需要实时的维护和展示排行榜数据。Redis是一款快速、高性能的内存数据库,而Ru
2023-10-22

Java中使用Jedis连接Redis对SortedSet进行排序操作

场景Centos中Redis的下载编译与安装(超详细):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334Redis的启动和关闭(前台启动和后台启动):https://blog
Java中使用Jedis连接Redis对SortedSet进行排序操作
2020-03-24

Redis中如何利用序列化进行数据分片

Redis中可以使用序列化来对数据进行分片。在分片时,可以根据数据键名进行序列化处理,然后根据序列化后的数据进行分片操作。具体步骤如下:自定义序列化方法:首先需要自定义一个序列化方法,将数据进行序列化处理。常用的序列化方法有JSON、Me
Redis中如何利用序列化进行数据分片
2024-04-29

如何理解MySQL的分页和排序技术?

如何理解MySQL的分页和排序技术?概述:MySQL是一个广泛使用的关系型数据库管理系统,它提供了丰富的功能和技术,其中包括了分页和排序技术。分页技术可以用来显示大量数据的部分内容,而排序技术则可以对数据按照特定规则进行排序。在实际应用中,
2023-10-22

Linux中如何使用ps命令输出进行排序

这篇文章主要介绍了Linux中如何使用ps命令输出进行排序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ps命令是理解Linux系统上运行的内容和每个进程使用的资源的关键。了
2023-06-15

编程热搜

目录